Как убрать зависимость видимости поля формы в УТ 11.5 и программно управлять интерфейсом

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

В современных конфигурациях на базе ERP 2.5, КА 2.5 и УТ 11.5 разработчики 1С отошли от классического метода управления элементами формы напрямую через свойства «Видимость» или «Доступность» в модуле самой формы. Теперь всё чаще встречается декларативный подход, при котором логика интерфейса выносится в модуль менеджера объекта. В этой статье мы подробно разберем, как работает этот механизм, что такое НастройкиПолей и ЗависимостиПолей, и как сделать поле всегда видимым, даже если система пытается его скрыть.

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

Проанализируем ситуацию: вы пытаетесь программно установить Элементы.ИмяПоля.Видимость = Истина, но при открытии формы или изменении любого реквизита поле всё равно исчезает. Причина кроется в работе специализированной процедуры НастроитьЭлементыФормы. Рассмотрим фрагмент кода, который отвечает за это поведение:


Процедура НастроитьЭлементыФормы(Форма, ИзмененныйРеквизит = "", ДополнительныеРеквизиты = Неопределено) Экспорт
    СвойстваЭлементовФормы = СвойстваЭлементовФормы(Форма.Объект, Форма.НастройкиПолей, Форма.ЗависимостиПолей, ИзмененныйРеквизит, ДополнительныеРеквизиты);
    Для каждого СвойстваЭлемента Из СвойстваЭлементовФормы Цикл
        // ... проверка заполнения ИмяЭлемента ...
        ИмяЭлемента = ИмяЭлементаФормы(СвойстваЭлемента.ИмяЭлемента);
        Если СвойстваЭлемента.Свойство = "ВидимостьЭлемента" Тогда
            Форма.Элементы[ИмяЭлемента].Видимость = СвойстваЭлемента.Значение;
        Иначе
            Форма.Элементы[ИмяЭлемента][СвойстваЭлемента.Свойство] = СвойстваЭлемента.Значение;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Что такое НастройкиПолей и ЗависимостиПолей

Давайте разберем эти структуры подробнее, так как именно в них заложена логика отображения полей документа или справочника.

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

В последних релизах УТ 11.5 эти данные инициализируются при создании формы на сервере путем обращения к модулю менеджера объекта. Это позволяет унифицировать поведение полей в форме документа, форме списка и различных помощниках.

Где искать логику заполнения настроек

Посмотрим на решение основной проблемы: где найти код, который наполняет эти структуры данными? Как правило, это происходит в модуле менеджера объекта (например, Документа или Справочника) в процедуре ЗаполнитьНастройкиПолейФормы.

Рассмотрим примерную структуру этой процедуры в модуле менеджера:


Процедура ЗаполнитьНастройкиПолейФормы(НастройкиПолей, ЗависимостиПолей, ОписаниеОбъекта) Экспорт
    // Регистрация поля
    НоваяНастройка = НастройкиПолей.Добавить();
    НоваяНастройка.ИмяПоля = "ГруппаТехническиеСведения";
    
    // Добавление зависимости
    НоваяЗависимость = ЗависимостиПолей.Добавить();
    НоваяЗависимость.ИмяРеквизита = "Статус";
    НоваяЗависимость.Условие = "Равно";
    НоваяЗависимость.Значение = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Закрыт");
    НоваяЗависимость.ИмяЭлемента = "ГруппаТехническиеСведения";
    НоваяЗависимость.Свойство = "Видимость";
    НоваяЗависимость.ЗначениеСвойства = Ложь;
КонецПроцедуры

Именно этот код заставляет форму скрывать элементы автоматически. Если вы измените видимость в модуле формы, при вызове НастроитьЭлементыФормы (который срабатывает при открытии и при каждом ПриИзменении реквизитов), ваши настройки будут перезаписаны системными.

Пошаговое решение: Как сделать поле всегда видимым

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

Способ 1: Корректировка в модуле менеджера (рекомендуемый)

Этот способ самый правильный, так как он устраняет причину скрытия поля на корню. Нам нужно изменить состав коллекций настроек и зависимостей.

Разберем алгоритм действий:

  1. Создаем расширение для конфигурации.
  2. Добавляем в расширение модуль менеджера нужного объекта.
  3. Используем аннотацию &После для процедуры ЗаполнитьНастройкиПолейФормы.
  4. В коде находим и удаляем ненужные зависимости или принудительно устанавливаем свойства.

Пример кода в расширении:


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

Способ 2: Принудительная установка в модуле формы

Если по каким-то причинам вы не хотите трогать модуль менеджера, можно вмешаться в процесс настройки элементов в самой форме. Однако помните, что процедура НастроитьЭлементыФормы может вызываться из многих мест.

Проанализируем, где в форме происходит вызов. Обычно это обработчики ПриСозданииНаСервере, ПриЧтенииНаСервере и обработчики ПриИзменении ключевых реквизитов. Чтобы «перебить» системную настройку, ваш код должен выполняться строго после вызова процедуры настройки.

Пример в модуле формы через расширение:


&После("НастроитьЭлементыФормы")
Процедура Расш1_НастроитьЭлементыФормы(Форма, ИзмененныйРеквизит = "", ДополнительныеРеквизиты = Неопределено)
    // Устанавливаем видимость принудительно в самом конце
    Если Форма.Элементы.Найти("ИмяВашегоПоля") <> Неопределено Тогда
        Форма.Элементы.ИмяВашегоПоля.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры

Важные нюансы при работе в УТ 11.5

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

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

Резюмируем: Для управления видимостью в УТ 11.5 ищите процедуру ЗаполнитьНастройкиПолейФормы в модуле менеджера. Именно там определяется декларативная модель поведения интерфейса. Использование расширений для изменения содержимого таблиц НастройкиПолей и ЗависимостиПолей является наиболее чистым и надежным способом кастомизации форм.

← На главную