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

Передача внешних наборов в ПриКомпоновкеРезультата
Обработчик ПриКомпоновкеРезультата находится в модуле объекта отчета и выполняется на сервере при нажатии «Сформировать». Мы отключаем стандартную обработку, готовим таблицу и сами выполняем компоновку.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Ключ структуры должен совпадать с «Именем объекта» набора в схеме.
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ДанныеВнешнейСистемы", ПодготовитьДанныеОтчета());
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедурыКлючевая строка — ПроцессорКомпоновки.Инициализировать(...): вторым параметром передается структура внешних наборов. Ключ — имя объекта из схемы, значение — таблица значений.
КомпоновщикНастроек.ПолучитьНастройки() возвращает настройки уже с учетом пользовательских: отборы и параметры из формы отчета подхватятся сами.
Подготовка таблицы значений
Таблицу удобно собирать в отдельной функции: так ее можно проверить в отладке и переиспользовать. Пример — приход по накладным из табличной части отчета, которую пользователь заполнил из файла, с дополнительной колонкой представления документа.
// Формирует таблицу значений с колонками, совпадающими с полями набора данных объект.
//
// Возвращаемое значение:
// ТаблицаЗначений - данные для внешнего набора «ДанныеВнешнейСистемы».
//
Функция ПодготовитьДанныеОтчета()
Данные = Новый ТаблицаЗначений;
Данные.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Данные.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Данные.Колонки.Добавить("ДокументВнешний", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)));
Для Каждого СтрокаНакладной Из ЗагруженныеНакладные Цикл
НоваяСтрока = Данные.Добавить();
НоваяСтрока.Номенклатура = СтрокаНакладной.Номенклатура;
НоваяСтрока.Количество = СтрокаНакладной.Количество;
НоваяСтрока.Сумма = СтрокаНакладной.Сумма;
НоваяСтрока.ДокументВнешний = СтрШаблон("Накладная № %1 от %2",
СтрокаНакладной.Номер, Формат(СтрокаНакладной.Дата, "ДФ=dd.MM.yyyy"));
КонецЦикла;
Возврат Данные;
КонецФункцииЗдесь ЗагруженныеНакладные — табличная часть отчета. Так же можно заполнять таблицу из ответа HTTP-сервиса, прочитанного JSON или результата расчета.
На проектах я придерживаюсь двух правил: колонки создаю с явным ОписаниеТипов (иначе СКД не всегда корректно определяет тип и сортировку), и не тащу в таблицу лишних колонок. Каждый лишний столбец на сотнях тысяч строк — это память сервера.
Связь набора объект с запросом
Набор данных объект можно связать с обычным запросом. На вкладке «Связи наборов данных» укажите источник (например, запрос по остаткам), приемник (объект) и выражения связи по общему полю Номенклатура. Связь работает как левое соединение от источника к приемнику.
Типичный сценарий: остатки и цены берутся из базы запросом, а плановые показатели или данные маркетплейса приходят таблицей. В итоге пользователь видит один отчет с отборами и группировками, а не две выгрузки.
Вывод результата в таблицу значений
Иногда отчет не нужно показывать: результат компоновки требуется для дальнейшей обработки или выгрузки. Тогда макет строится генератором для коллекции значений, а вывод делается в таблицу значений.
// Выполняет компоновку и возвращает результат в виде таблицы значений.
Функция РезультатКомпоновкиВТаблицу(Схема, Настройки, ВнешниеНаборыДанных)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
Результат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункцииДля вывода в таблицу значений структура настроек должна быть простой: одна группировка (детальные записи или группировка по полям). Таблицы и вложенные группировки в плоскую коллекцию не ложатся; для дерева используйте ДеревоЗначений.
Типичные ошибки
- Внешний набор не найден. Не отключена стандартная обработка или ключ структуры не совпадает с «Именем объекта» в схеме (регистр не важен, опечатка — важна).
- Поле пустое в отчете. Имя колонки таблицы отличается от имени поля набора. Например, колонка
КоличествоВнешний, а полеКоличество. Переименуйте колонку:Данные.Колонки.Количество.Имя = "КоличествоВнешний". - Сортировка по числу как по строке. Колонка создана без типа, в ней лежат строки. Задайте
ОписаниеТипов. - Отчет работает в конфигураторе, но не в форме БСП. В типовых формах отчетов БСП свой механизм формирования; учитывайте его и проверяйте, что ваш обработчик действительно вызывается.
- Падает память на больших данных. Объект целиком живет в памяти сервера. Если строк миллионы, фильтруйте на источнике или переносите данные во временное хранилище в базе и стройте отчет запросом.
- Расшифровка не открывается. В компоновщик макета или процессор не передан объект
ДанныеРасшифровки.
Отчеты по данным внешних систем я делаю в связке с интеграцией: сначала налаживаем получение данных по API, затем строим поверх них отчет. Если нужна такая связка, посмотрите интеграцию 1С по API и разработку отчетов на СКД.
Итог
- Отчет СКД по таблице значений делается через набор данных объект и внешние наборы данных.
- Таблица передается в
ПроцессорКомпоновкиДанных.Инициализироватьструктурой, где ключ — имя объекта из схемы. - Колонки таблицы должны совпадать с полями набора по именам и типам.
- Объект можно связывать с запросом и выводить результат не только в табличный документ, но и в таблицу значений.
- Если данные можно получить запросом — используйте запрос: он быстрее и экономнее по памяти.




