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