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