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