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