Как организовать взаимодействие между расширениями и использовать объекты одного расширения в другом?

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

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

Метод 1. Использование механизма зависимостей расширений

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

Проанализируем шаги по настройке зависимостей:

  1. Откроем список расширений в конфигураторе (меню Конфигурация — Расширения конфигурации).
  2. Выберем наше новое расширение (потребитель), в котором мы хотим создать подписку на событие.
  3. В свойствах расширения найдем поле Зависимости.
  4. Добавим в список то расширение (донор), в котором физически расположен нужный нам РегистрСведений.

Важный нюанс: при настройке зависимостей платформа начинает строго контролировать порядок применения. Расширение-донор должно располагаться в списке выше, чем расширение-потребитель. Если мы попытаемся нарушить этот порядок или создать циклическую зависимость (А зависит от Б, а Б от А), система выдаст ошибку при попытке обновления конфигурации базы данных.

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

Метод 2. Объединение расширений в единый функциональный блок

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

Рассмотрим процесс объединения:

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

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

Метод 3. Рефакторинг: перенос объектов в основную конфигурацию

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

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

Рассмотрим алгоритм правильного переноса («приземления») объектов:

  1. Создадим аналогичные объекты метаданных (РегистрСведений, Справочник) непосредственно в основной конфигурации.
  2. Важно: не удаляйте старые объекты из расширения сразу! Сначала нужно обеспечить перенос накопленной информации.
  3. Разработаем обработку для миграции данных. Поскольку с точки зрения SQL таблицы расширения и основной конфигурации — это разные объекты, нам потребуется программно прочитать записи из одного места и записать в другое. Для облегчения этого процесса можно использовать подходы, описанные в обработке для адаптивного переноса данных между базами через XML — для этого подойдёт универсальный перенос данных между объектами и базами.

Пример кода для миграции данных регистра сведений:


Выборка = РегистрыСведений.НашРегистрВРасширении.Выбрать();
Пока Выборка.Следующий() Цикл
    МенеджерЗаписи = РегистрыСведений.НовыйРегистрВКонфе.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
    МенеджерЗаписи.Записать();
КонецЦикла;

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

Особенности подписок на события в расширениях

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

Если нам нужно программно реагировать на запись в регистр, мы создаем объект ОбщаяКоманда.ПодпискаНаСобытие в расширении. При этом важно соблюдать стандарты при разработке подписок на события, особенно в высоконагруженных системах. В качестве источника указываем тип нашего регистра, а в качестве обработчика — процедуру в общем модуле расширения. Убедитесь, что у общего модуля установлены флаги Сервер и Внешнее соединение.

Автоматизация переноса метаданных

Посмотрим на возможности последних версий платформы (8.3.17+). Теперь в контекстном меню объекта, созданного в расширении, доступна команда Перенести в основную конфигурацию. Это значительно ускоряет процесс рефакторинга структуры, о котором мы говорили выше.

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

Контроль имен и префиксов

При работе с несколькими расширениями крайне важно соблюдать уникальность префиксов имен. Проанализируем типичную проблему: если в Расширении 1 создан объект пр_СтатусСогласования и в Расширении 2 создан объект с точно таким же именем, возникнет конфликт.

Всегда используйте уникальные префиксы для своих разработок (например, Корп_, Dev_, Спец_). Это гарантирует, что при подключении новых расширений или обновлении основной конфигурации вы не столкнетесь с ошибкой дублирования имен в пространстве имен платформы. Для комплексного анализа конфигураций и расширений на наличие ошибок рекомендуется использовать специализированные инструменты — для этого подойдёт архитектурный анализ конфигураций и визуализация зависимостей.

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

← На главную