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