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