При разработке интерфейсов на платформе 1С часто возникает задача отобразить в одном динамическом списке не сами документы, а содержимое их табличных частей. Например, когда нужно собрать «сводный» список товаров из нескольких выбранных реализаций. В процессе реализации этой задачи программисты часто сталкиваются с тем, что запрос в консоли выдает верные данные, а динамический список на форме отображает только часть информации или работает некорректно. Рассмотрим подробнее, как правильно составить запрос и настроить параметры для решения этой задачи.
Первое, с чего стоит начать, — это анализ условия выбора данных. В стандартных запросах 1С для проверки вхождения ссылки в список (массив или список значений) используется оператор В. Рассмотрим типичную ошибку: использование оператора В ИЕРАРХИИ для простого списка ссылок. Этот оператор предназначен для работы с иерархическими справочниками или группами, и его использование для плоского списка документов избыточно и может привести к замедлению работы запроса.
Проанализируем правильную структуру условия ГДЕ. Когда мы обращаемся к табличной части документа, нам нужно фильтровать записи по полю Ссылка, которое в контексте табличной части указывает на документ-владелец. Разберем правильный пример условия:
ГДЕ
РеализацияТоваровУслугТовары.Ссылка В (&СписокРеализаций)
Здесь &СписокРеализаций — это параметр, в который мы должны передать массив ссылок на документы. Если написать В ИЕРАРХИИ, система будет пытаться найти дочерние элементы, что для документов не имеет смысла.
Для того чтобы динамический список корректно отображал данные из табличных частей, нам необходимо выбрать все нужные поля. Выясним причину, по которой может потребоваться группировка данных. Если в разных документах встречаются одинаковые товары по одинаковым ценам и вы хотите видеть их одной строкой, используется СГРУППИРОВАТЬ ПО. Если же задача — видеть каждую строку каждой накладной отдельно, группировка не нужна.
Рассмотрим пример детального запроса, который можно использовать в качестве основы для динамического списка:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
РеализацияТоваровУслугТовары.Цена,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
РеализацияТоваровУслугТовары.СтавкаНДС,
СУММА(РеализацияТоваровУслугТовары.СуммаНДС) КАК СуммаНДС,
СУММА(РеализацияТоваровУслугТовары.СуммаСНДС) КАК СуммаСНДС,
РеализацияТоваровУслугТовары.Ссылка КАК ДокументРеализации
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка В (&СписокРеализаций)
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Номенклатура,
РеализацияТоваровУслугТовары.Цена,
РеализацияТоваровУслугТовары.СтавкаНДС,
РеализацияТоваровУслугТовары.Ссылка
Важное замечание: Обратите внимание на поле РеализацияТоваровУслугТовары.Ссылка. В динамическом списке оно будет служить связью с основным документом. Однако, если вы выводите именно строки товаров, у вас возникнет проблема с уникальностью строк.
Посмотрим на ситуацию, когда запрос в консоли выдает данные по двум документам, а динамический список на форме — только по одному. Это классическая проблема динамического списка, связанная со свойством Основная таблица.
Разберем по шагам, как это исправить:
Документ.РеализацияТоваровУслуг, система будет пытаться сопоставить каждую строку списка с одной уникальной ссылкой на документ. Поскольку в одной реализации много строк товаров, платформа может «схлопнуть» их или отобразить только первую найденную запись.НомерСтроки в паре со Ссылка) и в настройках списка указать их как ключевые поля.&СписокРеализаций устанавливается корректно. Проанализируем код установки параметра в модуле формы:
// Пример программной установки параметра
СписокДокументов = Новый Массив;
СписокДокументов.Добавить(СсылкаНаДок1);
СписокДокументов.Добавить(СсылкаНаДок2);
Список.Параметры.УстановитьЗначениеПараметра("СписокРеализаций", СписокДокументов);
Поскольку динамический список работает на базе системы компоновки данных, иногда жесткое прописывание условия ГДЕ в тексте запроса может конфликтовать с пользовательскими настройками. Проанализируем альтернативный вариант — использование отборов компоновщика.
Вместо того чтобы изменять текст запроса, мы можем оставить запрос «чистым» (выбирающим все данные) и наложить программный отбор:
ЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = МассивСсылок;
ЭлементОтбора.Использование = Истина;
Такой подход часто работает стабильнее, так как платформа сама оптимизирует итоговый SQL-запрос к базе данных, исходя из текущих настроек видимости и сортировки.
Подводя итог, можно сказать: чтобы динамический список корректно отображал товары из нескольких документов, нужно:
Соблюдение этих правил позволит вам создавать информативные и быстрые интерфейсы для работы с большими объемами данных в управляемых формах 1С.