СКД в 1С

Выгрузить результат СКД в таблицу значений и дерево значений программно

Коротко

Чтобы программно выгрузить результат отчёта СКД в ТаблицаЗначений или ДеревоЗначений, при формировании макета компоновки передайте в КомпоновщикМакетаКомпоновкиДанных.Выполнить(...) пятым параметром Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), инициализируйте ПроцессорКомпоновкиДанных и выполните вывод через ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений методами УстановитьОбъект(ТаблицаЗначений) и Вывести(ПроцессорКомпоновки, Истина).

Для выгрузки в плоскую ТаблицаЗначений в коллекции Настройки.Структура должна находиться линейная группировка «Детальные записи» (ГруппировкаКомпоновкиДанных без полей группировки) и не должно быть кросс-таблиц (ТаблицаКомпоновкиДанных) или диаграмм. Иерархические отчёты с несколькими уровнями группировок и промежуточными итогами выгружаются тем же процессором вывода в ДеревоЗначений.

Архитектура вывода СКД в коллекцию значений

Стандартный конвейер Системы компоновки данных в 1С:Предприятие 8.3 по умолчанию строит макет для визуального отображения в ТабличныйДокумент. Если результат отчёта нужен в коде — например, чтобы заполнить табличную часть документа, передать рассчитанные ресурсы во внешний API или выполнить постобработку строк, — парсить ячейки табличного документа не нужно. Платформа предоставляет штатный механизм генерации макета и вывода в универсальные коллекции значений.

Конвейер программной выгрузки СКД в коллекцию состоит из четырёх объектов платформы:

  1. Получение актуальных настроек — через КомпоновщикНастроек.ПолучитьНастройки() формируется объект НастройкиКомпоновкиДанных, в котором уже применены пользовательские отборы, параметры и выбранные поля.
  2. Генерация макета для коллекции — метод КомпоновщикМакетаКомпоновкиДанных.Выполнить(...) вызывается с явным указанием пятого параметра Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"). Без него компоновщик создаст обычный табличный макет, который процессор вывода в коллекцию прочитать не сможет.
  3. Исполнение компоновки — объект ПроцессорКомпоновкиДанных инициализируется полученным макетом, выполняет пакетные запросы, связывает наборы данных и вычисляет ресурсы по группировкам.
  4. Заполнение коллекции — объект ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений связывается с целевым приёмником через УстановитьОбъект(...) и переносит строки вызовом Вывести(...).
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// 5-й параметр переключает генератор макета на коллекцию значений
МакетКомпоновки = КомпоновщикМакета.Выполнить(
    СхемаКомпоновкиДанных,
    Настройки,
    ДанныеРасшифровки,
    ,
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);
КомпоновщикМакетаКомпоновкиДанных.Выполнить
СхемаСхемаКомпоновкиДанных — исходная схема отчёта
НастройкиНастройкиКомпоновкиДанных — результирующие настройки
ДанныеРасшифровкиДанныеРасшифровкиКомпоновкиДанных или Неопределено
МакетОформлениядля коллекций значений не используется (пропускается)
ТипГенератораТип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
→ МакетКомпоновкиДанных

Полный код выгрузки результата СКД в ТаблицуЗначений

Ниже приведена готовая серверная функция, которая получает схему компоновки отчёта, накладывает пользовательские настройки (или устанавливает параметры периода и отбора программно) и возвращает заполненную ТаблицаЗначений. Обратите внимание на связку УстановитьОбъект(ТаблицаЗначений) + Вывести(ПроцессорКомпоновки, Истина): второй параметр ВозможностьПрерыванияПользователем = Истина разрешает пользователю прервать долгий вывод комбинацией Ctrl+Break (а свойство ОтображатьПроцентВывода у процессора вывода в коллекцию по умолчанию и так равно Ложь, что безопасно для фоновых заданий и HTTP-сервисов).

&НаСервере
Функция ВыгрузитьОтчетВТаблицуЗначений(СхемаКомпоновкиДанных, ПользовательскиеНастройки = Неопределено) Экспорт

    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(
        Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)
    );
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

    Если ПользовательскиеНастройки <> Неопределено Тогда
        КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ПользовательскиеНастройки);
    КонецЕсли;

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

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

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

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

    Возврат ТаблицаЗначений;

