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