Как программно установить значения параметров СКД, чтобы они отображались на форме отчета

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда установленные в коде параметры «применяются» к результату (данные фильтруются правильно), но в пользовательском интерфейсе на форме отчета поля остаются пустыми или содержат старые значения. Особенно остро эта проблема проявляется во внешних отчетах и конфигурациях, использующих Библиотеку стандартных подсистем (БСП). В таких случаях стандартные механизмы могут дополняться расширенными инструментами, такими как специализированная пользовательская СКД, расширяющая возможности построения отчетов на стороне клиента.

В рамках данной статьи разбирается, почему стандартные методы не всегда обновляют форму, анализируется разница между коллекциями настроек и рассматриваются несколько рабочих способов программной установки параметров с визуальным обновлением.

Причина: почему ПриКомпоновкеРезультата не обновляет форму

Процедура ПриКомпоновкеРезультата вызывается в модуле объекта отчета непосредственно в момент формирования документа. При написании кода для установки параметров в этой процедуре модифицируется текущий сеанс компоновки. Однако к этому моменту управляемая форма отчета уже создана и отображена пользователю. Форма функционирует независимо, и ее элементы управления связаны с коллекцией ПользовательскиеНастройки, а не напрямую с основным КомпоновщикомНастроек модуля объекта.

В ситуации, когда параметр выведен в область быстрых настроек, система приоритетно берет значения из ПользовательскиеНастройки. Если программно меняется значение в КомпоновщикНастроек.Настройки.ПараметрыДанных, визуальное поле на форме не получает уведомления об изменении и продолжает отображать пустое значение или то, что было введено пользователем вручную.

Способ 1: Использование события формы для внешнего отчета

При разработке внешнего отчета, когда необходимо, чтобы при открытии или обновлении настроек параметры (например, текущая дата) сразу подставлялись в поля на форме, наиболее эффективным является использование события ПриОбновленииСоставаПользовательскихНастроекНаСервере в модуле формы. Ниже приведен пример кода, позволяющий решить данную задачу:


 Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
// Ищется нужный параметр в коллекции параметров данных компоновщика
// В данном примере работа идет с параметром типа "СтандартныйПериод"
ПараметрПериод = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета"));   

Если ПараметрПериод <> Неопределено Тогда
    // Устанавливается вариант периода и дата начала
    ПараметрПериод.Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; 
    ПараметрПериод.Значение.ДатаНачала = ТекущаяДата();
    ПараметрПериод.Использование = Истина;
КонецЕсли;

КонецПроцедуры 

Важный нюанс: при работе со СтандартныйПериод недостаточно просто присвоить дату. К примеру, если требуется реализовать выбор месяца в качестве периода в типовых конфигурациях, необходимо убедиться, что объект инициализирован, и установлен правильный Вариант. Также необходимо устанавливать свойство Использование в значение Истина.

Способ 2: Работа через ПользовательскиеНастройки (Модуль объекта)

Если все же необходимо установить значение в модуле объекта (например, в процедуре ПриКомпоновкеРезультата) и требуется передать его в интерфейс, следует найти элемент в ПользовательскиеНастройки по его ИдентификаторПользовательскойНастройки. Подобный подход часто применяется, когда в отчете реализованы дополнительные отборы по диапазонам или спискам значений, требующие синхронизации. Алгоритм действий выглядит следующим образом:

  1. Получение основного параметра из настроек компоновщика.
  2. Получение его ИдентификаторПользовательскойНастройки.
  3. Поиск элемента по этому идентификатору в коллекции КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
  4. Установка значения найденному элементу.

Пример реализации функции для установки параметра с обновлением пользовательских настроек:


 Процедура УстановитьПараметрСКД(Компоновщик, ИмяПараметра, Значение)
