Разберем частую ситуацию при разработке в 1С, когда мы используем несколько расширений (например, стороннее расширение для интеграции и наше собственное). При вызове функции из общего модуля стороннего расширения код отлично работает в режиме "1С:Предприятие", но при синтаксическом контроле модуля в Конфигураторе появляется ошибка:
Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code); // (Проверка: Сервер)
// Переменная не определена (OPI_GoogleWorkspace)
Проанализируем, почему это происходит, и рассмотрим проверенные способы устранения этой раздражающей ошибки.
Проблема кроется в архитектурных особенностях платформы 1С и механизме работы синтаксического контроля. Выясним основные причины:
Рассмотрим по шагам несколько эффективных методов, которые помогут нам победить данную ошибку.
Если код работает исправно в пользовательском режиме, но ошибка синтаксического контроля мешает автоматической проверке конфигурации (например, перед коммитом), мы можем скрыть этот вызов от компилятора. Для этого перенесем момент вызова из Конфигуратора в режим исполнения, используя динамическое выполнение кода.
Посмотрим на пример с использованием функции Вычислить (подходит, если вызываемая функция возвращает значение):
// Вместо прямого вызова:
// Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);
// Используем Вычислить:
Результат = Вычислить("OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code)");
Также рассмотрим вариант с использованием оператора Выполнить (полезно для процедур):
Выполнить("Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);");
При таком написании синтаксический контроль перестанет искать переменную на этапе сохранения модуля, и ошибка гарантированно исчезнет, так как вычисление произойдет уже тогда, когда оба расширения будут загружены и увидят друг друга.
Как показывает практика, иногда достаточно просто дать платформе время. Если открыть стороннее расширение в конфигураторе параллельно с вашим и оставить конфигуратор в покое на 10-15 минут, фоновые процессы платформы обновят внутренний кэш метаданных. После этого синтаксический контроль начинает "видеть" контекст соседнего расширения, и ошибка исчезает сама собой.
На последних релизах платформы кэш конфигуратора может вести себя непредсказуемо, особенно при частых доработках расширений. Если проблема сохраняется, закройте конфигуратор, остановите службу сервера 1С (если работаете с серверной базой) и выполните полную очистку кэша сеансов. Это принудительно заставит платформу перестроить связи между расширениями при следующем запуске.
Убедитесь, что у вашего расширения и у стороннего расширения установлены одинаковые версии в свойстве Режим совместимости. Разные режимы могут вызывать аномалии при перекрестных вызовах процедур.
Чтобы принудительно обновить внутренние связи объектов в информационной базе без жесткой чистки кэша и остановки служб, выполним следующий трюк:
.cfe.Это действие заново инициализирует область видимости модулей, после чего синтакс-контроль должен успешно пройти проверку.