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