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