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

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

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

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

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

Разберем по шагам алгоритм программного вывода

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

  1. Получение схемы и настроек. Сначала мы обращаемся к самой схеме (где описаны запросы и связи) и настройкам, которые определяют текущий вариант отчета.
  2. Подготовка компоновщика макета. Этот объект переводит абстрактные настройки схемы в конкретный макет, понятный процессору компоновки.
  3. Инициализация процессора компоновки. Здесь происходит основная магия: связь макета с данными информационной базы.
  4. Вывод в коллекцию. Вместо привычного ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент мы будем использовать специальный объект для вывода в коллекции.

Проанализируем программный код реализации

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


// Функция выполняет компоновку и возвращает ТЗ
Функция ПолучитьТаблицуИзСКД(СхемаКомпоновки, НастройкиКомпоновки) Экспорт

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

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

Важные нюансы при работе с Генератором макета

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

Выясним причину, почему иногда колонки в таблице не соответствуют ожидаемым. Это происходит из-за того, что процессор вывода создает только те колонки, которые определены в "Выбранных полях" настроек компоновки. Если нам нужны дополнительные данные (например, идентификаторы объектов), мы обязательно должны добавить их в список выбранных полей программно или в конструкторе СКД.

Как работать с параметрами и отборами

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


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

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

Особенности иерархии и итогов

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

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

Посмотрим на практический пример обработки результата

После того как мы получили таблицу РезультатТаблица, мы можем работать с ней как с любой другой коллекцией 1С. Проанализируем типичный сценарий перебора данных:


Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
    // Проверяем условие и выполняем действия
    Если СтрокаРезультата.СуммаОстаток > 100000 Тогда
        Сообщить("Внимание! Превышен лимит по контрагенту: " + СтрокаРезультата.Контрагент);
        // Здесь может быть код создания документа или задачи
    КонецЕсли;
КонецЦикла;

Резюме и рекомендации

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

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

← На главную