Как программно получить текущий вариант отчета СКД

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

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

Понимание ключевого свойства: КлючТекущегоВарианта

Основным идентификатором текущего варианта в управляемой форме отчета является свойство формы КлючТекущегоВарианта. Оно содержит строковое имя варианта (если он задан в Конфигураторе) или уникальный идентификатор (GUID), если это пользовательский вариант. Основная проблема заключается в том, что это свойство доступно только в контексте формы, а выполнение основной логики построения отчета обычно происходит в модуле объекта, где КлючТекущегоВарианта напрямую недоступен.

Способ 1. Использование событий формы для перехвата ключа

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

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

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


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

Способ 2. Передача ключа варианта через реквизит отчета

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

  1. В конфигураторе добавим у объекта Отчет новый реквизит с именем КлючТекущегоВарианта (тип: Строка).
  2. В модуле формы отчета будем записывать значение в этот реквизит при каждом обновлении настроек.

&НаСервере
Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
    // Напрямую заполняем реквизит объекта отчета
    Отчет.КлючТекущегоВарианта = КлючТекущегоВарианта;
КонецПроцедуры

После этого в модуле объекта, в обработчике ПриКомпоновкеРезультата, мы сможем обратиться к реквизиту (также полезно знать про применение отбора компоновки к тексту запроса):


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

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

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

Рассмотрим пример кода для БСП:


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

Важный нюанс: Если процедура не вызывается (точка останова не срабатывает), убедитесь, что версия БСП актуальна (выше 2.2) и отчет подключен к подсистеме "Варианты отчетов". В новых версиях БСП (3.0+) логика формирования часто выносится в фоновое задание, поэтому крайне важно передавать ключ варианта через структуру параметров, иначе в фоновом потоке контекст формы будет полностью утерян.

Способ 4. Программный вызов отчета (без формы)

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


// Пример программного формирования
ОбъектОтчета = Отчеты.МойОтчет.Создать();
Схема = ОбъектОтчета.СхемаКомпоновкиДанных;

// Загружаем конкретный вариант по его имени из схемы
КлючВарианта = "ВариантДляБухгалтерии";
ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьВариант(КлючВарианта);

// Теперь КлючТекущегоВарианта зафиксирован в настройках компоновщика
Настройки = ОбъектОтчета.КомпоновщикНастроек.ПолучитьНастройки();

Если метод ЗагрузитьВариант не вызвать, СКД по умолчанию возьмет самый первый вариант (упростить программную работу со схемами поможет СКДБилдер).

Способ 5. Получение "Представления" варианта

Иногда нам мало знать техническое имя (ключ), нужно получить понятное пользователю наименование. Для этого мы можем обратиться напрямую к Схеме компоновки данных, используя полученный ключ:


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

Этот метод работает безотказно для предопределенных вариантов. Для пользовательских вариантов (сохраненных самим пользователем в режиме 1С:Предприятие) необходимо обращаться к ХранилищуВариантовОтчетов, так как их настроек нет в самой схеме .erf или .cf файла.

Особенности внешних отчетов

При работе с внешними отчетами (.erf) процедура получения варианта может усложняться тем, что отчет сначала нужно подключить. Рассмотрим фрагмент кода, который позволяет открыть внешний отчет с автоматическим выбором последнего использованного варианта:


&НаСервере
Функция ПодключитьВнешнийОтчетНаСервере(АдресХранилища)
    ИмяОтчета = ВнешниеОтчеты.Подключить(АдресХранилища);
    
    // Получаем список всех вариантов для этого отчета
    ВариантыОтчета = ХранилищеВариантовОтчетов.ПолучитьСписок("Отчет." + ИмяОтчета);
    
    // Пытаемся загрузить ключ из системных настроек
    КлючОбъекта = "ВнешнийОтчет." + ИмяОтчета + "/КлючТекущегоВарианта";
    ПоследнийКлюч = ОбщегоНазначения.ХранилищеСистемныхНастроекЗагрузить(КлючОбъекта, "");
    
    Возврат Новый Структура("ИмяОтчета, КлючВарианта", ИмяОтчета, ПоследнийКлюч);
КонецФункции

Резюме и рекомендации

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

  1. Для простых случаев в управляемой форме используйте КлючТекущегоВарианта в событии ПриОбновленииСоставаПользовательскихНастроекНаСервере.
  2. Для передачи ключа в модуль объекта (в ПриКомпоновкеРезультата) создайте одноименный реквизит у отчета или используйте ДополнительныеСвойства настроек компоновщика.
  3. В конфигурациях с БСП всегда проверяйте наличие переопределяемых процедур в модуле объекта — это наиболее "чистый" путь с точки зрения архитектуры системы.
  4. Помните, что пользовательские варианты имеют ключи в формате UUID, а встроенные — в виде строковых имен, заданных разработчиком.

Правильное управление вариантами отчетов позволяет создавать гибкие и интеллектуальные инструменты анализа данных, которые подстраиваются под конкретные задачи пользователя в момент нажатия кнопки "Сформировать".

← На главную