Как передать параметры отчета СКД в расшифровку в обычном приложении 1С?

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

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

Почему «теряются» параметры в обычном приложении?

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

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

Способ 1. Визуализация параметров через стандартные настройки

Рассмотрим самый простой метод, который не требует сложного программирования, но накладывает ограничения на дизайн формы. Чтобы параметры гарантированно попадали в расшифровку, они должны быть частью пользовательских настроек компоновщика.

Выясним, как это сделать правильно:

  1. На форме отчета размещаем элемент управления «Табличное поле».
  2. В качестве данных указываем ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки.
  3. В самой схеме СКД на закладке «Параметры» устанавливаем флажок «Включать в пользовательские настройки» для нужных полей.

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

Способ 2. Программный перехват расшифровки

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

Рассмотрим реализацию по шагам. Сначала нам необходимо подготовить форму к приему параметров. В модуле формы в процедуре ПриСозданииНаСервере (или ПриОткрытии для обычных форм) пропишем логику заполнения реквизитов из переданных параметров:


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем, переданы ли параметры расшифровки
    Если Параметры.Свойство("Параметр1") Тогда
        Отчет.Сценарий = Параметры.Параметр1;
    КонецЕсли;
    
    Если Параметры.Свойство("Параметр2") Тогда
        Отчет.ПериодПланирования = Параметры.Параметр2;
    КонецЕсли;
КонецПроцедуры

Затем проанализируем событие обработки расшифровки в табличном документе (реквизит «Результат» на форме). Нам нужно отключить стандартную обработку и вызвать свой алгоритм:


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

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


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

Важные нюансы работы с расшифровкой

Рассмотрим подробнее несколько критических моментов, без которых расшифровка может не заработать даже с вышеуказанным кодом.

1. Инициализация реквизита ДанныеРасшифровки

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


ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Если ДанныеРасшифровки не заполнены, то при клике на ячейку система не поймет, к какому значению относится этот клик.

2. Синхронизация с Компоновщиком

Если вы программно заполняете параметры СКД из реквизитов формы, делайте это непосредственно перед компоновкой результата. Посмотрим на пример:


// Установка параметра в настройках компоновщика
ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
Если ПараметрСКД <> Неопределено Тогда
    ПараметрСКД.Значение = Отчет.Период;
    ПараметрСКД.Использование = Истина;
КонецЕсли;

3. Фиксированные настройки

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

Резюме

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

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

← На главную