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

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

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

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

Анализ типичных ошибок: почему результат СКД пустой

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

  1. Неинициализированный компоновщик настроек. Если создать объект КомпоновщикНастроекКомпоновкиДанных через конструктор Новый и не загрузить в него настройки по умолчанию из схемы, его структура группировок будет пустой. В результате генератор макета не создаст ни одной строки вывода.
  2. Установка параметров напрямую в схеме, а не в настройках. Изменение значений в коллекции СКД.Параметры зачастую игнорируется генератором макета, если в компоновщике настроек эти параметры не активированы. Значения параметров данных должны определяться и включаться непосредственно в структуре настроек компоновщика.
  3. Неверное указание использования параметра. Свойство Использование у элемента параметров компоновки данных имеет тип Булево (в настройках) или управляется через специальный признак доступности. Если флаг использования не выставлен в значение Истина, фильтрация по периоду или отборам может сработать некорректно либо выборка окажется нулевой.
  4. Несовместимость структуры отчета с генератором коллекций. Использование объекта ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений накладывает ограничения на структуру отчета: для таблицы значений структура должна представлять собой линейный список (детальные записи или один уровень группировки без колонок кросс-таблицы).

Пошаговый алгоритм формирования таблицы значений из СКД

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

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

Пример программного кода для модуля внешней обработки

Посмотрим на практический пример кода, который вызывается на стороне сервера и возвращает заполненную таблицу значений:


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

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

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

Особенности работы с отчетами в конфигурациях на базе БСП (УТ 11, КА, ERP)

Если задача заключается в получении данных стандартного типового отчета конфигурации «Управление торговлей 11», важно учитывать архитектуру Библиотеки Стандартных Подсистем (БСП):

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

Альтернативный подход: вывод через скрытый ТабличныйДокумент

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

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

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

← На главную