Часто в процессе разработки возникает необходимость не просто вывести отчет на форму, а получить данные из типового отчета 1С:ERP для дальнейшей обработки или передачи в другую подсистему. Рассмотрим по шагам, как правильно реализовать этот процесс, используя механизмы Системы Компоновки Данных (СКД).
Если вам нужно использовать сохраненную настройку (вариант отчета), сначала необходимо извлечь ее данные. Обычно сохраненные настройки хранятся в виде XML-файлов или текстовых полей. Рассмотрим, как загрузить их в КомпоновщикНастроекКомпоновкиДанных:
// Получаем настройки из макета, в котором сохранен XML-текст
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанныхНастройки");
Настройки = Макет.ПолучитьТекст();
// Сохраняем во временный файл для чтения сериализатором
ИмяФайлаXML = ПолучитьИмяВременногоФайла("xml");
Файл = Новый ЗаписьТекста(ИмяФайлаXML);
Файл.ЗаписатьСтроку(Настройки);
Файл.Закрыть();
// Читаем настройки через СериализаторXDTO
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
НастройкиКомпоновкиДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайлаXML);
После того как объект настроек получен, необходимо связать его со схемой компоновки данных. Это критически важный этап, так как без правильной инициализации КомпоновщикНастроек не будет «видеть» параметры и доступные поля отчета.
Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновкиДанных);
Теперь нужно принудительно установить все необходимые параметры. Даже если они были в сохраненной настройке, программная установка гарантирует корректность:
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
Параметр.Использование = Истина;
Параметр.Значение.ДатаНачала = Д1;
Параметр.Значение.ДатаОкончания = Д2;
Главная ошибка при получении данных в таблицу заключается в использовании стандартного генератора макета. Чтобы СКД подготовила данные для коллекции, необходимо явно указать ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений в методе Выполнить().
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
На финальном этапе мы используем ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Это позволит нам наполнить созданную ТаблицаЗначений данными из отчета.
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Теперь в переменной ТаблицаРезультат содержится плоская структура данных вашего отчета. Помните, что при использовании этого метода сложные иерархические группировки превращаются в линейные строки, поэтому может потребоваться дополнительная фильтрация или очистка строк, где, например, не заполнены детальные записи.
Совет: Если результат формирования пуст, первым делом проверьте значение свойства Использование у всех критически важных параметров в коллекции ПараметрыДанных. Также всегда можно вывести МакетКомпоновки в ТабличныйДокумент в процессе отладки, чтобы убедиться, что данные вообще попадают в отчет.