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

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

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

Основные этапы программной компоновки

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

  1. Получение основной схемы компоновки данных.
  2. Настройка параметров и отборов через компоновщик настроек.
  3. Инициализация процессора компоновки.
  4. Вывод результата в коллекцию значений (Таблицу значений).

Рассмотрим подробнее каждый из этих этапов. Для начала проанализируем ситуацию, когда схема хранится в макете объекта (обработки или отчета).

Подготовка схемы и настроек

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


// Получаем схему из макета
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

// Если нужно изменить параметр программно
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
    ПараметрПериод.Значение = КонецДня(ТекущаяДата());
    ПараметрПериод.Использование = Истина;
КонецЕсли;

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

Компоновка макета и инициализация процессора

Далее мы переходим к самому ответственному этапу — созданию макета компоновки. На этом этапе 1С объединяет схему с настройками, подставляет значения параметров в запросы и готовит итоговый текст SQL-запроса к базе данных. Проанализируем код:


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

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

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

Обратите внимание на тип генератора: ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. Это критически важно, так как стандартный генератор настроен на вывод в табличный документ, а нам нужна структура для таблицы значений.

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

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


// Создаем таблицу значений для результата
ТаблицаРезультата = Новый ТаблицаЗначений;

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

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

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

Особенности работы с внешними наборами данных

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


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

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

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

Типичные ошибки и способы их исправления

Рассмотрим подробнее типичные ошибки при программном выполнении схемы компоновки данных, часто встречающиеся при выводе результата:

  1. Пустая таблица значений: Чаще всего это происходит из-за того, что в настройках не выбраны поля (раздел "Выбранные поля"). Если вы формируете настройки программно "с нуля", обязательно добавьте нужные поля в Настройки.Выбор.Элементы.
  2. Ошибка типов: Если в схеме используются сложные типы или обращения к метаданным, убедитесь, что код выполняется на сервере, так как КомпоновщикМакета требует серверного контекста.
  3. Производительность: При работе с очень большими объемами данных вывод в ТаблицаЗначений может потреблять много оперативной памяти. В таких ситуациях может помочь способ разработки отчета с двумя схемами компоновки данных, где одна из схем берет на себя предварительную подготовку данных.

Пример построчного обхода результата

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


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

Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;
    
    // Обработка данных строки
    ДанныеСтроки = ЭлементРезультата.ЗначенияПараметров;
    // ... ваша логика ...
КонецЦикла;

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

← На главную