КонецФункции
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений
УстановитьОбъект(Объект)задаёт приёмник: ТаблицаЗначений или ДеревоЗначений
Вывести(ПроцессорКомпоновки, ВозможностьПрерыванияПользователем)выполняет полный цикл вывода и возвращает заполненную коллекцию (2-й параметр по умолчанию Ложь)
ОтображатьПроцентВыводаБулево — свойство показа прогресса вывода
НачатьВывод() / ВывестиЭлемент() / ЗакончитьВывод()методы для поэлементного вывода в цикле
→ ТаблицаЗначений / ДеревоЗначений

Если вызывать этот код внутри обработчика отчёта ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка), создавать новый КомпоновщикНастроекКомпоновкиДанных не требуется — достаточно обратиться к стандартному свойству отчёта Настройки = КомпоновщикНастроек.ПолучитьНастройки().

Требования к структуре настроек и типизации колонок

Генератор ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений накладывает жёсткие архитектурные ограничения на то, какие элементы допустимы в Настройки.Структура и какие типы получат колонки результирующей таблицы:

  • Структура для выгрузки в ТаблицаЗначений: в Настройки.Структура должна быть ровно одна линейная группировка «Детальные записи» (объект ГруппировкаКомпоновкиДанных с пустой коллекцией ПоляГруппировки) либо плоский список без подчинённых группировок, кросс-таблиц (ТаблицаКомпоновкиДанных), диаграмм (ДиаграммаКомпоновкиДанных) и вложенных отчётов. Если в структуре присутствуют кросс-таблица или диаграмма, платформа выбросит исключение «Ошибка генерации макета: Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений» (или «Не поддерживается вывод в таблицу значений»).
  • Явная типизация выводимых полей: имена и ТипЗначения колонок в создаваемой ТаблицаЗначений формируются автоматически по полям из Выбор (Выбранные поля). Если в схеме используется НаборДанныхОбъектСхемыКомпоновкиДанных, вычисляемые поля или произвольные выражения в запросе (например, ВЫБОР КОГДА ... без ВЫРАЗИТЬ), у каждого выводимого поля в схеме должен быть явно задан ТипЗначения. В противном случае колонка в ТЗ получит пустое описание типов или не сможет принять рассчитанные ресурсы.
  • Предварительно созданные колонки приёмника: если вы передаёте в УстановитьОбъект(ТаблицаЗначений) пустую таблицу (Новый ТаблицаЗначений без колонок), процессор вывода сам создаст все колонки из выбранных полей СКД. Но если в ТаблицаЗначений заранее добавлена хотя бы одна колонка вручную, процессор вывода перенесёт данные только по тем колонкам, имена которых точно совпадают с именами полей СКД (с учётом замены точки на пустую строку или по псевдонимам набора данных), а остальные поля проигнорирует.
  • Игнорирование оформления и групп полей: при генерации макета для коллекции значений полностью игнорируются УсловноеОформление, макеты оформления, пользовательские макеты группировок, а также группы (папки) в выбранных полях (ГруппаВыбранныхПолейКомпоновкиДанных).
Чтобы не искать вручную в Конфигураторе, какое именно поле без типа или какая группировка блокирует выгрузку в ТаблицаЗначений, передайте задачу в ИИ Консоль отчётов 1С. Агент проверит схему компоновки данных, настроит типы полей и подготовит модуль объекта с корректной выгрузкой результата.

Как программно подменить структуру настроек перед выгрузкой в ТЗ

На практике разработчик часто вызывает типовой отчёт (например, ведомость по товарам на складах в 1С:ERP или УТ 11), в котором пользователь уже настроил отборы и параметры, но структура варианта по умолчанию построена как кросс-таблица или содержит три уровня вложенных группировок. Если передать такие настройки в ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений напрямую, вызов завершится ошибкой компоновки макета.

Решение — получить результирующие Настройки = КомпоновщикНастроек.ПолучитьНастройки() (сохранив все отборы, параметры и выбранные поля пользователя), программно очистить коллекцию Настройки.Структура и добавить в неё единственную группировку «Детальные записи» с автовыбором полей:

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

// Очищаем сложную структуру (кросс-таблицы, диаграммы, иерархию группировок)
Настройки.Структура.Очистить();

