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