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