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