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