Как добавить форму в расширение 1С без ее содержимого и лишних реквизитов

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

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

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

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

Принцип дифференциального объединения форм в 1С

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

  1. Если элемент формы в расширении не изменялся и не удалялся явно, платформа берет его актуальное состояние из основной базы.
  2. Если из заимствованной формы в расширении вручную удалить все реквизиты и элементы (оставив лишь пустой «скелет»), в режиме пользователя форма все равно отобразится полностью со всеми штатными полями основной конфигурации.
  3. Из расширения применятся только вновь созданные реквизиты, добавленные кнопки или измененные обработчики событий.

Таким образом, для безопасной работы формы в расширении нам необходимо избавиться от «тяжелого» дерева элементов, перенесенного при заимствовании.

Способ 1. Заимствование с последующей очисткой формы

Это самый прямой и распространенный метод работы в Конфигураторе. Разберем его по шагам:

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

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

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

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

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

  1. Динамическое добавление реквизитов формы через метод ИзменитьРеквизиты().
  2. Динамическое создание элементов интерфейса с помощью коллекции Элементы.Добавить().
  3. Связывание событий новых элементов с процедурами-обработчиками через метод УстановитьДействие().

Проанализируем пример кода в модуле формы расширения:


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

&НаКлиенте
Процедура Расш1_ДополнительныйКомментарийПриИзменении(Элемент)
    
    // Логика обработки изменения поля
    Сообщить("Значение поля изменено на: " + ЭтаФорма["Расш1_ДополнительныйКомментарий"]);
    
КонецПроцедуры

Обратите внимание: Сам обработчик события (процедура Расш1_ДополнительныйКомментарийПриИзменении) должен быть обязательно прописан в модуле формы или в модуле расширения этой формы. Внешние модули для этого не подойдут.

Способ 3. Перенос формы из «пустой» конфигурации

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

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

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

Способ 4. Доработка интерфейса через механизмы БСП (без заимствования формы)

Если целевая конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), во многих случаях форму заимствовать вообще не требуется. Для добавления новых команд и кнопок используются штатные механизмы:

Рекомендации по настройке контроля свойств и обновлению

Для предотвращения критических сбоев при обновлении конфигурации соблюдайте следующие правила:

← На главную