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

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

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

Почему ПриКомпоновкеРезультата срабатывает слишком поздно?

Проанализируем жизненный цикл отчета. Процедура ПриКомпоновкеРезультата в модуле объекта отчета предназначена для управления процессом компоновки «на лету». Когда управление попадает в эту процедуру, система уже собрала все настройки с формы. Если мы меняем параметры здесь, они применяются к итоговому запросу, но не «пробрасываются» обратно на форму. Чтобы пользователь увидел значения сразу, нам нужно вмешаться в процесс гораздо раньше — на этапе создания формы или загрузки настроек.

Способ 1. Использование выражений в схеме компоновки данных

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

Например, чтобы установить дату начала на 7 дней назад, а дату окончания на конец вчерашнего дня, пропишем следующие выражения:

  1. Для параметра НачалоПериода: ДобавитьКДате(НачалоПериода(ТекущаяДата(), "День"), "День", -7)
  2. Для параметра КонецПериода: КонецПериода(ДобавитьКДате(ТекущаяДата(), "День"), "День", -1)

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

Способ 2. Работа с событиями формы (Управляемые формы)

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

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

Разберем пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вычисляем нужные даты
    ДатаНачала = НачалоДня(ТекущаяДата() - 7*24*60*60);
    ДатаКонца  = КонецДня(ТекущаяДата() - 24*60*60);
    
    // Ищем параметры в основных настройках компоновщика
    ПараметрНач = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
    ПараметрКон = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
    
    // Если параметры найдены и они вынесены в пользовательские настройки
    Если ПараметрНач <> Неопределено И ЗначениеЗаполнено(ПараметрНач.ИдентификаторПользовательскойНастройки) Тогда
        ПользНастройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрНач.ИдентификаторПользовательскойНастройки);
        Если ТипЗнч(ПользНастройка) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
            ПользНастройка.Значение = ДатаНачала;
            ПользНастройка.Использование = Истина;
        КонецЕсли;
    КонецЕсли;

    Если ПараметрКон <> Неопределено И ЗначениеЗаполнено(ПараметрКон.ИдентификаторПользовательскойНастройки) Тогда
        ПользНастройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрКон.ИдентификаторПользовательскойНастройки);
        Если ТипЗнч(ПользНастройка) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
            ПользНастройка.Значение = ДатаКонца;
            ПользНастройка.Использование = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Интеграция с БСП (Библиотека стандартных подсистем)

Если ваша конфигурация построена на базе БСП (например, 1С:ERP, КА 2, УТ 11 или БП 3.0), рекомендуется использовать типовые механизмы переопределения настроек. В БСП существует специальный механизм событий формы отчета, который позволяет гибко управлять параметрами, не нарушая работу механизма сохранения настроек пользователя.

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


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

Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
    // Именно здесь лучше всего менять параметры для типовых форм БСП
    // Это событие срабатывает после того, как система загрузила старые настройки пользователя,
    // но до того, как они были выведены на экран.
    
    // Код поиска и изменения элементов в коллекции НовыеПользовательскиеНастройкиКД
КонецПроцедуры

Почему настройки иногда не обновляются?

Проанализируем ситуацию: вы написали код, но при открытии все равно видите старые даты. Это работа механизма сохранения настроек. 1С сохраняет состояние КомпоновщикНастроек.ПользовательскиеНастройки при закрытии и восстанавливает его при открытии.

Чтобы программные значения всегда были приоритетнее сохраненных, код установки значений должен выполняться в событии ПриЗагрузкеПользовательскихНастроекНаСервере или ПослеЗагрузкиВариантаНаСервере. Если же вы хотите, чтобы программная установка срабатывала только «один раз» (при первом запуске нового отчета), используйте ПриСозданииНаСервере с проверкой на заполненность параметров.

Рекомендация по использованию стандартных периодов

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

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

← На главную