Как исправить ошибку «Переменная не определена (КонтекстЭДО)» при проверке конфигурации в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выполнении синтаксического контроля через меню Конфигурация → Проверка конфигурации... разработчики нередко сталкиваются с сообщением об ошибке вида: {ОбщийМодуль.ВыгрузкаВФНСКлиентПереопределяемый.Модуль(69,7)}: Переменная не определена (КонтекстЭДО) (Проверка: Тонкий клиент). При этом быстрая проверка текущего модуля по горячим клавишам может не находить никаких проблем. Разберем детально, почему возникает данная ситуация и как правильно восстановить работоспособность конфигурации.

Проанализируем сначала разницу между типами проверок в платформе «1С:Предприятие»:

  1. Проверка модуля (Ctrl + F7) выполняет синтаксический анализ программного кода исключительно в текущем контексте, заданном в конфигураторе в данный момент.
  2. Проверка конфигурации последовательно имитирует компиляцию всех модулей во всех целевых средах исполнения: Тонкий клиент, Веб-клиент, Сервер, Толстый клиент (управляемое приложение) и Толстый клиент (обычное приложение). Ошибка возникает тогда, когда модуль скомпилирован под клиентский контекст, где глобальная переменная не существует или не инициализирована.

Причины возникновения ошибки

Выясним главные источники появления ошибки Переменная не определена (КонтекстЭДО):

  1. Некорректное или частичное обновление нетиповой конфигурации. Если конфигурация находится на поддержке с возможностью изменения и обновлялась выборочно, часто возникает рассинхронизация. Например, основной Модуль управляемого приложения или подсистема взаимодействия с контролирующими органами обновились, а зависимые переопределяемые общие модули остались старой версии (или наоборот).
  2. Изменение архитектуры подсистем БСП и регламентированной отчетности. В устаревших редакциях переменная КонтекстЭДО объявлялась глобально на клиенте, а в актуальных релизах механизмы ЭДО и 1С-Отчетности перешли на вызовы функций общих модулей. Прямой вызов устаревшей глобальной переменной в обновленном окружении вызывает синтаксический сбой.
  3. Несоответствие контекстов модуля. Переменная могла быть объявлена только в модуле обычного приложения, тогда как общий модуль ВыгрузкаВФНСКлиентПереопределяемый компилируется также и для тонкого клиента.

Способ 1. Сравнение и объединение с эталонной конфигурацией поставщика (CF)

Если в информационной базе выполнялись доработки, наиболее надежный путь — привести типовые модули подсистемы отчетности в строгое соответствие с релизом поставщика.

Разберем по шагам алгоритм восстановления:

  1. Получим файл поставки (дистрибутив или чистый .cf) в точности того же релиза, до которого обновлялась рабочая база.
  2. В конфигураторе откроем меню Конфигурация → Сравнить, объединить с конфигурацией из файла... и выберем файл эталонной конфигурации (либо воспользуемся пунктом Конфигурация → Поддержка → Сравнить конфигурации для сравнения с конфигурацией поставщика).
  3. В открывшемся дереве сравнения найдем модуль ВыгрузкаВФНСКлиентПереопределяемый, а также корневые модули (Модуль управляемого приложения, Модуль обычного приложения).
  4. Проверим состояние флажков: для типовых модулей, не содержащих пользовательских доработок, установим режим полной перезаписи из конфигурации поставщика.
  5. Выполним объединение и повторим проверку конфигурации.

Способ 2. Проверка объявления глобальной переменной

Рассмотрим случай, когда архитектура конфигурации предполагает наличие глобальной переменной, но ее экспортное объявление было утеряно при слиянии версий.

Проверим наличие объявления в модулях приложения:

  1. Откроем Модуль управляемого приложения.
  2. В самом начале модуля (в секции объявлений переменных) проверим наличие строки:

Перем КонтекстЭДО Экспорт;

Если конфигурация поддерживает работу в режиме обычного приложения, аналогичную строку необходимо проверить в Модуле обычного приложения.

Способ 3. Изоляция контекста директивами препроцессора

Если модуль предназначен для работы только в режиме толстого клиента обычного приложения, а обращение к переменной приводит к ошибке при проверке тонкого клиента, ограничим проблемный блок инструкциями препроцессора.

Посмотрим на пример исправления кода:


#Если ТолстыйКлиентОбычноеПриложение Тогда
    Если КонтекстЭДО = Неопределено Тогда
        // Логика инициализации для обычного приложения
    КонецЕсли;
#КонецЕсли

Способ 4. Корректировка настроек проверки конфигурации

Если прикладное решение эксплуатируется строго в режиме толстого клиента (например, в старых редакциях конфигураций), проверка тонкого и веб-клиента может быть неактуальна.

Разберем настройку окна проверки:

  1. Откроем окно Конфигурация → Проверка конфигурации...
  2. В блоке проверок сред исполнения снимем флаги с пунктов Тонкий клиент и Веб-клиент, оставив только используемые режимы.
  3. Запустим проверку заново для контроля реальных ошибок времени исполнения.
← На главную