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