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

Этот прием нужен, когда данные нельзя получить запросом: ответ внешней системы по API, результат сложного расчета в цикле, файл Excel, загруженный пользователем. Ниже — настройка схемы, полный рабочий код, вывод результата не только в табличный документ, но и в таблицу значений, и ошибки, которые встречаются чаще всего.

Когда нужен набор данных объект

СитуацияЧем решать
Данные лежат в базе и получаются запросомНабор данных запрос
Данные приходят из внешней системы (HTTP, файл)Набор данных объект
Результат алгоритма, который не выразить в запросеНабор данных объект
Часть данных из базы, часть — из расчетаЗапрос + объект, связь наборов
Нужна нумерация строк или сортировка по сложному правилуОбъект, заполненный заранее подготовленной таблицей

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

Настройка схемы компоновки

  1. Откройте схему компоновки данных отчета, на вкладке «Наборы данных» добавьте Набор данных — объект.
  2. Заполните Имя объекта, содержащего данные, например ДанныеВнешнейСистемы. Это ключ, по которому процессор найдет таблицу.
  3. Добавьте поля набора: имя поля (оно же путь к данным), заголовок и тип значения. Имена полей должны в точности совпадать с именами колонок таблицы значений.
  4. На вкладке «Ресурсы» объявите числовые поля, по которым нужны итоги.
  5. На вкладке «Настройки» соберите структуру отчета, как обычно.

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

Отчет СКД по таблице значений: данные из внешнего источника и расчета собираются в одну таблицу
Отчет СКД по таблице значений: данные из внешнего источника и расчета собираются в одну таблицу

Передача внешних наборов в ПриКомпоновкеРезультата

Обработчик ПриКомпоновкеРезультата находится в модуле объекта отчета и выполняется на сервере при нажатии «Сформировать». Мы отключаем стандартную обработку, готовим таблицу и сами выполняем компоновку.

1С
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	// Ключ структуры должен совпадать с «Именем объекта» набора в схеме.
	ВнешниеНаборыДанных = Новый Структура;
	ВнешниеНаборыДанных.Вставить("ДанныеВнешнейСистемы", ПодготовитьДанныеОтчета());

	Настройки = КомпоновщикНастроек.ПолучитьНастройки();

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);

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

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

Ключевая строка — ПроцессорКомпоновки.Инициализировать(...): вторым параметром передается структура внешних наборов. Ключ — имя объекта из схемы, значение — таблица значений.

КомпоновщикНастроек.ПолучитьНастройки() возвращает настройки уже с учетом пользовательских: отборы и параметры из формы отчета подхватятся сами.

Подготовка таблицы значений

Таблицу удобно собирать в отдельной функции: так ее можно проверить в отладке и переиспользовать. Пример — приход по накладным из табличной части отчета, которую пользователь заполнил из файла, с дополнительной колонкой представления документа.

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

	Данные = Новый ТаблицаЗначений;
	Данные.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
	Данные.Колонки.Добавить("ДокументВнешний", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)));

	Для Каждого СтрокаНакладной Из ЗагруженныеНакладные Цикл

		НоваяСтрока = Данные.Добавить();
		НоваяСтрока.Номенклатура = СтрокаНакладной.Номенклатура;
		НоваяСтрока.Количество = СтрокаНакладной.Количество;
		НоваяСтрока.Сумма = СтрокаНакладной.Сумма;
		НоваяСтрока.ДокументВнешний = СтрШаблон("Накладная № %1 от %2",
			СтрокаНакладной.Номер, Формат(СтрокаНакладной.Дата, "ДФ=dd.MM.yyyy"));

	КонецЦикла;

	Возврат Данные;

КонецФункции

Здесь ЗагруженныеНакладные — табличная часть отчета. Так же можно заполнять таблицу из ответа HTTP-сервиса, прочитанного JSON или результата расчета.

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

Связь набора объект с запросом

Набор данных объект можно связать с обычным запросом. На вкладке «Связи наборов данных» укажите источник (например, запрос по остаткам), приемник (объект) и выражения связи по общему полю Номенклатура. Связь работает как левое соединение от источника к приемнику.

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

Вывод результата в таблицу значений

Иногда отчет не нужно показывать: результат компоновки требуется для дальнейшей обработки или выгрузки. Тогда макет строится генератором для коллекции значений, а вывод делается в таблицу значений.

1С
// Выполняет компоновку и возвращает результат в виде таблицы значений.
Функция РезультатКомпоновкиВТаблицу(Схема, Настройки, ВнешниеНаборыДанных)

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,
		Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

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

	Возврат Результат;

КонецФункции

Для вывода в таблицу значений структура настроек должна быть простой: одна группировка (детальные записи или группировка по полям). Таблицы и вложенные группировки в плоскую коллекцию не ложатся; для дерева используйте ДеревоЗначений.

Типичные ошибки

  • Внешний набор не найден. Не отключена стандартная обработка или ключ структуры не совпадает с «Именем объекта» в схеме (регистр не важен, опечатка — важна).
  • Поле пустое в отчете. Имя колонки таблицы отличается от имени поля набора. Например, колонка КоличествоВнешний, а поле Количество. Переименуйте колонку: Данные.Колонки.Количество.Имя = "КоличествоВнешний".
  • Сортировка по числу как по строке. Колонка создана без типа, в ней лежат строки. Задайте ОписаниеТипов.
  • Отчет работает в конфигураторе, но не в форме БСП. В типовых формах отчетов БСП свой механизм формирования; учитывайте его и проверяйте, что ваш обработчик действительно вызывается.
  • Падает память на больших данных. Объект целиком живет в памяти сервера. Если строк миллионы, фильтруйте на источнике или переносите данные во временное хранилище в базе и стройте отчет запросом.
  • Расшифровка не открывается. В компоновщик макета или процессор не передан объект ДанныеРасшифровки.

Отчеты по данным внешних систем я делаю в связке с интеграцией: сначала налаживаем получение данных по API, затем строим поверх них отчет. Если нужна такая связка, посмотрите интеграцию 1С по API и разработку отчетов на СКД.

Итог

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