Как объединяются изменения формы документа из нескольких расширений в 1С 8.3?

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

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

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

Механизм многослойности и приоритетность расширений

Для начала проанализируем, как платформа 1С воспринимает расширения. Расширения накладываются на основную конфигурацию последовательно, подобно прозрачным слоям в графическом редакторе. Порядок этих слоев определяется списком в окне «Конфигурация — Расширения конфигурации».

Рассмотрим ситуацию по шагам:

  1. Берется форма из основной конфигурации.
  2. На нее накладываются изменения из расширения, стоящего первым в списке.
  3. Сверху накладываются изменения из второго расширения и так далее.

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

Объединение реквизитов и элементов формы

Вернемся к основному вопросу: «сложатся» ли реквизиты, добавленные в разных расширениях? Проведенные технические тесты на платформе 8.3.15 и выше подтверждают: да, изменения суммируются. Рассмотрим, как это работает на практике.

Допустим, у нас есть документ РеализацияТоваровУслуг:

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

Работа программного кода (Обработчики событий)

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

Разберем пример с обработчиком ПриСозданииНаСервере. Если в обоих расширениях прописан этот метод, последовательность вызова будет следующей:

  1. Выполняются все методы с аннотацией &Перед (последовательно от первого расширения к последнему).
  2. Выполняется основной метод из основной конфигурации (если он не перекрыт аннотацией &Вместо).
  3. Выполняются все методы с аннотацией &После (также в порядке очередности расширений).

Пример использования аннотаций в расширении:


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

Такой подход гарантирует, что код одного расширения не помешает работе другого, если они не используют аннотацию &Вместо для полной подмены логики.

Возможные конфликты при изменении структуры

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

Если в Расширении №1 вы переместили стандартное поле Дата в созданную вами Группу_А, а в Расширении №2 это же поле Дата переместили в Группу_Б, платформа не сможет удовлетворить оба условия одновременно. В этом случае сработает правило приоритета: положение элемента определит то расширение, которое находится ниже в списке расширений. Элемент окажется в Группе_Б, а Группа_А из первого расширения может остаться пустой.

Рекомендации по разработке в нескольких расширениях

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

  1. Соблюдайте строгий порядок: Определите регламент, в каком порядке должны подключаться расширения в базе. Это критично для предсказуемости интерфейса.
  2. Программное создание элементов: Вместо визуального перетаскивания элементов в редакторе форм расширения, используйте программное создание в процедуре ПриСозданииНаСервере. Это более надежный способ, так как программный код реже вызывает конфликты компоновки, чем визуальный редактор.
  3. Уникальные имена: Всегда добавляйте префиксы к именам новых реквизитов и элементов (например, РасшЛогистика_СрокДоставки). Это исключит случайное совпадение имен при объединении расширений от разных разработчиков.
  4. Избегайте &Вместо: Старайтесь использовать &Перед и &После. Аннотация &Вместо должна применяться только в крайних случаях, так как она прерывает цепочку вызовов других расширений, что делает невозможным их совместную работу.

Таким образом, использование нескольких расширений для правки одной формы — это мощный и вполне рабочий инструмент в 1С 8.3, начиная с версии 8.3.15. Главное — понимать принципы приоритетности и минимизировать прямые изменения структуры стандартных групп элементов.

← На главную