При разработке функционала с использованием механизма расширений конфигурации разработчики часто сталкиваются с ситуацией: в расширение добавляется новый общий модуль (например, ОбщегоНазначенияСерверДобавленный), в коде вызывается его экспортная функция, в режиме «1С:Предприятие» все выполняется без сбоев, но при проверке синтаксиса или сохранении объекта Конфигуратор выдает ошибку вида «Переменная не определена (ИмяМодуля)».
Разберем подробно, почему возникает такое поведение платформы, как устроен контекст синтаксической проверки и какими способами можно избавиться от этой ошибки при разработке внутри расширения и во внешних обработках.
Выясним причину некорректного поведения статического анализатора кода. В зависимости от места вызова модуля источником проблемы служат два фактора:
.epf и .erf) не имеют постоянной привязки к конкретному расширению. Синтаксический контроль внешнего файла опирается строго на состав метаданных основной конфигурации. Любые модули, созданные только в расширениях, отсутствуют в глобальном контексте внешнего файла при его редактировании в Конфигураторе.Если ошибка «Переменная не определена» появляется при проверке модулей внутри самого расширения, выполним простую последовательность действий для обновления метаданных:
F7).После перезапуска сеанса Конфигуратор подтягивает актуальный состав объектов расширения, и проверка синтаксиса проходит штатно.
Если вызов модуля расширения необходимо выполнить из внешней обработки или из модуля основной конфигурации, прямой вызов метода приведет к синтаксической ошибке при сохранении. В типовых конфигурациях (таких как «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация», «1С:Бухгалтерия предприятия») для решения этой задачи предусмотрена функция БСП ОбщегоНазначения.ОбщийМодуль().
Посмотрим на пример вызова экспортной функции модуля расширения:
// Получаем ссылку на общий модуль динамически по имени
МодульРасширения = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначенияСерверДобавленный");
// Вызываем требуемую экспортную функцию
Результат = МодульРасширения.ВыполнитьДействие(Параметр1, Параметр2);
Рассмотрим преимущества этого подхода: статический анализатор кода видит только обращение к стандартному модулю ОбщегоНазначения основной конфигурации, поэтому проверка файла проходит без ошибок, а в режиме «1С:Предприятие» платформа успешно находит и выполняет модуль расширения.
В нетиповых конфигурациях или базах без внедренной БСП для исключения ошибок синтаксис-контроля внешних обработок можно использовать конструкции динамического исполнения кода платформы Вычислить() или Выполнить().
Посмотрим на пример вызова функции:
ИмяФункции = "ОбщегоНазначенияСерверДобавленный.РассчитатьСумму(Параметр1, Параметр2)";
Результат = Вычислить(ИмяФункции);
Если требуется вызвать процедуру, не возвращающую значение, используем оператор Выполнить:
ТекстКоманды = "ОбщегоНазначенияСерверДобавленный.ЗаполнитьДанные(ОбъектОбработки);";
Выполнить(ТекстКоманды);
При таком способе имя модуля проверяется исключительно в момент исполнения на стороне сервера, что предотвращает ошибки синтаксического анализатора при редактировании внешней обработки.
Если внешняя обработка является частью разрабатываемой подсистемы, целесообразно перенести ее из внешнего файла .epf непосредственно в состав объектов расширения. Проанализируем плюсы такого решения:
F12.Если внешняя обработка должна оставаться отдельным файлом и переписывать вызовы через ОбщегоНазначения.ОбщийМодуль() не планируется, можно временно скорректировать поведение самого Конфигуратора:
В этом случае Конфигуратор перестанет блокировать сохранение файла внешнего отчета или обработки, а сам код успешно выполнится в пользовательском режиме «1С:Предприятие».