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

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

Работа с параметрами в Системе компоновки данных (СКД) в среде управляемых форм часто вызывает затруднения у начинающих разработчиков. Типичная ситуация: в коде значение параметра вроде бы установлено, отладчик показывает верные данные, но на самой форме отчета поле параметра остается пустым. Рассмотрим подробно, почему это происходит, и разберем все возможные способы решения этой задачи — от самых простых до продвинутых программных методов.

Причина проблемы: различие между Настройками и Пользовательскими настройками

Прежде чем переходить к коду, проанализируем архитектуру работы компоновщика настроек. В управляемом приложении 1С существует две основные коллекции, где могут храниться параметры:

  1. КомпоновщикНастроек.Настройки.ПараметрыДанных — это основные настройки схемы.
  2. КомпоновщикНастроек.ПользовательскиеНастройки — это те настройки, которые вынесены на форму для изменения пользователем.

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

Способ 1: Использование выражений в схеме СКД (рекомендуемый)

Если ваша задача — установить текущую дату или начало периода по умолчанию, самый эффективный способ — сделать это без написания кода в модулях. Выясним, как использовать поле "Выражение" в конструкторе СКД.

Рассмотрим примеры выражений для разных нужд:

Этот метод хорош тем, что он работает "из коробки", не требует поддержки кода в форме и корректно инициализирует параметры при открытии отчета.

Способ 2: Программная установка через библиотеку стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП, то для установки параметров следует использовать готовые механизмы. Проанализируем работу с общим модулем КомпоновкаДанныхКлиентСервер. Метод УстановитьПараметрДанных этой библиотеки самостоятельно находит параметр и в основных настройках, и в пользовательских, обеспечивая их синхронизацию.

Пример вызова функции:


КомпоновкаДанныхКлиентСервер.УстановитьПараметрДанных(
    ЭтаФорма.Отчет.КомпоновщикНастроек, 
    "ИмяВашегоПараметра", 
    ТекущаяДата()
);

Использование этого метода избавляет разработчика от необходимости знать внутренние идентификаторы настроек и гарантирует, что значение отобразится на форме.

Способ 3: Ручная установка параметра в пользовательских настройках

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

Разберем правильный алгоритм поиска по шагам:

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

Посмотрим на пример кода:


// 1. Ищем параметр в основных настройках по имени
ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаОтчета");

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

В каких событиях формы писать код?

Выбор правильного события формы — залог того, что ваши программные изменения не будут затерты платформой. Проанализируем основные события:

Особенности визуального обновления формы

Иногда даже при правильной установке в ПользовательскиеНастройки визуальное поле на форме остается пустым. В таких случаях мы рекомендуем выполнить следующие действия:

Во-первых, проверьте свойство Использование. Если вы установили значение, но Использование равно Ложь, платформа может проигнорировать установку визуально.

Во-вторых, можно принудительно обновить отображение данных формы, используя метод:


ЭтаФорма.ОбновитьОтображениеДанных();

В-третьих, в некоторых сложных случаях помогает явная перезагрузка настроек в компоновщик:


Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);

Использование параметров сеанса

Если значение вашего параметра зависит от контекста (например, текущий пользователь или основная организация), рассмотрим возможность обращения к параметрам сеанса напрямую в схеме СКД. В поле "Выражение" параметра можно написать:

&ПараметрыСеанса.ТекущийПользователь

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

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

← На главную