Как передать в параметре значение свойства элемента формы?

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

При разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача: открыть форму и сразу настроить её внешний вид — например, скрыть кнопку, сделать поле доступным только для чтения или изменить заголовок. Начинающие разработчики часто пытаются сделать это «в лоб», передавая путь к свойству элемента прямо в ключе структуры параметров. Давайте разберем, почему такой подход не работает, и как реализовать эту задачу правильно.

Анализ проблемы: почему «Элемент.Видимость» не работает

Рассмотрим типичную ошибку. Разработчик пытается вызвать форму следующим кодом:


Параметры = Новый Структура("Элементы.ГруппаАдрес.Видимость", Ложь);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", Параметры);

В этой ситуации система выдаст ошибку на этапе создания структуры. Выясним причину: согласно правилам платформы, ключ структуры должен соответствовать правилам именования переменных. Это значит, что ключ не может содержать точки, пробелы, спецсимволы и не может начинаться с цифры. Запись "Элементы.ГруппаАдрес.Видимость" воспринимается системой не как путь к объекту, а как недопустимое имя ключа.

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

Правильный алгоритм реализации: передача флага

Для решения задачи нам необходимо разделить процесс на два этапа: передачу логического флага из исходной формы и его обработку в открываемой форме. Разберем этот процесс по шагам.

Шаг 1. Передача параметра из исходной формы

Вместо попыток передать «путь», мы создаем параметр с простым и понятным именем, который будет служить сигналом для формы:


ПараметрыВызова = Новый Структура;
ПараметрыВызова.Вставить("СкрытьИнформациюОбАдресе", Истина);

ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыВызова);

Шаг 2. Обработка параметра в открываемой форме

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передан ли наш параметр
    Если Параметры.Свойство("СкрытьИнформациюОбАдресе") Тогда
        // Если параметр передан и равен Истина, скрываем элемент
        Если Параметры.СкрытьИнформациюОбАдресе Тогда
            Элементы.ГруппаАдрес.Видимость = Ложь;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Для повышения надежности кода мы рекомендуем использовать механизм формальных параметров. Посмотрим, как это сделать:

  1. Откройте нужную форму в конфигураторе.
  2. Перейдите на закладку «Параметры» (в правой части редактора формы).
  3. Добавьте новый параметр, например, ТолькоПросмотрЗаголовка с типом Булево.

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

Универсальный способ для множества настроек

Иногда нужно изменить свойства сразу десятка элементов. Чтобы не загромождать основную структуру параметров, мы можем передать вложенную структуру. Проанализируем пример:

Код вызова:


НастройкиЭлементов = Новый Структура;
НастройкиЭлементов.Вставить("КнопкаПечать", Ложь);
НастройкиЭлементов.Вставить("ПолеСумма", Истина);
НастройкиЭлементов.Вставить("ГруппаСпецификация", Ложь);

ПараметрыФормы = Новый Структура("ВидимостьЭлементов", НастройкиЭлементов);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаДокумента", ПараметрыФормы);

Код в открываемой форме:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("ВидимостьЭлементов") Тогда
        Для Каждого Настройка Из Параметры.ВидимостьЭлементов Цикл
            // Используем обращение к элементу по имени через квадратные скобки
            ИмяЭлемента = Настройка.Ключ;
            ЗначениеВидимости = Настройка.Значение;
            
            Попытка
                Элементы[ИмяЭлемента].Видимость = ЗначениеВидимости;
            Исключение
                // Обработка случая, если имя элемента передано неверно
                ЗаписьЖурналаРегистрации("Ошибка настройки формы",,, , "Не найден элемент: " + ИмяЭлемента);
            КонецПопытки;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Альтернативные подходы

Рассмотрим ситуации, когда передача параметров может быть избыточной:

1. Функциональные опции. Если видимость элемента зависит от настроек программы (например, «Использовать несколько складов»), лучше использовать механизм функциональных опций. В этом случае платформа сама управляет видимостью элементов без написания программного кода.

2. Условное оформление. Для динамического управления доступностью или цветом полей в табличных частях следует использовать УсловноеОформление формы. Это работает быстрее и корректно обновляется при изменении данных в строках.

3. Права доступа. Если скрытие элемента связано с безопасностью, лучше настроить видимость по ролям непосредственно в свойствах элемента формы в конфигураторе. Это гарантирует, что пользователь не сможет обойти ограничение через технические средства.

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

← На главную