В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость получить данные из отчета, построенного на Системе компоновки данных (СКД), не для отображения пользователю, а для дальнейшей программной обработки. Например, это может потребоваться для анализа показателей, передачи данных во внешние системы или формирования сложных печатных форм. В данной статье мы детально разберем процесс программного исполнения схемы компоновки и вывода результата в объект ТаблицаЗначений.
Для того чтобы получить данные из СКД программно, нам необходимо имитировать работу стандартного механизма компоновки, пройдя через несколько ключевых этапов. Чтобы упростить этот процесс и сделать код более лаконичным, опытные разработчики часто используют СКДБилдер, который помогает сократить объем написанного кода в несколько раз. Разберем этапы по порядку:
Рассмотрим подробнее каждый из этих этапов. Для начала проанализируем ситуацию, когда схема хранится в макете объекта (обработки или отчета).
Первым делом нам необходимо инициализировать схему и загрузить в нее настройки. Мы будем использовать объект КомпоновщикНастроекКомпоновкиДанных, который позволяет осуществлять программное управление настройками компоновки: параметры, отборы, выбранные поля. Выясним причину, почему это важно: без инициализации настроек отчет может выполниться с пустыми параметрами или некорректными отборами. Для предварительной проверки и отладки параметров запроса удобно использовать консоль запросов с поддержкой СКД.
// Получаем схему из макета
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Инициализируем настройки
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Если нужно изменить параметр программно
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
Если ПараметрПериод <> Неопределено Тогда
ПараметрПериод.Значение = КонецДня(ТекущаяДата());
ПараметрПериод.Использование = Истина;
КонецЕсли;
Важный момент: если вы работаете в управляемом приложении и настройки были изменены пользователем на форме, их следует получить из Отчет.КомпоновщикНастроек.ПолучитьНастройки().
Далее мы переходим к самому ответственному этапу — созданию макета компоновки. На этом этапе 1С объединяет схему с настройками, подставляет значения параметров в запросы и готовит итоговый текст SQL-запроса к базе данных. Проанализируем код:
// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Формируем макет компоновки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Инициализируем процессор компоновки данных
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
Обратите внимание на тип генератора: ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. Это критически важно, так как стандартный генератор настроен на вывод в табличный документ, а нам нужна структура для таблицы значений.
Теперь, когда процессор компоновки готов, нам остается лишь собрать данные. Для этого используется объект ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Посмотрим на пример завершающей части алгоритма:
// Создаем таблицу значений для результата
ТаблицаРезультата = Новый ТаблицаЗначений;
// Инициализируем процессор вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультата);
// Выводим данные
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
После выполнения метода Вывести() переменная ТаблицаРезультата будет содержать все колонки и строки, предусмотренные настройками СКД. Разберем по шагам, что делать, если в СКД настроены группировки. В этом случае, изучив программный вывод СКД в таблицу или дерево значений, вы увидите, что вместо ТаблицаЗначений лучше использовать ДеревоЗначений, чтобы сохранить иерархическую структуру отчета. При этом в сложных интерфейсных задачах может потребоваться программное изменение заголовка группировки, если стандартный заголовок не подходит под требования задачи.
Иногда СКД используется для обработки данных, которые не находятся в базе 1С напрямую (например, получены из API или другого файла). В этом случае мы используем Внешние наборы данных. Проанализируем ситуацию, когда в схеме определен набор данных "ВнешняяТаблица", учитывая особенности, которые описывает работа с внешними наборами данных в СКД. В таких случаях часто встает вопрос производительности, поэтому рекомендуем изучить методы оптимизации отчетов с набором данных - объект.
// Подготовим внешние данные
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ВнешняяТаблица", МояТаблицаСДанными);
// При инициализации процессора компоновки передаем структуру внешних наборов
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
Помните: имена ключей в структуре ВнешниеНаборыДанных должны строго совпадать с именами наборов данных, указанными в СхемаКомпоновкиДанных в конфигураторе.
Рассмотрим подробнее типичные ошибки при программном выполнении схемы компоновки данных, часто встречающиеся при выводе результата:
Настройки.Выбор.Элементы.КомпоновщикМакета требует серверного контекста.ТаблицаЗначений может потреблять много оперативной памяти. В таких ситуациях может помочь способ разработки отчета с двумя схемами компоновки данных, где одна из схем берет на себя предварительную подготовку данных.Если нам не нужно сохранять всю таблицу целиком, а нужно лишь обработать каждую строку (например, для записи в другой регистр), проанализируем следующий подход:
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
// Обработка данных строки
ДанныеСтроки = ЭлементРезультата.ЗначенияПараметров;
// ... ваша логика ...
КонецЦикла;
Этот метод значительно экономит ресурсы сервера при обработке миллионов строк. Мы рассмотрели основные и продвинутые техники работы с СКД. Используя данные инструкции, а также возможности, которые предоставляет пользовательская СКД для клиентских приложений, вы сможете гибко управлять данными в своих конфигурациях. Даже если ваша задача крайне специфична и требует использования двух разных схем в одном отчете, теперь вы обладаете необходимым фундаментом для её реализации и интеграции отчетов СКД в любые бизнес-процессы вашей системы 1С.