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