При разработке расширений в системе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда новый реквизит, добавленный к объекту (справочнику или документу) в расширении, упорно отказывается появляться в дереве реквизитов захваченной формы. Вы открываете форму в редакторе, разворачиваете основной реквизит Объект, но созданного вами поля там нет. При этом в самом объекте расширения реквизит присутствует, и даже конструктор запроса его "видит".
Разберем подробно причины этого поведения платформы и изучим пошаговые алгоритмы решения проблемы, от простых манипуляций в конфигураторе до программных методов обхода ошибки.
Проанализируем наиболее частую причину: рассинхронизацию метаданных. Когда мы захватываем форму в расширение, она "запоминает" структуру основного объекта на момент захвата. Если позже мы добавляем реквизит в сам объект внутри расширения, визуальный редактор формы может не обновить связи автоматически. Рассмотрим, как принудительно обновить список доступных полей.
Объект).СправочникОбъект.Договоры), который уже там указан.В этот момент платформа инициирует пересчет состава полей. Посмотрим на дерево реквизитов: в подавляющем большинстве случаев после этого действия созданный вами реквизит появится в списке под объектом, и его можно будет перетащить на форму мышкой.
Выясним неочевидную особенность работы платформы с правами доступа в контексте расширений. Если в вашем расширении создана хотя бы одна роль, механизм автоматического назначения прав может измениться. Платформа начинает считать, что управление доступом к новым объектам расширения должно быть описано явно.
Проанализируем ситуацию: если роль создана, но в ней не указаны права на новый реквизит, конфигуратор может скрывать это поле из редактора формы, так как считает его недоступным для контекста приложения. Рассмотрим варианты решения:
Важно понимать, что даже если вы работаете под пользователем с полными правами из основной конфигурации, наличие пустой роли в расширении может "сбивать" визуальное отображение в конфигураторе.
Если визуальное дерево реквизитов все еще не отображает нужное поле, мы можем воспользоваться тем фактом, что фактически реквизит в базе существует. Разберем способ "прямого подключения" элемента формы к данным.
Объект.ИмяВашегоРеквизита (где "ИмяВашегоРеквизита" — это точное имя реквизита, как вы его создали в расширении).Enter.Если платформа не выдала ошибку "Путь к данным не обнаружен", значит, связь установлена. Несмотря на отсутствие в визуальном списке выбора, поле будет корректно отображаться и работать в режиме предприятия.
В случаях, когда типовая форма слишком сложная или механизмы расширения работают некорректно из-за режима совместимости, наиболее надежным способом будет программное создание элемента. Посмотрим на пример кода, который позволяет обойти любые визуальные баги конфигуратора.
Для реализации этого метода создадим в модуле формы процедуру-перехватчик ПриСозданииНаСервере. Выберем тип расширения &НаСервере и метод После.
&НаСервере
Процедура ИмяПрефикс_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Определим имя нового элемента
ИмяЭлемента = "ИмяПрефикс_МойНовыйРеквизит";
// Проверим, не был ли элемент уже добавлен (защита от повторного вызова)
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
// Добавляем новое поле на форму в нужную группу (например, Элементы.ОсновнаяГруппа)
// Если группа не указана, добавится в корень формы
НовоеПоле = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.ГруппаСодержащаяПоля);
// Указываем путь к данным реквизита, созданного в расширении
НовоеПоле.ПутьКДанным = "Объект.ИмяРеквизитаВРасширении";
// Настраиваем визуальные свойства
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.Заголовок = "Название поля для пользователя";
// Если это флажок (Булево), изменим вид
// НовоеПоле.Вид = ВидПоляФормы.ПолеФлажка;
КонецЕсли;
КонецПроцедуры
Рассмотрим преимущества этого подхода: он гарантирует, что элемент появится на форме независимо от того, как отработал визуальный редактор конфигуратора. Это особенно полезно, когда основная конфигурация часто обновляется, и захваченные формы могут "слетать".
Если ни один из вышеперечисленных методов не помог, проанализируем еще несколько технических моментов:
%LocalAppData%\1C\1cv8 и %AppData%\1C\1cv8, после чего заново открыть проект.Выясним, какой метод подходит вам: для быстрой правки используйте Метод 1 (перевыбор типа), а для обеспечения максимальной стабильности при будущих обновлениях — Метод 4 (программное добавление). Комбинируя эти знания, вы сможете эффективно работать с расширениями даже при возникновении подобных технических сложностей.