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