Почему добавленный в расширении реквизит объекта не виден на форме и как это исправить

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

Работа с расширениями в 1С:Предприятие 8.3 — это мощный инструмент, позволяющий модифицировать типовые конфигурации без снятия их с поддержки. Однако программисты часто сталкиваются с ситуацией, когда новый реквизит успешно добавлен в объект (например, в документ или справочник) внутри расширения, но при открытии заимствованной формы в конфигураторе этот реквизит отсутствует в дереве данных Объект. Рассмотрим подробно, почему это происходит и как решить проблему несколькими способами.

Проблема синхронизации метаданных в конфигураторе

Когда мы добавляем новый реквизит в объект расширения, платформа должна обновить описание типов для всех форм этого объекта, которые также заимствованы в это расширение. Однако механизм обновления метаданных в конфигураторе не всегда срабатывает автоматически. В результате в дереве реквизитов формы (справа) мы видим старую структуру основного реквизита Объект, где нашего нового поля еще нет.

Проанализируем первый и самый быстрый способ «принудительного» обновления структуры данных формы:

  1. Откроем заимствованную форму в расширении.
  2. В правой части окна (вкладка Реквизиты) найдем основной реквизит формы — обычно он называется Объект и имеет тип соответствующего документа или справочника.
  3. Выделим этот реквизит и откроем его палитру свойств.
  4. Найдем свойство Тип и нажмем на кнопку выбора (три точки).
  5. В открывшемся окне выбора типа данных не нужно ничего менять. Просто нажмем кнопку ОК.

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

Заимствование формы и связей объекта

Иногда проблема кроется в том, что форма была заимствована раньше, чем в объект был добавлен новый реквизит, и связь между ними «залипла». Выясним, как правильно актуализировать состав заимствованной формы. Если простое обновление типа не помогло, попробуем следующий алгоритм:

  1. Убедимся, что и объект, и форма находятся в одном и том же расширении.
  2. Проверим свойство реквизита формы Объект. В некоторых случаях требуется явно указать платформе, что данный реквизит должен использовать расширенную версию метаданных.
  3. Попробуем закрыть все вкладки конфигуратора, выполнить сохранение (F7) и заново открыть форму. В ряде релизов платформы 8.3 (включая 8.3.18) это помогает кэшу метаданных обновиться.

Программный вывод реквизита — лучший путь для поддержки

Разберем важный архитектурный момент. Опытные разработчики рекомендуют не заимствовать форму целиком в расширение, если ваша задача — просто добавить одно поле. Заимствование формы «замораживает» её состояние на момент внесения изменений. Если в основной конфигурации при обновлении (например, от фирмы 1С) форма изменится, ваша заимствованная форма в расширении останется старой, что может привести к ошибкам или потере функционала.

Рассмотрим более надежный метод — программное добавление реквизита на форму. Для этого нам не нужно переносить саму форму в расширение в визуальном редакторе. Мы можем использовать расширение модуля формы. Посмотрим на пример кода, который добавляет поле на форму динамически:


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

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

Права доступа и видимость в режиме «Предприятие»

Бывает ситуация, когда в конфигураторе реквизит на форму выведен, всё отображается корректно, но при запуске в режиме «Предприятие» поле исчезает. Проанализируем возможные причины:

  1. Роли и права: При добавлении нового реквизита в расширение, права на него в стандартных ролях основной конфигурации отсутствуют. Вам необходимо создать новую Роль в самом расширении, дать в ней права на чтение и редактирование этого реквизита и назначить эту роль пользователю.
  2. Безопасный режим: Проверьте свойства расширения. Если установлен Безопасный режим, работа с данными может быть ограничена. Хотя для обычного добавления реквизитов это редко является препятствием, рекомендуется для отладки временно снять этот флаг.
  3. Функциональные опции: Убедитесь, что видимость реквизита не управляется какой-либо функциональной опцией, которая выключена в базе.

Особенности работы с БСП

Если вы работаете с конфигурацией на базе БСП (Библиотека стандартных подсистем), помните, что формы часто строятся динамически. В этом случае прямое заимствование формы может конфликтовать с механизмами УправлениеФормами. Выясним причину: БСП может программно переопределять видимость или доступность элементов при открытии. Поэтому программное добавление через ПутьКДанным = "Объект.ИмяРеквизита" является самым стабильным вариантом.

Подводя итог, если реквизит не появляется в дереве данных формы — обновите тип данных основного реквизита Объект. Если же вы стремитесь к качественному коду, который легко обновлять — используйте программное добавление элементов формы через расширение модуля.

← На главную