Как исправить ошибку «Не указана дата отчета» при расшифровке в СКД

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

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

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

Почему возникает ошибка при расшифровке?

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

Когда платформа инициирует расшифровку, она создает новый экземпляр настроек. Если значение параметра «Дата» было установлено только «в моменте» формирования первичного отчета и не было зафиксировано в объекте КомпоновщикНастроек.Settings или КомпоновщикНастроек.FixedSettings, то при расшифровке компоновщик обращается к значениям параметров по умолчанию. Если в схеме (XML) значение не задано, возникает ошибка.

Решение 1: Использование фиксированных настроек

Проанализируем наиболее надежный способ — установку параметров в FixedSettings (Фиксированные настройки). Параметры, переданные в этот объект, имеют приоритет над пользовательскими настройками и гарантированно сохраняются при выполнении расшифровки.

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


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

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

Решение 2: Проверка контекста расшифровки

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

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


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

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

Решение 3: Правильная обработка расшифровки в обычных формах

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

  1. Убедитесь, что при формировании отчета объект ДанныеРасшифровкиКомпоновкиДанных инициализирован и передан в ПроцессорКомпоновки.Инициализировать().
  2. В свойстве ДанныеРасшифровки табличного документа на форме должно быть указано имя этой переменной (обычно это строковое значение "ДанныеРасшифровки").
  3. При вызове события расшифровки используйте объект ОбработкаРасшифровкиКомпоновкиДанных.

Пример кода для обработки события на форме:


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

КонецПроцедуры

Рекомендации по настройке Схемы Компоновки Данных

Проанализируем настройки самой схемы (файла .dcs). Иногда ошибка кроется в свойствах самих параметров:

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

← На главную