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