Почему СКД не выводит записи из набора данных и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

1. Проверка флага игнорирования дублирующих записей

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

2. Особенности группировок и пустых значений

Проанализируем ситуацию, когда данные пропадают при включении группировок. Если в записи набора данных поля, по которым строится иерархия или группировка, имеют значение NULL или не заполнены, система может вести себя следующим образом:

  1. Если в настройках группировки установлен автоматический отбор «Исключать пустые», записи с незаполненными ключевыми полями будут отсечены.
  2. Если используется иерархия, а родительский элемент не найден в наборе, дочерние записи могут не отобразиться в общем дереве.

3. Механизмы RLS и права доступа

Посмотрим на ситуацию с точки зрения безопасности. Даже если вы передаете данные программно через «Набор данных - объект», платформа 1С может применять механизм RLS (Record Level Security). Если поле имеет тип ссылки (например, СправочникСсылка.Контрагенты), а у пользователя нет прав на просмотр конкретных элементов, СКД может либо полностью скрыть строку, либо заменить значение на «Объект не найден», что иногда приводит к срабатыванию скрытых фильтров.

4. Программная модификация в ПриКомпоновкеРезультата

Разберем случай, когда отчет формируется программно. Часто в модуле отчета в процедуре ПриКомпоновкеРезультата происходит вмешательство в процесс. Рассмотрим пример типичного кода инициализации:


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

В данном коде важно проверить параметры метода КомпоновщикМакета.Выполнить(). Если в него передаются Настройки, в которых программно установлены скрытые отборы, записи будут отфильтрованы перед выводом. Проверьте содержимое КомпоновщикНастроек.Настройки.Отбор непосредственно перед формированием макета.

5. Роли полей и агрегатные функции в ресурсах

Выясним причину исчезновения строк при использовании ресурсов. Если поле определено как Ресурс, но для него не задана функция (например, Сумма), то при сворачивании данных в группировку значение может стать неопределенным. Также, если формула ресурса при расчете возвращает NULL, это может привести к тому, что вся строка в итоговой таблице будет выглядеть пустой или скрываться в зависимости от настроек оформления.

6. Ошибки в именах полей набора данных

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

7. Диагностика через XML-макет

Если визуальный поиск не помогает, применим метод глубокой диагностики. Мы можем выгрузить промежуточный макет компоновки в XML-файл. Это позволит увидеть, какие именно условия и отборы система наложила на данные «под капотом».


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, МакетКомпоновки);
ТекстМакета = ЗаписьXML.Закрыть();
// Теперь переменную ТекстМакета можно изучить в текстовом редакторе

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

← На главную