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