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

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Шаг 1: Подготовка настроек компоновки

Если вам нужно использовать сохраненную настройку (вариант отчета), сначала необходимо извлечь ее данные. Обычно сохраненные настройки хранятся в виде XML-файлов или текстовых полей. Рассмотрим, как загрузить их в КомпоновщикНастроекКомпоновкиДанных:


// Получаем настройки из макета, в котором сохранен XML-текст
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанныхНастройки");
Настройки = Макет.ПолучитьТекст();

// Сохраняем во временный файл для чтения сериализатором
ИмяФайлаXML = ПолучитьИмяВременногоФайла("xml");
Файл = Новый ЗаписьТекста(ИмяФайлаXML);
Файл.ЗаписатьСтроку(Настройки);
Файл.Закрыть();

// Читаем настройки через СериализаторXDTO
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
НастройкиКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайлаXML);

Шаг 2: Инициализация компоновщика и установка параметров

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


Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);

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


Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
Параметр.Использование = Истина;
Параметр.Значение.ДатаНачала = Д1;
Параметр.Значение.ДатаОкончания = Д2;

Шаг 3: Генерация макета для таблицы значений

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


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

Шаг 4: Вывод результата в таблицу значений

На финальном этапе мы используем ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Это позволит нам наполнить созданную ТаблицаЗначений данными из отчета.


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

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

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

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

← На главную