Как отобразить добавленный в расширении реквизит на заимствованной форме

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

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

Способ 1: Принудительное обновление состава реквизитов в редакторе

Это самый простой и эффективный метод, который помогает в большинстве случаев. Когда мы заимствуем форму в расширение, она сохраняет «слепок» структуры объекта на момент заимствования. Если после этого вы добавили новый реквизит в сам объект внутри расширения, форма об этом «не узнает» автоматически.

Проанализируем последовательность действий для актуализации данных:

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

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

Способ 2: Программное добавление элемента формы

В некоторых случаях, особенно при использовании старых режимов совместимости (например, 8.3.12 или 8.3.14), визуальный конструктор может продолжать игнорировать изменения. В такой ситуации мы можем прибегнуть к программному методу управления интерфейсом. Рассмотрим, как это сделать в модуле формы.

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


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

В данном примере мы используем префикс мп_. Это критически важная практика при работе с расширениями. Рассмотрим подробнее, почему это необходимо: если в будущем разработчик основной конфигурации добавит реквизит с таким же именем, возникнет конфликт имен, который может привести к невозможности обновления базы данных или потере данных. Использование уникальных префиксов полностью нивелирует этот риск.

Способ 3: Перезаимствование формы

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

  1. Убедимся, что программный код в модуле формы (если он есть в расширении) сохранен в отдельном текстовом файле.
  2. Удалим форму из расширения.
  3. Снова найдем эту форму в основной конфигурации и выберем Добавить в расширение.

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

Особенности производительности и хранения данных

Проанализируем техническую сторону вопроса. Нужно понимать, что реквизиты, добавленные через расширение, физически хранятся в СУБД в отдельных таблицах. При каждом обращении к объекту платформа выполняет соединение (JOIN) основной таблицы с таблицей расширения. Хотя для одного-двух реквизитов это практически незаметно, массовое добавление полей в расширение может незначительно снизить скорость выборки данных.

Также важно учитывать Режим совместимости. В версиях платформы ниже 8.3.15 возможности расширений были более ограничены. Если вы работаете в режиме 8.3.12, обязательно убедитесь, что все объекты, на которые ссылается ваш новый реквизит (например, типы данных справочников или перечислений), также добавлены в это же расширение. Если типа данных нет в расширении, реквизит может стать «невидимым» для формы из-за невозможности определить его свойства.

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

← На главную