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