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