К статье
Практический материал

Отчеты и Аналитика · 12 мин

Как получить данные из СКД в 1С программно

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

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

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

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

Когда программное получение данных из СКД оправдано

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

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

Когда что использовать

Запрос в коде

Простая выборка, фиксированные условия, максимальная прозрачность кода. Не требует объектов СКД.

СКД программно

Гибкие отборы, группировки, переиспользование готовой схемы отчёта. Требует больше кода-обвязки.

Отчёт на СКД в пользовательском режиме

Данные нужны только для просмотра и печати, без программной обработки результата.

Общая схема выполнения СКД из кода

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

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

Порядок выполнения СКД программно
  1. 1
    Получить схему компоновки данных (ПолучитьМакет или загрузка из файла)
  2. 2
    Взять настройки по умолчанию и при необходимости установить параметры и отборы
  3. 3
    Создать КомпоновщикМакетаКомпоновкиДанных и вызвать Выполнить()
  4. 4
    Создать ПроцессорКомпоновкиДанных, инициализировать его макетом
  5. 5
    Создать подходящий процессор вывода и вывести результат
  6. 6
    Проверить, что результат не пуст и содержит ожидаемые колонки

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

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

СхемаКД = Отчеты.ПродажиПоМесяцам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Настройки = СхемаКД.НастройкиПоУмолчанию;

// Установка параметра периода

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("НачалоПериода"));

Параметр.Значение = НачалоМесяца(ТекущаяДатаСеанса());

Параметр.Использование = Истина;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Результат = Новый ТаблицаЗначений;

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

ПроцессорВывода.УстановитьОбъект(Результат);

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

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

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

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

ТабДок = Новый ТабличныйДокумент;

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

ПроцессорВывода.УстановитьДокумент(ТабДок);

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

Если нужна иерархия в программной обработке — например, дерево «Номенклатура → Документы» — результат выводится в ДеревоЗначений тем же процессором вывода в коллекцию значений. Строки верхнего уровня будут содержать группировки, вложенные строки — детальные записи.

Вывод с расшифровкой

Если табличный документ должен поддерживать расшифровку, при инициализации процессора компоновки третьим параметром передаётся объект ДанныеРасшифровки, а процессору вывода указывается, что нужно выводить данные расшифровки. Это актуально при формировании отчётов в собственных формах обработок.

Установка отборов и параметров из кода

Программная установка отборов — самая капризная часть. Отбор добавляется в коллекцию Настройки.Отбор.Элементы, при этом важно указать тип элемента отбора, поле, вид сравнения и признак использования. Если забыть установить Использование = Истина, отбор просто не применится, и вы получите полный набор данных без ошибок.

ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ОрганизацияСсылка;

ЭлементОтбора.Использование = Истина;

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

Типичные ошибки
01
Не установлено свойство Использование у отбора или параметра — условие молча игнорируется, результат содержит лишние данные
02
Поиск параметра по синониму вместо имени — НайтиЗначениеПараметра возвращает Неопределено, обращение к свойству даёт ошибку
03
Передача настроек отчёта вместо настроек схемы при работе с внешней обработкой — не находятся поля и параметры
04
Использование процессора вывода в табличный документ для получения таблицы значений — результат недоступен для обхода в коде
05
Изменение настроек после выполнения компоновщика макета — изменения не попадают в результат, макет уже построен

Передача внешних наборов данных

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

ВнешниеНаборы = Новый Структура;

ВнешниеНаборы.Вставить("ТаблицаЦен", ТаблицаЦенИзФайла);

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

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

Проверка результата и отладка

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

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

Контрольные точки

Как проверить результат

Количество строк в таблице значений
Норма

Совпадает с результатом отчёта в пользовательском режиме при тех же настройках

Тревожный признак

Пусто или заметно больше — проверяйте отборы и их признак Использование

Состав колонок
Норма

Колонки соответствуют выбранным полям настроек

Тревожный признак

Лишние или отсутствующие поля — проверяйте выбранные поля в настройках

Значения параметров
Норма

Параметры заполнены и Использование = Истина

Тревожный признак

Параметр Неопределено или выключен — ошибка компоновки или неверные данные

Ограничения и границы применения

Программная СКД — не универсальный заменитель запросов. Она создаёт дополнительные объекты в памяти и выполняет построение макета, что на малых выборках медленнее прямого запроса. Кроме того, отлаживать текст запроса, сгенерированный компоновкой, сложнее: итоговый SQL формируется платформой и не виден в коде напрямую.

В фоновых заданиях и на сервере код выполняется без изменений, но помните: вывод в табличный документ имеет смысл только если документ затем сохраняется в файл или хранилище — показать его пользователю из фонового задания нельзя. Для интерактивного показа формируйте отчёт на клиенте или передавайте готовый документ через временное хранилище.

Итог

Что важно запомнить

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

Частые вопросы

Можно ли получить данные из СКД без создания отчёта в конфигурации?

Да. Схему компоновки можно хранить как макет обработки, справочника или загружать из внешнего XML-файла через сериализатор XDTO. Дальше работа идёт по стандартной цепочке независимо от того, где физически лежит схема.

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

Загрузите настройки из хранилища пользовательских настроек в компоновщик настроек отчёта, затем передайте компоновщику макета именно эти настройки, а не настройки по умолчанию схемы. При этом убедитесь, что версия схемы совместима с сохранёнными настройками.

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

Чаще всего причина в отборах или параметрах: при программном выполнении используются настройки по умолчанию, а не те, что пользователь установил в форме отчёта. Проверьте также, что у добавленных программно отборов установлено свойство Использование и что обязательные параметры заполнены.

Как вывести результат СКД в дерево значений?

Используйте тот же процессор вывода в коллекцию значений, но передайте ему объект типа ДеревоЗначений вместо таблицы. В настройках компоновки должны быть заданы группировки — именно они сформируют уровни дерева.

Можно ли передать в СКД свою таблицу значений и соединить её с данными запроса?

Да, для этого в схеме добавляется набор данных типа «Объект», а в запросе схемы или связи наборов настраивается соединение с другими наборами. Таблица передаётся при инициализации процессора компоновки через структуру внешних наборов данных, где ключ совпадает с именем объекта в схеме.

Что быстрее: программная СКД или обычный запрос?

На простых выборках обычный запрос быстрее, потому что СКД дополнительно строит макет компоновки. Выигрыш СКД — в гибкости: отборы, группировки и поля можно менять настройками без переписывания кода. Для разовой фиксированной выборки запрос предпочтительнее, для настраиваемой аналитики — СКД.