При разработке на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача: открыть форму и сразу настроить её внешний вид — например, скрыть кнопку, сделать поле доступным только для чтения или изменить заголовок. Начинающие разработчики часто пытаются сделать это «в лоб», передавая путь к свойству элемента прямо в ключе структуры параметров. Давайте разберем, почему такой подход не работает, и как реализовать эту задачу правильно.
Рассмотрим типичную ошибку. Разработчик пытается вызвать форму следующим кодом:
Параметры = Новый Структура("Элементы.ГруппаАдрес.Видимость", Ложь);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", Параметры);
В этой ситуации система выдаст ошибку на этапе создания структуры. Выясним причину: согласно правилам платформы, ключ структуры должен соответствовать правилам именования переменных. Это значит, что ключ не может содержать точки, пробелы, спецсимволы и не может начинаться с цифры. Запись "Элементы.ГруппаАдрес.Видимость" воспринимается системой не как путь к объекту, а как недопустимое имя ключа.
Даже если использовать Соответствие (Map), где ключи могут быть любыми, метод ОткрытьФорму ожидает именно Структуру. Более того, параметры формы — это лишь «транспорт» для данных, они не связаны напрямую с интерфейсными элементами до тех пор, пока мы не напишем соответствующий код.
Для решения задачи нам необходимо разделить процесс на два этапа: передачу логического флага из исходной формы и его обработку в открываемой форме. Разберем этот процесс по шагам.
Шаг 1. Передача параметра из исходной формы
Вместо попыток передать «путь», мы создаем параметр с простым и понятным именем, который будет служить сигналом для формы:
ПараметрыВызова = Новый Структура;
ПараметрыВызова.Вставить("СкрытьИнформациюОбАдресе", Истина);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыВызова);
Шаг 2. Обработка параметра в открываемой форме
Теперь проанализируем, что происходит в форме, которую мы открываем. Вся логика по настройке интерфейса должна располагаться в обработчике события ПриСозданииНаСервере. Именно здесь платформа позволяет нам программно изменять свойства элементов до того, как форма будет показана пользователю.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли наш параметр
Если Параметры.Свойство("СкрытьИнформациюОбАдресе") Тогда
// Если параметр передан и равен Истина, скрываем элемент
Если Параметры.СкрытьИнформациюОбАдресе Тогда
Элементы.ГруппаАдрес.Видимость = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для повышения надежности кода мы рекомендуем использовать механизм формальных параметров. Посмотрим, как это сделать:
ТолькоПросмотрЗаголовка с типом Булево.Преимущество этого метода в том, что теперь система «знает» о существовании этого параметра. Если вы передадите в структуре ключ с таким же именем, значение автоматически попадет в коллекцию Параметры открываемой формы. Это также помогает при написании кода — контекстная подсказка будет видеть созданный вами параметр.
Иногда нужно изменить свойства сразу десятка элементов. Чтобы не загромождать основную структуру параметров, мы можем передать вложенную структуру. Проанализируем пример:
Код вызова:
НастройкиЭлементов = Новый Структура;
НастройкиЭлементов.Вставить("КнопкаПечать", Ложь);
НастройкиЭлементов.Вставить("ПолеСумма", Истина);
НастройкиЭлементов.Вставить("ГруппаСпецификация", Ложь);
ПараметрыФормы = Новый Структура("ВидимостьЭлементов", НастройкиЭлементов);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаДокумента", ПараметрыФормы);
Код в открываемой форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ВидимостьЭлементов") Тогда
Для Каждого Настройка Из Параметры.ВидимостьЭлементов Цикл
// Используем обращение к элементу по имени через квадратные скобки
ИмяЭлемента = Настройка.Ключ;
ЗначениеВидимости = Настройка.Значение;
Попытка
Элементы[ИмяЭлемента].Видимость = ЗначениеВидимости;
Исключение
// Обработка случая, если имя элемента передано неверно
ЗаписьЖурналаРегистрации("Ошибка настройки формы",,, , "Не найден элемент: " + ИмяЭлемента);
КонецПопытки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуации, когда передача параметров может быть избыточной:
1. Функциональные опции. Если видимость элемента зависит от настроек программы (например, «Использовать несколько складов»), лучше использовать механизм функциональных опций. В этом случае платформа сама управляет видимостью элементов без написания программного кода.
2. Условное оформление. Для динамического управления доступностью или цветом полей в табличных частях следует использовать УсловноеОформление формы. Это работает быстрее и корректно обновляется при изменении данных в строках.
3. Права доступа. Если скрытие элемента связано с безопасностью, лучше настроить видимость по ролям непосредственно в свойствах элемента формы в конфигураторе. Это гарантирует, что пользователь не сможет обойти ограничение через технические средства.
Таким образом, мы выяснили, что прямая передача свойств через структуру невозможна. Правильный путь — передача логических флагов или структур с именами элементов и их последующая обработка в серверном контексте формы при создании.