При параллельной разработке нескольких расширений в среде 1C:EDT разработчики часто сталкиваются с ситуацией, когда одно расширение должно использовать код или экспортируемые функции другого. Однако среда разработки при вводе имени общего модуля из соседнего проекта не отображает контекстную подсказку по Ctrl+Space и сигнализирует об ошибке синтаксического контроля. Разберем по шагам, почему так происходит, какие архитектурные ограничения заложены платформой и как правильно выстроить взаимодействие между компонентами.
Проанализируем устройство рабочего пространства в 1C:EDT. Каждый проект расширения жестко привязан к проекту основной конфигурации. Механизм явного указания зависимостей вида «расширение зависит от другого расширения» в штатной поставке среды отсутствует. Индексатор кода и контекстный анализатор строят дерево видимости метаданных исключительно на основе основной конфигурации и текущего открытого проекта. По этой причине модули и функции соседнего расширения физически не попадают в область видимости анализатора.
Позиция разработчиков среды разработки и платформы 1С заключается в том, что прямая зависимость между независимыми расширениями нарушает принципы модульности. Если одно расширение перестанет работать, будет отключено пользователем или удалено при обновлении, второе расширение сразу же вызовет критическую ошибку в пользовательском сеансе.
Выясним причину, почему прямой синтаксический вызов может работать в режиме выполнения, но выдавать ошибку в среде разработки. В режиме 1С:Предприятие все активные расширения объединяются в единое метаописание сеанса. Метод соседнего расширения отработает успешно, но только при строгом соблюдении порядка их подключения. На порядок влияют:
Исправление, затем Адаптация, затем Дополнение).Если расширение-потребитель загрузится раньше расширения-донора, платформа выбросит исключение времени выполнения из-за отсутствия нужного общего модуля.
Чтобы избежать ошибок статической валидации в 1C:EDT и обеспечить корректный запуск, рассмотрим механизм динамического получения модуля через Библиотеку стандартных подсистем. Обращение по имени исключает проверку существования модуля на этапе компиляции проекта.
Посмотрим на пример безопасного вызова экспортного метода на стороне сервера:
Модуль = ОбщегоНазначения.ОбщийМодуль("ИмяОбщегоМодуля");
Модуль.ИмяЭкспортногоМетода(Параметры);
Если код выполняется в контексте клиента или на обеих сторонах, используем соответствующий модуль ОбщегоНазначенияКлиентСервер. Такой подход гарантирует, что среда разработки не будет отмечать строку как ошибочную.
Поскольку расширение-донор может быть деактивировано администратором базы, любой вызов между расширениями необходимо защищать от аварийного завершения сеанса. Разберем реализацию с перехватом исключений:
Попытка
Модуль = ОбщегоНазначения.ОбщийМодуль("ИмяОбщегоМодуля");
Модуль.ИмяЭкспортногоМетода(Параметры);
Исключение
ЗаписьЖурналаРегистрации(
"ИнтеграцияРасширений",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось выполнить метод соседнего расширения: " + ОписаниеОшибки()
);
КонецПопытки;
Если контекстная подсказка (автодополнение методов и навигация по F12) критически необходима в процессе написания кода, рассмотрим применение внешних плагинов сообщества для 1C:EDT. Существуют плагины расширения BSL-контекста, позволяющие вручную связать несколько проектов расширений внутри одного рабочего пространства. Они модифицируют контекст анализатора и добавляют экспортные процедуры и функции смежного проекта в окно автодополнения.
Если функционал одного расширения тесно переплетен с другим, проанализируем альтернативные способы компоновки: