При разработке в среде 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда созданный общий модуль не удается вызвать из модуля формы или объекта. Система выдает ошибку о том, что переменная с именем модуля не определена. Проанализируем основные причины этой проблемы и разберем варианты её решения.
Главная причина, по которой конфигуратор или компилятор «не видит» общий модуль при обращении вида ИмяМодуля.ИмяПроцедуры(), заключается в установленном флаге Глобальный в свойствах этого модуля.
Рассмотрим, в чем разница между обычным и глобальным общим модулем:
УчетНоменклатурыКлиентСервер.ПосчитатьСумму().Рассмотрим по шагам два способа исправления ошибки в зависимости от вашей архитектурной задачи.
В современной разработке (включая конфигурации на базе БСП, такие как УТ 11, ERP, КА) использование глобальных модулей стараются минимизировать, чтобы не засорять глобальное пространство имен и избегать конфликтов вызовов.
Экспорт.После этого вы сможете обращаться к методам модуля стандартным образом:
// Вызов из модуля формы или объекта
ПересчитатьТабЧасть.ПосчитатьСумму(СтрокаСостава);
Если модуль обязательно должен оставаться глобальным, измените синтаксис вызова в коде формы. Удалите имя модуля и оставьте только имя экспортной процедуры или функции.
Пример неправильного вызова глобального модуля:
// Вызовет ошибку "Переменная не определена (ПересчитатьТабЧасть)"
ПересчитатьТабЧасть.ПосчитатьСумму(СтрокаСостава);
Пример правильного вызова:
// Прямой вызов метода из глобального контекста
ПосчитатьСумму(СтрокаСостава);
Если после настройки флага «Глобальный» модуль всё равно недоступен, проанализируем дополнительные аспекты контекста выполнения:
Экспорт в заголовке, иначе она будет приватной для модуля.&НаКлиенте, а у общего модуля включен только флаг Сервер, платформа не позволит обратиться к нему напрямую. В этом случае у модуля должен быть установлен флаг Вызов сервера, либо вызов должен происходить из серверного контекста формы (&НаСервере или &НаСервереБезКонтекста).