Как вывести реквизит объекта, созданный в расширении, на форму в 1С?

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

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

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

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

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

  1. Кэширование пользовательских настроек формы. Это самая распространенная причина. Если вы (или другие пользователи) ранее открывали эту форму и меняли ее расположение, настраивали видимость колонок или просто закрывали ее, платформа сохранила персональные настройки внешнего вида в системном хранилище. При открытии измененной формы система пытается «натянуть» старые сохраненные настройки на новую структуру, в результате чего новый элемент просто игнорируется или скрывается.
  2. Рассинхронизация сохраненной формы в расширении. В процессе разработки и обновлений основная конфигурация может меняться. Если форма в расширении не была синхронизирована с оригиналом из основной конфигурации, метаданные формы могут конфликтовать, блокируя отображение добавленных «руками» элементов.
  3. Отсутствие прав доступа (Роли в расширении). Любой новый объект или реквизит, созданный в расширении конфигурации, по умолчанию закрыт для пользователей. Даже если вы работаете под учетной записью с полными правами основной конфигурации, эти права не распространяются автоматически на новые метаданные расширения. Если у пользователя нет прав на чтение и просмотр нового реквизита, платформа просто скроет связанное с ним поле ввода.
  4. Проблема «тяжелого» заимствования (на старых релизах платформы). При попытке перенести основной реквизит Объект формы в расширение на релизах платформы ниже 8.3.14, система принудительно затягивала за собой огромное количество связанных объектов конфигурации. Это перегружало расширение и приводило к непредсказуемому поведению интерфейса.

Решение №1: Настройка интерактивного отображения (Конфигуратор и Пользовательский режим)

Если вы хотите пойти по пути визуального проектирования интерфейса, необходимо строго соблюдать последовательность действий для предотвращения конфликтов метаданных.

Выполним следующие шаги в Конфигураторе:

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

Теперь, чтобы элемент гарантированно отобразился у пользователей, выполним следующие действия по устранению системных конфликтов:

Шаг 1. Обновление сохраненной формы. В конфигураторе, находясь в редакторе формы расширения, выберем в главном меню пункт Форма -> Обновить сохраненную форму (или воспользуемся аналогичным пунктом в контекстном меню). Это синхронизирует структуру заимствованной формы с актуальным состоянием основной конфигурации.

Шаг 2. Настройка прав доступа. В расширении необходимо создать собственную роль (например, Расш_ОсновнаяРоль), установить для нее признак Устанавливать права для новых объектов или вручную отметить права на «Чтение» и «Просмотр» для нашего нового реквизита. Не забудьте назначить эту роль пользователям через профили групп доступа в режиме предприятия.

Шаг 3. Сброс кэша формы в режиме предприятия. Запустим сеанс «1С:Предприятие». Откроем проблемную форму. Нажмем на кнопку Еще в правом верхнем углу формы и выберем команду Изменить форму.... В открывшемся окне настройки перейдем в меню Еще -> Установить стандартные настройки. Нажмем «ОК».

Если индивидуальные настройки мешают глобально, сбросить их для конкретного пользователя можно через административный раздел программы: Администрирование -> Настройки пользователей и прав -> Очистка настроек.


Решение №2: Программное создание элементов на форме (Рекомендуемый стандарт разработки)

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

Программное добавление элементов полностью решает эту проблему. Мы заимствуем только саму форму (причем исключительно ее модуль, не трогая визуальную структуру) и пишем код, который динамически создает поле на форме в момент ее открытия.

Рассмотрим по шагам, как это реализовать:

  1. Создадим реквизит объекта в расширении (например, Расш_УчетныйНомер).
  2. Добавим форму объекта в расширение. При заимствовании формы не нужно добавлять реквизит Объект или перетаскивать элементы визуально. Оставим дерево элементов формы нетронутым.
  3. Откроем модуль заимствованной формы и найдем (или создадим через контекстное меню заимствования событий) обработчик события ПриСозданииНаСервере. Мы будем использовать аннотацию &После, чтобы наш код выполнился сразу после стандартной инициализации формы системой.

Проанализируем и применим следующий шаблон кода в модуле формы расширения:


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

Давайте подробно разберем, какие преимущества дает этот программный метод:


Развитие платформы 1С: Механизм «ленивого» заимствования

Начиная с версии платформы 8.3.14, фирма «1С» существенно переработала внутренние алгоритмы работы с расширениями. Были внедрены механизмы оптимизированного («ленивого») заимствования и концепция контролируемого изменения форм.

В старых версиях платформы попытка заимствовать форму приводила к тому, что система тащила в расширение все связанные типы данных реквизитов формы. Сейчас этот процесс изолирован: платформа контролирует изменения точечно. Тем не менее, даже на самых современных версиях платформы (8.3.20 и выше) визуальное редактирование форм в расширениях может давать сбои в процессе динамического обновления конфигурации базы данных («демонского» обновления).

Поэтому программное добавление элементов через обработчик ПриСозданииНаСервере с аннотацией &После остается признанным «золотым стандартом» среди разработчиков крупных корпоративных систем на базе 1С:ERP, 1С:КА и 1С:ЗУП.

← На главную