Как определить момент изменения варианта отчета на СКД в управляемых формах 1С?

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

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

Использование серверного события ПриЗагрузкеВариантаНаСервере

Разберем основной платформенный механизм, предназначенный именно для этой цели. В управляемой форме отчета существует стандартный обработчик ПриЗагрузкеВариантаНаСервере(Настройки). Это событие срабатывает каждый раз, когда пользователь выбирает другой вариант отчета из стандартного списка или через меню «Выбрать вариант».

Проанализируем преимущества этого метода: он срабатывает на сервере, что дает нам прямой доступ к объекту компоновки данных и позволяет модифицировать настройки до того, как они будут применены к интерфейсу формы. В параметре Настройки передаются те самые настройки СКД, которые система собирается загрузить.

Посмотрим на пример реализации данного метода в модуле формы:


&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
    
    // Проверяем, какой вариант загружается
    // Для этого можно проанализировать структуру настроек или КлючТекущегоВарианта
    Если ЭтаФорма.КлючТекущегоВарианта = "ВариантБезЛишнихПараметров" Тогда
        
        // Находим нужный параметр в настройках
        Параметр = Настройки.ПараметрыДанных.Элементы.Найти("СкрываемыйПараметр");
        Если Параметр <> Неопределено Тогда
            Параметр.Использование = Ложь;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важный нюанс: изменение настроек в этой процедуре напрямую влияет на то, что увидит пользователь в компоновщике настроек. Однако стоит помнить, что пользовательские настройки (те, что вынесены в шапку отчета) могут загружаться отдельно.

Событие ПослеЗагрузкиВариантаНаСервере

Иногда требуется выполнить действия уже после того, как платформа применила настройки к компоновщику и элементам формы. Для таких случаев используем обработчик ПослеЗагрузкиВариантаНаСервере. Это событие удобно для визуальной настройки формы, например, для управления видимостью элементов управления, которые связаны с параметрами отчета.

Выясним причину, почему одного ПриЗагрузке... бывает недостаточно: в момент загрузки варианта параметры формы могут еще не обновиться. Использование процедуры «После» гарантирует, что мы работаем с уже актуальным состоянием компоновщика в контексте формы.

Универсальный метод: ПриКомпоновкеРезультата в модуле отчета

Если нам не принципиально визуальное скрытие параметров в момент выбора варианта, а важно обеспечить корректное формирование данных, проанализируем метод ПриКомпоновкеРезультата. Эта процедура располагается не в модуле формы, а в модуле самого объекта отчета. Она срабатывает в момент нажатия пользователем кнопки «Сформировать».

Рассмотрим, как программно вмешаться в процесс компоновки:


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

Этот способ считается самым надежным («жестким»), так как он гарантирует применение логики независимо от того, как именно пользователь менял настройки в интерфейсе. Даже если он вручную включил параметр, код в ПриКомпоновкеРезультата может принудительно его отключить или проигнорировать.

Работа с пользовательскими настройками

Часто программисты сталкиваются с тем, что параметр остается видимым в области быстрых настроек, даже если он отключен в основном варианте. Это происходит потому, что настройки СКД разделены на «основные» и «пользовательские». Чтобы полностью убрать параметр, нам необходимо обратиться к коллекции ПользовательскиеНастройки.

Разберем по шагам, как это сделать:

  1. Найдем идентификатор пользовательской настройки для нужного параметра.
  2. Обратимся к коллекции КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
  3. Установим свойство Использование = Ложь или программно удалим элемент отображения.

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

Особенности работы в типовых конфигурациях (БСП)

Если вы работаете в современных конфигурациях (ERP 2, КА 2, БП 3.0), использующих Библиотеку стандартных подсистем (БСП), важно учитывать, что формы отчетов там часто генерируются динамически. В этом случае прямое использование событий формы может быть затруднено.

Проанализируем ситуацию: в БСП для управления вариантами отчетов часто используется расширение формы отчета. Чтобы «поймать» смену варианта, рекомендуется использовать переопределяемые модули или подключаемые обработчики, предусмотренные БСП. В таких системах ключевым реквизитом является КлючВарианта. При его изменении запускается целая цепочка событий, и программное изменение этого реквизита в коде (например, ЭтаФорма.КлючТекущегоВарианта = "НовыйКлюч") автоматически инициирует загрузку соответствующих настроек.

Итоги

Подводя итог, для определения изменения варианта в СКД мы можем использовать:

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

← На главную