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

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

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

Способ 1: Визуальное добавление через конфигуратор (интерактивный метод)

Чаще всего проблема заключается в том, что форма в расширении «не видит» изменений в структуре объекта до тех пор, пока мы не укажем ей на это явно. Проанализируем типичную ситуацию: вы добавили реквизит Расш1_ДополнительнаяИнфо в справочник Номенклатура внутри расширения. Затем вы добавили форму этого справочника в расширение, открыли её, но в дереве данных в правой части редактора формы вашего реквизита нет.

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

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

Важно помнить, что если на форме включено свойство Автозаполнение, реквизит может появиться сам, но для контроля над интерфейсом лучше добавлять его вручную в нужную группу или вкладку. Также обратите внимание на свойство «Назначение» самого расширения. Если оно установлено в значение «Адаптация», то добавление реквизитов в БД может быть ограничено. Для полноценной работы с новыми данными используйте назначение «Дополнение».

Способ 2: Программное добавление реквизитов и элементов управления

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

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

Рассмотрим пример кода для программного добавления поля:


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

КонецПроцедуры

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


// Вставляем поле сразу после типового поля "Наименование"
ЭлементВыравнивания = Элементы.Наименование;
НовыйЭлемент = Элементы.Вставить(ИмяРеквизита, Тип("ПолеФормы"), ГруппаРодитель, ЭлементВыравнивания);

Программное создание реквизитов формы (не связанных с объектом базы)

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

Разберем этот процесс детально:


&После("ПриСозданииНаСервере")
Процедура Расш1_ДобавитьСвоюТаблицуНаФорму(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Важные рекомендации по работе с реквизитами в расширениях

При добавлении реквизитов (как через визуальный редактор, так и программно) следует придерживаться определенных правил, чтобы избежать проблем в будущем. Проанализируем основные риски:

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

← На главную