// Добавляем единственную группировку «Детальные записи» (без ПоляГруппировки)
ДетальныеЗаписи = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДетальныеЗаписи.Использование = Истина;

// Переносим в группировку все поля, отмеченные на уровне отчёта
АвтоПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(
    Тип("АвтоВыбранноеПолеКомпоновкиДанных")
);
АвтоПоле.Использование = Истина;

// Если на уровне отчёта Выбор пуст, явно добавляем нужные поля
Если Настройки.Выбор.Элементы.Количество() = 0 Тогда
    МассивИмен = СтрРазделить("Номенклатура,Склад,КоличествоКонечныйОстаток", ",");
    Для Каждого ИмяПоля Из МассивИмен Цикл
        ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(
            Тип("ВыбранноеПолеКомпоновкиДанных")
        );
        ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        ВыбранноеПоле.Использование = Истина;
    КонецЦикла;
КонецЕсли;
ГруппировкаКомпоновкиДанных (Детальные записи)
ПоляГруппировкиостаётся пустой коллекцией — признак детальных записей
Выбор.Элементысодержит АвтоВыбранноеПолеКомпоновкиДанных или явный список ВыбранноеПолеКомпоновкиДанных
Порядок.Элементысортировка строк выгружаемой таблицы значений
→ ЭлементСтруктурыНастроек

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

Выгрузка иерархического отчёта с группировками в ДеревоЗначений

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

&НаСервере
Функция ВыгрузитьОтчетВДеревоЗначений(СхемаКомпоновкиДанных, Настройки) Экспорт

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

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

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

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

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

КонецФункции
Вывод в ДеревоЗначений
ДеревоРезультата.Строкикорневой уровень соответствует верхним группировкам Настройки.Структура
СтрокаДерева.Строкиподчинённые группировки, иерархия справочника и детальные записи
РасположениеОбщихИтоговПоВертикалиРасположениеИтоговКомпоновкиДанных.Нет убирает строку общего итога из корня
→ ДеревоЗначений

Обратите внимание на важную деталь: если в настройках отчёта включён вывод общих итогов (по умолчанию РасположениеИтоговКомпоновкиДанных.Конец или Авто), процессор вывода добавит на верхний уровень ДеревоЗначений отдельную итоговую строку, внутри которой (или рядом с которой) окажутся строки группировок. Установка параметра вывода РасположениеОбщихИтоговПоВертикали = РасположениеИтоговКомпоновкиДанных.Нет делает верхний уровень дерева чистым списком группировок первого уровня.

Сравнение вывода в ТаблицуЗначений, ДеревоЗначений и потокового обхода

В зависимости от структуры исходного отчёта и объёма выборки выбирайте подходящий способ чтения результата СКД:

