Как в процедуре ПриКомпоновкеРезультата отчета СКД определить, что выполняется расшифровка

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

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

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

Способ 1. Анализ структуры настроек компоновщика (Быстрый способ)

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

Давайте проанализируем структуру настроек компоновщика в этот момент. Мы увидим, что имя первой группировки принимает значение "Расшифровка". Мы можем использовать этот признак непосредственно в модуле объекта отчета.

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


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

Преимущества этого способа:

  1. Минимум кода — решение реализуется буквально в несколько строк.
  2. Полная автономность — метод работает без привязки к БСП и не требует наличия у отчета собственной формы.

Недостатки:

Способ 2. Использование событий стандартной формы БСП (Рекомендуемый способ)

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

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

Шаг 1. В модуле объекта отчета определим процедуру ОпределитьНастройкиФормы. В ней мы укажем платформе, что хотим обрабатывать событие перед загрузкой настроек в компоновщик:


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

Шаг 2. В этом же модуле объекта разместим обработчик этого события. В параметре Контекст к нам приходит сама стандартная управляемая форма отчета БСП. Мы можем проанализировать параметры этой формы на наличие ключа "Расшифровка" и, в случае его обнаружения, передать этот признак в дополнительные свойства компоновщика настроек:


Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, НастройкиКомпоновщика) Экспорт
    // Контекст — это форма отчета БСП. 
    // Проверяем, запущена ли форма в режиме расшифровки:
    Если Контекст.Параметры.Свойство("Расшифровка") Тогда
        // Записываем флаг в дополнительные свойства компоновщика
        НастройкиКомпоновщика.ДополнительныеСвойства.Вставить("ЭтоРасшифровка", Истина);
    КонецЕсли;
КонецПроцедуры

Шаг 3. Теперь в процедуре ПриКомпоновкеРезультата нам остается лишь прочитать сохраненный параметр из дополнительных свойств компоновщика настроек:


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

Преимущества этого способа:

  1. Это полностью документированный и "чистый" метод разработки в рамках архитектуры БСП.
  2. Код устойчив к обновлениям платформы и конфигурации.
  3. Нет необходимости создавать собственную форму отчета и дублировать стандартный функционал БСП.

Способ 3. Перехват расшифровки через общий модуль "ОтчетыКлиентПереопределяемый"

Если вам требуется не просто определить факт расшифровки, но и полностью переопределить состав передаваемых параметров, изменить настройки компоновщика "на лету" или программно открыть другую форму с особыми параметрами, можно воспользоваться глобальным перехватом расшифровки на клиенте. Для анализа контекста клика и извлечения текущих фильтров подойдёт пример получения значений группировок в расшифровке СКД.

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

Шаг 1. Откроем общий модуль ОтчетыКлиентПереопределяемый и найдем процедуру ОбработкаРасшифровки. Добавим в нее код для нашего отчета:


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

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

Способ 4. Анализ ключа текущего варианта отчета

Еще один косвенный метод основан на анализе структуры дополнительных свойств компоновщика настроек. При формировании стандартного отчета БСП всегда записывает в дополнительные свойства ключ текущего выбранного варианта отчета.

При выполнении расшифровки отчет открывается с динамическими настройками, которые не привязаны к какому-либо конкретному сохраненному варианту. Соответственно, ключ варианта будет пустой строкой или неопределен.

Посмотрим на пример проверки:


КлючВарианта = "";
КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Свойство("КлючТекущегоВарианта", КлючВарианта);

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

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

Резюме

Мы подробно разобрали различные подходы к определению режима расшифровки в модуле СКД отчета. Для быстрых доработок "на скорую руку" вполне сгодится Способ 1 с анализом имени группировки настроек. Однако для крупных коммерческих систем и проектов, где важна стабильность кода при обновлениях, настоятельно рекомендуется использовать Способ 2, полностью задействующий штатные возможности интеграции с Библиотекой стандартных подсистем.

← На главную