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

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

Работа с внешними источниками данных в Системе компоновки данных (СКД) — это мощный инструмент, который позволяет выводить в отчет любые произвольные данные, сформированные программно. Однако программисты часто сталкиваются с ситуацией, когда код выполняется без ошибок, процессор компоновки отрабатывает, но в результате получается пустой табличный документ. Разберем подробно, почему это происходит и как правильно передать ТаблицаЗначений в СКД.

Причина 1. Отсутствие типизации колонок таблицы значений

Это самая распространенная и "коварная" причина. В обычном коде 1С мы привыкли, что колонки таблицы значений могут быть нетипизированными (иметь тип Неопределено). Однако СКД при сопоставлении внешней таблицы со своей схемой данных требует строгого соответствия типов. Если колонка в ТаблицаЗначений не имеет явно заданного типа, компоновщик может просто проигнорировать данные в этой колонке.

Рассмотрим, как правильно типизировать колонки при создании таблицы. Вместо простого добавления колонки по имени, нам необходимо использовать объект ОписаниеТипов. Проанализируем правильный пример формирования структуры таблицы:


// Создаем массив типов для описания
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));

// Создаем описание типов с квалификаторами (для строк это длина)
КвалификаторыСтроки = Новый КвалификаторыСтроки(100);
ОписаниеТиповС = Новый ОписаниеТипов(МассивТипов, , КвалификаторыСтроки);

// Добавляем типизированную колонку
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Поле1", ОписаниеТиповС);

// Теперь заполняем данные
НСтр = ТЗ.Добавить();
НСтр.Поле1 = "Значение1";

Важно: Если ваше поле в СКД должно содержать число или дату, обязательно укажите соответствующий тип при добавлении колонки в ТаблицаЗначений. Без этого механизм компоновки не сможет корректно обработать строки.

Причина 2. Несоответствие имен наборов данных

Выясним, как СКД понимает, какую именно таблицу мы ей передаем. В схеме компоновки данных на закладке "Наборы данных" вы создаете объект типа "Набор данных - объект". У него есть свойство "Имя объекта". Именно это имя должно быть ключом в структуре, которую вы передаете в ПроцессорКомпоновки.Инициализировать().

Посмотрим на типичную ошибку в коде:


// В СКД набор данных называется "МояВнешняяТаблица"
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТЗ", ТЗ); // ОШИБКА: Ключ должен быть "МояВнешняяТаблица"

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


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("МояВнешняяТаблица", ТЗ); // Теперь СКД найдет данные

Причина 3. Обработка события ПриКомпоновкеРезультата

Если вы пишете отчет на управляемых формах и используете стандартную кнопку "Сформировать", платформа ожидает, что данные будут подготовлены в модуле объекта отчета в процедуре ПриКомпоновкеРезультата. Если вы просто написали код формирования в модуле формы, но не установили СтандартнаяОбработка = Ложь, система попытается сформировать отчет стандартно и, естественно, не найдет вашу таблицу.

Рассмотрим алгоритм действий в модуле объекта:

  1. В процедуре ПриКомпоновкеРезультата устанавливаем СтандартнаяОбработка = Ложь.
  2. Формируем нашу ТаблицаЗначений.
  3. Выполняем программную компоновку (создаем макет, инициализируем процессор компоновки и вывода).

Причина 4. Настройки группировок в СКД

Даже если данные успешно переданы и типы совпадают, отчет может остаться пустым, если в настройках компоновки (раздел "Настройки" в СКД) не определено, что именно выводить. Проверьте следующие моменты:

Причина 5. Использование процессора вывода

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


// Создадим и инициализируем процессор вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);

// Выводим весь результат сразу
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Метод Вывести() автоматически управляет началом и окончанием вывода, корректно обрабатывая все иерархии и итоги, заданные в настройках.

Рекомендации по отладке

Если данные все равно не появляются, попробуйте выполнить следующие шаги для диагностики:

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

Подводя итог, можно сказать, что связка СКД и внешней таблицы требует ювелирной точности в именовании объектов и строгой типизации данных. Соблюдение этих правил гарантирует корректный вывод отчета.

← На главную