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