Как настроить отбор в форме выбора справочника в СКД по определенному значению?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) разработчики часто сталкиваются с одной неприятной особенностью интерфейса. Допустим, в запросе схемы компоновки мы жестко ограничили выбираемые данные, указав, что нас интересует только номенклатура с типом Товар. Отчет работает корректно, но стоит пользователю открыть настройки отчета и попытаться добавить интерактивный отбор по полю Номенклатура, как при нажатии на кнопку выбора (три точки) перед ним открывается весь справочник целиком. В форме выбора выводятся не только товары, но и услуги, работы, тара и любые другие типы номенклатуры, которые в данном отчете не имеют смысла.

В этой статье мы подробно разберем, почему так происходит, и настроим систему так, чтобы в форме выбора справочника отображались только элементы, соответствующие нашему условию. Мы рассмотрим как стандартное решение средствами самой СКД, так и дополнительные динамические и программные методы.

Выясняем причину поведения платформы

Когда мы накладываем условие на данные в самом запросе СКД, это условие влияет исключительно на выборку записей из базы данных при формировании результата. Однако форма выбора справочника Номенклатура ничего "не знает" о том, какой запрос выполняется в вашем отчете. Когда пользователь нажимает кнопку выбора в поле отбора, платформа 1С просто открывает основную форму выбора для данного объекта метаданных. Чтобы связать контекст нашего отчета и открываемую форму выбора, нам необходимо явно передать параметры фильтрации в динамический список этой формы.

Решение 1. Статическая фильтрация через «Параметры выбора» в СКД

Это самый простой, быстрый и правильный способ, не требующий написания кода. Он полностью реализуется в конструкторе схемы компоновки данных. Разберем процесс настройки по шагам:

  1. Откроем нашу схему компоновки данных (обычно это ОсновнаяСхемаКомпоновкиДанных в составе отчета).
  2. Перейдем на вкладку Наборы данных.
  3. В таблице полей набора данных найдем интересующее нас поле — в нашем примере это Номенклатура.
  4. Найдем колонку Параметры редактирования для этого поля и нажмем кнопку с многоточием.
  5. В открывшемся окне найдем свойство Параметры выбора и нажмем на кнопку редактирования (лупа или три точки).
  6. В появившейся таблице добавим новую строку:
    • В колонке Имя параметра нам необходимо вручную написать специальную конструкцию вида: Отбор.ИмяРеквизитаСправочника. В нашем случае пишем Отбор.ТипНоменклатуры. Префикс Отбор. указывает платформе, что данное значение нужно передать в структуру отбора динамического списка открываемой формы.
    • В колонке Значение нажмем кнопку выбора. В открывшемся окне выбора типа данных выберем самый последний пункт — Предопределенное значение компоновки данных.
    • После этого система позволит нам выбрать конкретное значение из метаданных. Выбираем, например, значение перечисления: Перечисление.ТипыНоменклатуры.Товар.
  7. Нажмем ОК, сохраним настройки и запустим отчет в режиме предприятия.

Теперь при попытке подобрать номенклатуру в отборе отчета платформа автоматически перехватит событие выбора, сформирует структуру отбора и передаст её в форму списка. Пользователь увидит только товары, а услуги и работы будут скрыты.

Решение 2. Динамический отбор через «Связи параметров выбора»

Предыдущее решение отлично работает, если фильтр статический (всегда отсекаются только товары). Но что делать, если критерий отбора должен меняться динамически? Например, если в отчете есть параметр &ВыбранныйТипНоменклатуры, и мы хотим, чтобы в форме выбора номенклатуры показывались элементы именно того типа, который пользователь указал в этом параметре.

Для решения такой задачи проанализируем и настроим механизм связей параметров выбора:

  1. Снова откроем вкладку Наборы данных в СКД и перейдем в Параметры редактирования для поля Номенклатура.
  2. Найдем строку Связи параметров выбора и откроем окно настройки.
  3. Добавим новую строку:
    • В поле Параметр выбора укажем имя отбора для формы, например: Отбор.ТипНоменклатуры.
    • В поле Путь к данным выберем имя нашего параметра СКД или другого доступного поля компоновки (например, Параметры.ВыбранныйТипНоменклатуры).
    • В колонке Режим очистки установим значение Очищать. Это необходимо для того, чтобы при изменении типа номенклатуры в параметрах отчета ранее выбранное (теперь уже некорректное) значение в поле отбора номенклатуры автоматически очищалось.

При такой настройке платформа свяжет два поля на форме, и список выбора будет динамически подстраиваться под текущие настройки отчета.

Решение 3. Программный перехват в конфигурациях на базе БСП

Если наш отчет разрабатывается для современной конфигурации на базе БСП (Библиотека стандартных подсистем), мы можем управлять поведением формы выбора программно. Это особенно актуально, когда логика отбора слишком сложна для визуального конструктора СКД или когда мы разрабатываем отчет в виде расширения и не хотим менять типовой макет.

Для реализации этого метода выполним следующие действия в модуле объекта нашего отчета:

  1. Определим поддержку события изменения параметров выбора в процедуре настройки формы. Добавим следующий код:

Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    // Включаем обработку события определения параметров выбора
    Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры
  1. Опишем сам обработчик события, в котором наложим необходимый отбор на форму выбора программно:

Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
    
    // Проверяем, что выбор происходит именно для нашего поля "Номенклатура"
    ИмяПоля = Строка(СвойстваНастройки.ПолеКД);
    Если ИмяПоля = "Номенклатура" Тогда
        
        // Формируем структуру отбора для динамического списка формы выбора
        СтруктураОтбора = Новый Структура;
        СтруктураОтбора.Вставить("ТипНоменклатуры", ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар"));
        
        // Добавляем наш отбор в параметры выбора
        НовыйПараметр = Новый ПараметрВыбора("Отбор", СтруктураОтбора);
        СвойстваНастройки.ПараметрыВыбора.Добавить(НовыйПараметр);
        
    КонецЕсли;
    
КонецПроцедуры

Этот программный код гарантирует стопроцентное срабатывание отбора в управляемом приложении при использовании стандартных механизмов отчетов БСП.

Важные нюансы и ограничения механизмов отбора

При настройке подобных отборов следует учитывать несколько важных технических особенностей платформы 1С:

Используя данные методы, мы можем значительно повысить эргономику наших отчетов, защитить пользователей от случайного выбора некорректных данных и сделать интерфейс программы удобным и интуитивно понятным.

← На главную