Критерий Вывод в ТаблицаЗначений Вывод в ДеревоЗначений Поэлементный обход ПроцессорКомпоновки.Следующий()
Допустимая структура в Настройки.Структура Одна группировка «Детальные записи» (или одна плоская группировка без общих итогов) Любая иерархия вложенных группировок (ГруппировкаКомпоновкиДанных) и детальных записей Любая структура, включая кросс-таблицы (ТаблицаКомпоновкиДанных) при стандартном макете
Расчёт ресурсов и вычисляемых полей Выполняется для каждой строки выборки Рассчитываются агрегаты на каждом уровне группировки и детальные записи Доступны все рассчитанные значения в ЭлементРезультата.ЗначенияПараметров
Типизация значений Строгая типизация колонок по полям схемы СКД Строгая типизация колонок на всех уровнях дерева Исходные типы 1С в параметрах элемента результата
Потребление памяти (RAM) Среднее (вся таблица создаётся в памяти сервера) Среднее (всё дерево узлов хранится в памяти) Минимальное (потоковая обработка по одному элементу)
Типовой сценарий применения Заполнение табличной части документа, выгрузка плоского реестра в JSON/CSV, сверка данных Заполнение дерева на управляемой форме (ЗначениеВРеквизитФормы), разбор иерархии Выгрузка сотен тысяч строк во внешний шлюз без перегрузки рабочего процесса rphost
Если нужно быстро собрать отчёт на СКД, проверить расчёт ресурсов на реальных данных и получить готовый файл .erf с программным формированием в ПриКомпоновкеРезультата, используйте ИИ Консоль отчётов 1С. Агент сам напишет запросы по метаданным вашей базы, соберёт схему компоновки и протестирует отчёт в живом сеансе.

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

  • Не указан ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений в КомпоновщикМакета.Выполнить(...). По умолчанию метод Выполнить использует генератор макета для табличного документа. При передаче такого макета в ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений платформа выбросит ошибку несоответствия типа макета.
  • Ошибка «Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений». Возникает, когда в Настройки.Структура осталась кросс-таблица (ТаблицаКомпоновкиДанных), диаграмма (ДиаграммаКомпоновкиДанных) или вложенная схема. Перед вызовом КомпоновщикМакета.Выполнить очистите Настройки.Структура и добавьте линейную группировку ГруппировкаКомпоновкиДанных.
  • Передача КомпоновщикНастроек.Настройки вместо КомпоновщикНастроек.ПолучитьНастройки(). Свойство КомпоновщикНастроек.Настройки не учитывает значения из ПользовательскиеНастройки (быстрые отборы и период на форме отчёта). В результате в ТаблицаЗначений выгружается вся база без фильтрации пользователя.
  • В ТаблицаЗначений попадает лишняя строка с общим итогом или сдвигаются колонки группировок. Если выгружать отчёт с группировками и включёнными общими итогами в плоскую ТаблицаЗначений, процессор вывода создаст строку общего итога (где измерения пустые, а ресурсы просуммированы). Для чистой таблицы детальных записей оставляйте одну группировку без полей группировки либо отключайте общие итоги параметром РасположениеОбщихИтоговПоВертикали = РасположениеИтоговКомпоновкиДанных.Нет.
  • В таблицу значений не выгружаются поля с точкой в имени (например, Номенклатура.Артикул). Имя колонки ТаблицаЗначений в 1С не может содержать точку, поэтому платформа автоматически убирает точки из имён полей при создании колонок (НоменклатураАртикул). Если вы заранее создали колонки в ТЗ вручную или обращаетесь к ним по старому имени с точкой, поле не заполнится или вызовет ошибку обращения к свойству.
  • Пустые колонки при использовании НаборДанныхОбъект или вычисляемых полей без типа. Если в схеме компоновки для поля не указан ТипЗначения, генератор макета для коллекции значений не сможет типизировать колонку приёмника, и значения в некоторых сценариях (особенно при дальнейшем вызове ЗначениеВРеквизитФормы на управляемой форме) окажутся пустыми.
  • Забыли четвёртый параметр ВозможностьИспользованияВнешнихФункций = Истина в ПроцессорКомпоновки.Инициализировать(...). Если в вычисляемых полях или ресурсах схемы вызываются экспортные функции общих модулей конфигурации, без флага Истина в четвёртом параметре инициализации процессора компоновки выполнение упадёт с ошибкой неразрешённой функции.

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

Обязательно ли вызывать метод УстановитьОбъект перед вызовом Вывести?

Нет, но это рекомендуется для читаемости кода. Если метод УстановитьОбъект не был вызван, метод ПроцессорВывода.Вывести(ПроцессорКомпоновки) по умолчанию сам создаст и вернёт новый объект типа ТаблицаЗначений. Однако для выгрузки в ДеревоЗначений или в заранее типизированную таблицу вызов УстановитьОбъект обязателен.

Почему возникает ошибка «Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений»?

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

Как отличаются имена колонок в полученной ТаблицеЗначений от полей СКД?

Если целевая ТаблицаЗначений передана пустой, процессор вывода создаёт колонки по именам полей СКД (свойство ПутьКДанным или Поле), удаляя из них точки и недопустимые для идентификаторов символы: например, поле Контрагент.ИНН станет колонкой КонтрагентИНН. Чтобы получить предсказуемые имена колонок без склейки, задайте полям понятные псевдонимы в запросе набора данных СКД.

Тарифы

ИИ Консоль отчётов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Ранний доступ

Популярный выбор
Бесплатно

Тестирование продукта в режиме разработки

  • Формирование панелей и виджетов в чате
  • Поддержка таблиц и популярных типов диаграмм
  • Приоритетный сбор обратной связи по развитию продукта