При разработке интерфейсов в 1С часто возникает задача динамического управления элементами формы: скрыть определенные поля при создании нового объекта, сделать их недоступными до момента первой записи или отобразить дополнительные реквизиты только для уже существующего элемента. Способ решения этой задачи напрямую зависит от архитектуры используемых форм — управляемых или обычных.
Разберем подробно все варианты проверки для каждого типа форм и выясним тонкости их применения.
В управляемом интерфейсе форма работает с данными через специальный тип ДанныеФормыСтруктура (основной реквизит Объект), поэтому прямой вызов методов прикладного объекта на клиенте недоступен. Рассмотрим основные способы проверки в управляемых формах.
Первоначальную настройку видимости элементов интерфейса оптимально выполнять на этапе инициализации формы в серверном обработчике ПриСозданииНаСервере. Это исключает визуальное мигание элементов при первой отрисовке окна на клиенте. Если форма открывается для существующего элемента, в структуру Параметры.Ключ передается ссылка на объект.
Посмотрим на пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтоНовыйЭлемент = Параметры.Ключ.Пустая();
// Управляем видимостью элементов формы
Элементы.ГруппаДополнительныеРеквизиты.Видимость = Не ЭтоНовыйЭлемент;
КонецПроцедуры
Если ссылка еще не записана в информационную базу, реквизит Объект.Ссылка будет содержать пустую ссылку соответствующего типа метаданных. Проверить это можно стандартной функцией ЗначениеЗаполнено():
&НаСервере
Процедура НастроитьВидимостьПолей()
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
// Объект уже существует в базе данных
Элементы.ПолеКод.Доступность = Ложь;
Иначе
// Создается новый элемент
Элементы.ПолеКод.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Проанализируем редкую, но важную ситуацию: если объекту перед открытием формы программно была назначена ссылка через метод УстановитьСсылкуНового(), проверка ЗначениеЗаполнено(Объект.Ссылка) вернет Истина, хотя сам элемент в базу еще не записан. Чтобы гарантированно определить статус объекта на сервере, воспользуемся преобразованием данных формы в объект:
&НаСервере
Функция ПроверитьЭтоНовыйОбъект()
ПрикладнойОбъект = РеквизитФормыВЗначение("Объект");
Возврат ПрикладнойОбъект.ЭтоНовый();
КонецФункции
Важный момент: если после первого интерактивного сохранения нового элемента видимость полей должна измениться (например, открыться доступ к подчиненным табличным частям), необходимо вызвать процедуру обновления интерфейса в обработчиках ПослеЗаписиНаСервере или ПослеЗаписи.
В обычных формах логика работы строится напрямую вокруг объекта информационной базы, расширением которого и является форма. Здесь доступен прямой метод объекта ЭтоНовый().
В модуле обычной формы вызов метода ЭтоНовый() доступен через контекст ЭтотОбъект либо напрямую. Настройку элементов интерфейса обычно размещают в обработчиках ПередОткрытием или ПриОткрытии.
Разберем пример кода:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Если ЭтоНовый() Тогда
ЭлементыФормы.ПолеИсторияИзменений.Видимость = Ложь;
Иначе
ЭлементыФормы.ПолеИсторияИзменений.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Если скрытие или блокировка элементов связаны не только с фактом создания объекта, но и с бизнес-логикой конфигурации, рассмотрим дополнительные механизмы платформы 1С:
Ссылка.ПолучитьОбъект().ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Справочники.Номенклатура).Видимость часто удобнее переводить форму или отдельные элементы в режим ТолькоПросмотр = Истина, сохраняя удобство восприятия информации пользователем.