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