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