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