Почему добавленный элемент формы не отображается при создании нового документа в 1С?

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

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

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

Основные причины проблемы

Посмотрим, почему поведение формы при создании нового объекта отличается от открытия существующего:

  1. Программное управление видимостью в обработчиках событий: В модуле формы в процедурах ПриОткрытии или ПриСозданииНаСервере прописана логика, которая управляет свойством Видимость элементов формы в зависимости от значений реквизитов документа.
  2. Незаполненные реквизиты при создании объекта: Когда создается новый документ, его ключевые реквизиты (например, организация, договор или валюта) могут быть еще не заполнены или содержать пустые ссылки. Если проверка условий строится на сравнении с конкретным значением, условие возвращает Ложь, и элемент скрывается. В сохраненном документе данные заполнены, поэтому проверка успешно проходит.
  3. Иерархия групп формы: Если добавляемый элемент размещен внутри родительской группы (страница, обычная группа), видимость которой отключена программно, сам элемент также будет скрыт, независимо от собственных настроек.
  4. Права доступа и пользовательская видимость: Использование функциональных опций или ограничений прав на уровне ролей (свойство ПользовательскаяВидимость).

Шаг 1. Анализ кода в событии ПриОткрытии и ПриСозданииНаСервере

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Ошибка: при создании нового документа реквизит Объект.Валюта еще пуст
    Если Объект.Валюта <> ПредопределенноеЗначение("Справочник.Валюты.EUR") Тогда
        Элементы.ВсегоВЕвро.Видимость = Ложь;
    Иначе
        Элементы.ВсегоВЕвро.Видимость = Истина;
    КонецЕсли;

КонецПроцедуры

При открытии существующего документа реквизит Объект.Валюта равен валюте EUR, поэтому поле отображается. Однако при нажатии кнопки Создать реквизит еще не заполнен (содержит пустую ссылку), условие проверки срабатывает, и поле принудительно скрывается с формы.

Шаг 2. Поиск скрывающего кода через отладчик

Чтобы быстро найти, какая именно процедура скрывает элемент, выполним отладку:

  1. Установим точку останова в самом начале клиентской процедуры ПриОткрытии или серверной ПриСозданииНаСервере.
  2. Запустим конфигурацию в режиме отладки и нажмем кнопку создания нового документа.
  3. В окне отладки или табло вычислим выражение: Элементы.ИмяВашегоЭлемента.Видимость.
  4. Пошагово пройдем выполнение кода (клавиша F10/F11) и зафиксируем момент, когда значение свойства сменяется с Истина на Ложь.
  5. Также проверим свойства всех вышестоящих родительских групп: Элементы.ИмяРодительскойГруппы.Видимость.

Шаг 3. Правильное построение логики управления интерфейсом

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

1. Инициализация реквизитов по умолчанию
Заполнение значений по умолчанию выполним в модуле объекта в процедуре ОбработкаЗаполнения или в модуле формы в ПриСозданииНаСервере. Это гарантирует наличие корректных данных еще до расчета видимости элементов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Объект.Ссылка.Пустая() И НЕ ЗначениеЗаполнено(Объект.Валюта) Тогда
        Объект.Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR");
    КонецЕсли;
    
    ОбновитьВидимостьЭлементовНаСервере();

КонецПроцедуры

2. Централизация вызова процедур видимости
Вынесем управление интерфейсом в отдельную процедуру и будем вызывать её как при открытии формы, так и при изменении ключевых реквизитов пользователем:


&НаСервере
Процедура ОбновитьВидимостьЭлементовНаСервере()
    
    ЭтоЕвро = (Объект.Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR"));
    Элементы.ВсегоВЕвро.Видимость = ЭтоЕвро;

КонецПроцедуры

&НаКлиенте
Процедура ВалютаПриИзменении(Элемент)
    
    ОбновитьВидимостьЭлементовНаСервере();

КонецПроцедуры

Выполнение логики изменения видимости на сервере в процедуре ПриСозданииНаСервере предотвратит «мигание» формы при ее открытии на клиенте.

← На главную