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