В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость использовать механизмы Системы Компоновки Данных (СКД) не для вывода отчета пользователю, а для получения данных в программном коде. Это может потребоваться для дальнейшей обработки информации, передачи её в другие алгоритмы или формирования сложных структур данных. Одним из наиболее эффективных способов получения таких данных является их выгрузка в ТаблицаЗначений. Рассмотрим подробно, как реализовать этот механизм программно, разберем основные объекты и этапы процесса.
Для того чтобы программно выполнить компоновку и получить результат, нам необходимо задействовать цепочку специализированных объектов 1С. Разберем по шагам, какие инструменты нам понадобятся:
Проанализируем ситуацию: почему нельзя просто выполнить запрос? СКД удобна тем, что она автоматически обрабатывает иерархию, вычисляемые поля, пользовательские настройки и права доступа. Если мы хотим сохранить эту гибкость при программном вызове, использование стандартных процессоров вывода — единственный верный путь.
Рассмотрим пример кода, который выполняет формирование отчета. Предположим, что у нас уже есть объект СхемаКомпоновкиДанных (например, полученная из макета документа или отчета). Выясним причину, почему важно правильно инициализировать настройки.
// 1. Получаем схему из макета отчета
Схема = Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 2. Получаем текущие настройки (можно взять настройки по умолчанию или из компоновщика)
Настройки = Схема.НастройкиПоУмолчанию;
// 3. Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// 4. Формируем макет компоновки
// Передаем схему, настройки и данные расшифровки (если нужны)
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
// 5. Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// 6. Подготавливаем таблицу значений для результата
РезультатТаблица = Новый ТаблицаЗначений;
// 7. Создаем процессор вывода в коллекцию и связываем его с таблицей
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(РезультатТаблица);
// 8. Выполняем вывод
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
В данном примере РезультатТаблица будет содержать все колонки, которые были указаны в разделе Выбранные поля настроек компоновки. Важно отметить, что типы колонок будут определены автоматически на основании типов полей в схеме компоновки данных.
Зачастую перед выгрузкой данных нам нужно программно установить значения параметров (например, период) или добавить дополнительные отборы. Разберем по шагам, как это сделать через объект НастройкиКомпоновкиДанных.
Посмотрим на пример установки параметра:
// Установка значения параметра "Период"
ИмяПараметра = "Период";
ЗначениеПараметра = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
ПараметрСКД = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если ПараметрСКД <> Неопределено Тогда
ПараметрСКД.Значение = ЗначениеПараметра;
ПараметрСКД.Использование = Истина;
КонецЕсли;
Если же требуется программно добавить отбор, мы работаем с коллекцией Настройки.Отбор.Элементы. Рассмотрим подробнее этот процесс:
// Добавление отбора по конкретной организации
НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = СсылкаНаОрганизацию;
НовыйОтбор.Использование = Истина;
Иногда СКД используется для обработки данных, которые не находятся в базе 1С, а передаются «извне» (например, уже готовая таблица значений, которую нужно сгруппировать средствами СКД). В этом случае процесс инициализации ПроцессорКомпоновкиДанных немного меняется. Проанализируем ситуацию: нам нужно передать структуру, где ключом будет имя внешнего набора данных из схемы.
// Предположим, в схеме есть внешний набор данных с именем "ВнешниеДанные"
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ВнешниеДанные", МояИсходнаяТаблица);
// При инициализации процессора передаем эту структуру
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
При работе с программным выводом СКД в 1С 8.3 следует учитывать несколько важных моментов, чтобы избежать ошибок производительности и некорректного отображения данных:
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений с объектом ДеревоЗначений.Использование у параметров и элементов отбора. Если оно установлено в Ложь, настройка не будет применена, что может привести к получению избыточных данных.Мы разобрали полный цикл программного формирования отчета через СКД. Этот метод является универсальным и позволяет гибко управлять данными, используя всю мощь Системы Компоновки Данных без необходимости визуального вывода отчета пользователю. Применяйте эти подходы для автоматизации расчетов и создания сложных аналитических алгоритмов в ваших конфигурациях.