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