// 1. Установка в основных настройках
ЭлементПараметра = Компоновщик.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если ЭлементПараметра <> Неопределено Тогда
    ЭлементПараметра.Значение = Значение;
    ЭлементПараметра.Использование = Истина;
    
    // 2. Поиск этого же параметра в пользовательских настройках для визуализации на форме
    Идентификатор = ЭлементПараметра.ИдентификаторПользовательскойНастройки;
    Если ЗначениеЗаполнено(Идентификатор) Тогда
        Для Каждого ЭлементПольз Из Компоновщик.ПользовательскиеНастройки.Элементы Цикл
            Если ЭлементПольз.ИдентификаторПользовательскойНастройки = Идентификатор Тогда
                ЭлементПольз.Значение = Значение;
                ЭлементПольз.Использование = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

КонецПроцедуры 

Способ 3: Интеграция с БСП (Процедура ОпределитьНастройкиФормы)

В современных конфигурациях (таких как ЗУП 3.1, ERP 2.5, УТ 11) отчеты часто открываются в общих формах БСП. Для управления настройками в таких случаях предусмотрен специальный программный интерфейс. В некоторых проектах для достижения идеального результата может потребоваться полноценная подсистема предопределенных настроек, позволяющая сделать решение завершенным.

В модуле объекта отчета необходимо определить экспортную процедуру ОпределитьНастройкиФормы. Она позволяет «подписаться» на события формы. На практике это выглядит так:


 Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Разрешается выполнение кода при создании формы на сервере
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;

КонецПроцедуры
// Теперь можно использовать событие создания формы для установки значений Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
// Инициализируются настройки, специфичные для конфигурации (например, через общие модули Зарплаты и Кадров)
// Затем устанавливаются параметры
ПараметрыДанных = Форма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОтчета", ТекущаяДата());

// Важно синхронизировать объект отчета с данными формы
ЗначениеВДанныеФормы(ЭтотОбъект, Форма.Отчет);

КонецПроцедуры 

Почему важна очистка кэша и переименование отчета

Разработчики часто сталкиваются с тем, что решение «один раз сработало, а дальше нет». Это происходит из-за механизма сохранения настроек пользователя. Платформа 1С запоминает последние настройки, которые использовались в отчете, и при повторном открытии восстанавливает их из хранилища. Эти сохраненные настройки имеют приоритет над значениями по умолчанию из схемы СКД. Для управления этим процессом существуют инструменты, позволяющие осуществлять просмотр, восстановление и очистку хранилища настроек пользователя.

При смене имени внешнего отчета 1С воспринимает его как новый объект и еще не имеет для него сохраненного кэша настроек — поэтому программный код срабатывает. Чтобы программные настройки имели приоритет над кэшем, их следует устанавливать либо в событии ПриЗагрузкеВариантаНаСервере, либо принудительно очищать/перезаписывать пользовательские настройки при создании формы. В редких случаях, когда архитектура требует особого подхода, может быть реализовано использование двух разных схем в одном отчете СКД, что также потребует внимательной работы с кэшем настроек для каждой из них.

Полезный совет: Использование выражений в СКД

Самый простой способ, не требующий написания кода: если необходимо просто установить «Начало текущего месяца» или «Текущую дату» при открытии, используется колонка Выражение на вкладке «Параметры» в конструкторе СКД:

Значения, прописанные в колонке «Выражение», вычисляются платформой в момент инициализации компоновщика и корректно отображаются в пользовательских настройках на форме без дополнительных манипуляций в коде.

Резюме

Для успешного отображения программно установленных параметров на форме 1С 8.3 следует придерживаться следующих правил:

  1. Если отчет внешний и простой — использовать выражения в схеме СКД.
  2. Если логика сложная — использовать событие формы ПриОбновленииСоставаПользовательскихНастроекНаСервере.
  3. При работе с БСП — задействовать ОпределитьНастройкиФормы и ПриСозданииНаСервере в модуле объекта.
  4. Всегда учитывать наличие ПользовательскиеНастройки, которые перекрывают основные настройки компоновщика.
← На главную