Почему реквизит на управляемой форме 1С становится невидимым до процедуры «ПриСозданииНаСервере»?

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

При разработке и доработке управляемых форм в платформах «1С:Предприятие 8.3» разработчики часто сталкиваются с непонятным поведением интерфейса: в свойствах элемента в конфигураторе установлена флаг Видимость = Истина, у пользователя полные права, но при закуске отладчика прямо на первой строчке процедуры ПриСозданииНаСервере значение свойства Элементы.ИмяЭлемента.Видимость уже равно Ложь.

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

Последовательность событий: роль процедуры «ПриЧтенииНаСервере»

Основная причина скрытия элемента до входа в ПриСозданииНаСервере заключается в порядке работы платформы при открытии уже существующего объекта БД (документа, справочника). Разберем хронологию выполнения серверных обработчиков:

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

Если в конфигурации или типовом решении (например, в «1С:Комплексная автоматизация» или «1С:ERP») видимость реквизита зависит от настроек объекта, код скрытия полей чаще всего выносится в процедуру ПриЧтенииНаСервере или вызываемые из нее общие модули.

Проанализируем пример кода, который часто размещают в модуле формы для скрытия реквизита Подразделение в зависимости от функциональных опций:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    // Видимость элемента меняется ДО выполнения ПриСозданииНаСервере
    ИспользоватьПодразделения = ПолучитьФункциональнуюОпцию("ИспользоватьПодразделения");
    Элементы.Подразделение.Видимость = ИспользоватьПодразделения;
    
КонецПроцедуры

Когда отладчик останавливается на первой строчке процедуры ПриСозданииНаСервере, значение видимости уже изменено на этапе чтения объекта. При поиске причин скрытия полей всегда проверяйте наличие процедуры ПриЧтенииНаСервере в модуле формы и перехватывайте выполнение кода отладчиком начиная с нее.

Другие факторы, меняющие видимость до «ПриСозданииНаСервере»

Если в процедуре ПриЧтенииНаСервере код изменения полей отсутствует, проанализируем альтернативные источники влияния на видимость:

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

Особенности изменения видимости команд на формах списков

Отдельный класс проблем возникает при попытке программно скрыть кнопки или общие команды на формах динамических списков. Рассмотрим ситуацию, когда на сервере устанавливается Видимость = Ложь, но при переходе на клиент в событии ПриОткрытии видимость элемента снова сбрасывается в Истина.

Проанализируем пример кода клиента:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // На клиенте видимость кнопки командной панели снова восстановилась в ИСТИНА
    // Не смотря на то, что на сервере устанавливалось значение ЛОЖЬ
КонецПроцедуры

Выясним причины такого поведения системы на формах списков:

  1. Включенное автозаполнение командной панели: У командных панелей списков по умолчанию включено свойство Автозаполнение = Истина. При передаче управления на клиент платформа динамически формирует состав кнопок и восстанавливает видимость элементов, привязанных к стандартным командам и правам доступа.
  2. Права доступа и роли: Если у роли пользователя активировано разрешение на просмотр команды или объекта, платформа при инициализации командного интерфейса на клиенте может принудительно отобразить кнопку.

Рекомендации по управлению видимостью

Для надежного управления отображением полей и кнопок управляемой формы используем следующие подходы:

  1. Отключение автозаполнения командных панелей: На формах списков устанавливайте у командной панели свойство Автозаполнение = Ложь, добавляйте нужные кнопки вручную и управляйте видимостью созданных элементов.
  2. Использование свойств пользовательской видимости: Для скрытия элементов с учетом прав проверяйте не только Элементы.ИмяЭлемента.Видимость, но и Элементы.ИмяЭлемента.ПользовательскаяВидимость.
  3. Командный интерфейс формы: Для общих команд регулируйте видимость не у физической кнопки на форме, а у самой команды в составе командного интерфейса формы.
← На главную