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