Особливості роботи динамічного списку з довільним запитом
Не в усіх ситуаціях динамічний список може коректно відобразити дані, отримані з довільного запиту. Тому завдання розробника полягає в тому, щоб правильно використовувати можливості, надані динамічним списком. Розглянемо одну з типових ситуацій.
Не в усіх ситуаціях динамічний список може коректно відобразити дані, отримані з довільного запиту. Тому завдання розробника полягає в тому, щоб правильно використовувати можливості, надані динамічним списком. Розглянемо одну з типових ситуацій.
Існує довідник Товари та документ Накладна, який реєструє надходження товарів. У кожній накладній зазначається, від якого постачальника отримано товари.
Для зручності користувачів вирішено показувати у списку товарів також і постачальника, від якого отримано цей товар. Для цього динамічний список товарів використовує довільний запит такого вигляду:

Таблиця довідника Товари зв’язується з табличною частиною документа Накладна, і з таблиці документа вибирається постачальник, від якого отримано цей товар.
Як основну таблицю динамічного списку зазначено таблицю Довідник.Товари. Таким чином, зчитування даних виконуватиметься порціями динамічно. Щоб забезпечити правильність курсору, що зчитує дані, динамічний список додасть до запиту сортування за полями Найменування і Посилання з основної таблиці Довідник.Товари.
Обидва згадані поля вже є в запиті, тому динамічний список додає лише розділ УПОРЯДКУВАТИ ЗА. У результаті запит має такий вигляд:
ВИБРАТИ ДовідникТовари.Посилання ЯК Посилання, ДовідникТовари.ПозначкаВидалення, ДовідникТовари.НапередВизначений, ДовідникТовари.Код, ДовідникТовари.Найменування ЯК Найменування, НакладнаТовари.Посилання.Постачальник З Довідник.Товари ЯК ДовідникТовари ЛІВЕ З’ЄДНАННЯ Документ.Накладна.Товари ЯК НакладнаТовари ЗА (НакладнаТовари.Товар = ДовідникТовари.Посилання) УПОРЯДКУВАТИ ЗА ДовідникТовари.Найменування, ДовідникТовари.Посилання
Тепер подивімося на запит. У запиті зазначено ліве з’єднання основної таблиці довідника Товари з табличною частиною документа Накладна. Це означає, що для кожного рядка з основної таблиці буде виведено його об’єднання з кожним рядком із табличної частини, що задовольняє умову ЗА.
У системі існує два товари та проведено дві накладні, якими оформлено надходження цих товарів.
Таким чином, у процесі виконання цього запиту для товару Молоко буде знайдено один відповідний запис:

А для товару Хліб також буде знайдено один відповідний запис:

У результаті дані, призначені для відображення динамічним списком, матимуть такий вигляд:
|
Список номенклатури | ||
|---|---|---|
|
Посилання |
Найменування |
Постачальник |
|
0acffba3-d075-47d4-9e0a-0b4784733e55 |
Молоко |
Молокозавод |
|
7ebac629-5da1-4ab0-975d-bf245208de03 |
Хліб |
Пекарня |
У цьому випадку динамічний список працює цілком коректно:

Тепер уявімо, що постачальник Хлібокомбінат також поставив нам хліб. У результаті в табличній частині документа Накладна вже буде два записи, що задовольняють умову лівого з’єднання:

У результаті дані, призначені для відображення динамічним списком, матимуть такий вигляд:
|
Список номенклатури | ||
|---|---|---|
| Посилання |
Найменування |
Постачальник |
|
0acffba3-d075-47d4-9e0a-0b4784733e55 |
Молоко |
Молокозавод |
|
7ebac629-5da1-4ab0-975d-bf245208de03 |
Хліб |
Пекарня |
|
7ebac629-5da1-4ab0-975d-bf245208de03 |
Хліб |
Хлібокомбінат |
Таким чином, виявляється, що для двох записів дублюються значення полів, за якими динамічний список виконує сортування для правильної роботи курсору, що зчитує дані:
...УПОРЯДКУВАТИ ЗА ДовідникТовари.Найменування, ДовідникТовари.Посилання
У результаті список починає відображати дані неправильно, оскільки дублюються значення в ключових полях.
Наведений приклад показує найчастішу причину неправильної роботи динамічного списку. З нього випливає таке правило: якщо зазначено основну таблицю динамічного списку, то кількість записів, отримуваних у результаті, не повинна перевищувати кількість записів, що витягуються з таблиці, яку зазначено як основну для динамічного списку.
Якщо ж у результаті виконання запиту кількість рядків, отримуваних запитом з основної таблиці, збільшується, це призводитиме до того, що почнуть дублюватися ключі цих рядків, оскільки ключ будується саме за полями основної таблиці. У результаті список може працювати некоректно.
Позбутися цього, не змінюючи запит, можна, прибравши зазначення основної таблиці. При цьому запит стає повністю статичним і для кожного рядка вибірки генерується сурогатний ключ — просте число.
|
Список номенклатури | |||
|---|---|---|---|
|
Посилання |
Найменування |
Постачальник |
Ключ |
|
0acffba3-d075-47d4-9e0a-0b4784733e55 |
Молоко |
Молокозавод |
1 |
|
7ebac629-5da1-4ab0-975d-bf245208de03 |
Хліб |
Пекарня |
2 |
|
7ebac629-5da1-4ab0-975d-bf245208de03 |
Хліб |
Хлібокомбінат |
3 |
Сурогатний ключ забезпечує унікальну ідентифікацію рядків для динамічного списку, що забезпечує його правильну роботу.

Проте в цьому випадку зникають деякі інтерактивні можливості. Наприклад, не буде можливості додавати до списку нові елементи, оскільки невідомо, що містить список. Поки була зазначена основна таблиця Довідник.Товари, платформа знала, що потрібно додавати елементи довідника Товари. Коли основну таблицю не зазначено, платформа не має такої інформації.