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

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

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

Давайте подробно рассмотрим, как правильно инициализировать схему компоновки, настроить параметры и отборы, а затем быстро и эффективно выгрузить готовый результат.

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

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


// 1. Получаем схему компоновки данных из макета
СхемаКомпоновкиДанных = ПолучитьОбщийМакет("МояСхемаСКД");

// 2. Создаем компоновщик настроек для работы с параметрами и отборами
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

// Получаем рабочую структуру настроек
Настройки = КомпоновщикНастроек.Настройки;

// 3. Устанавливаем значение параметра схемы
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МойПараметр", ЗначениеМоегоПараметра);

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

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

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

// 7. Выводим результат в таблицу значений
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Давайте подробно разберем ключевые шаги этого процесса:

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

Программная настройка отборов в СКД

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


// Добавляем новый элемент в коллекцию отборов настройки
НовыйЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Задаем левое значение - это поле схемы, по которому будет производиться фильтрация
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");

// Указываем вид сравнения (например, Равно, В Списке, Больше и т.д.)
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

// Задаем правое значение отбора и активируем его использование
НовыйЭлементОтбора.ПравоеЗначение = ВыбранныйТовар;
НовыйЭлементОтбора.Использование = Истина;

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

Учет настроек, измененных пользователем

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

Если мы просто применим настройки по умолчанию, то проигнорируем все действия пользователя. Чтобы этого избежать, нам нужно получить текущие актуальные настройки из компоновщика формы:


// Вместо загрузки дефолтных настроек берем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

Метод ПолучитьНастройки() собирает все настройки компоновщика, учитывая как фиксированные настройки, так и пользовательские изменения на форме.

Работа с внешними наборами данных

Иногда СКД используется не как инструмент прямого запроса к СУБД, а как средство сложной обработки, группировки и вывода уже имеющейся в памяти таблицы значений. В СКД такой источник описывается как «Набор данных - объект». Рассмотрим, как передать внешнюю таблицу в процессор компоновки:


// Подготовим структуру для внешних наборов данных
ВнешниеНаборы = Новый Структура;
// Имя ключа в структуре должно строго совпадать с именем объекта в схеме СКД
ВнешниеНаборы.Вставить("МояТаблицаДанных", ИсходнаяТаблицаЗначений);

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

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

Выгрузка в Дерево Значений

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

Код при этом практически не меняется, нам нужно лишь передать другой целевой объект процессору вывода:


// Создаем дерево значений вместо таблицы значений
РезультатДерево = Новый ДеревоЗначений;

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

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

Важные ограничения генератора макета для коллекций значений

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

Обеспечение интерактивности: возможность прерывания процесса

Если СКД обрабатывает огромный массив информации, выполнение запросов и компоновка данных на стороне сервера могут занять длительное время, при этом сеанс пользователя "зависнет". Чтобы дать пользователю возможность прервать процесс формирования таблицы нажатием стандартной комбинации клавиш Ctrl + Break, достаточно передать дополнительный параметр в метод вывода:


// Второй параметр "Истина" включает возможность интерактивного прерывания процесса
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);

Это повышает отзывчивость интерфейса вашей конфигурации и делает работу пользователей более комфортной.

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

← На главную