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