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