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

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

При разработке регламентных и фоновых заданий в 1С разработчики нередко сталкиваются с ситуацией: точка останова установлена, в конфигураторе включено автоматическое подключение фоновых заданий, но при старте процесса отладчик не срабатывает, а в журнале регистрации или консоли заданий фиксируется аварийное завершение. Разберем по шагам, почему возникает ошибка инициализации общего модуля, почему отладчик не успевает перехватить поток и как исправить работу серверного кода.

Рассмотрим типовой фрагмент кода, на котором происходит сбой при формировании штрихкода печатной формы:


Функция глСформироватьШтрихКодПечатнойФормы(сДокумент) Экспорт
    Перем пПрефиксНомера;
    пШтрихКод = "27" + ПолучитьСоответствиеПрефиксаШтрихКода(Лев(сДокумент.Номер, 2)) + глПолучитьИндексШтрихКодаДокумента(ТипЗнч(сДокумент)) + Прав(СокрЛП(сДокумент.Номер), 6);
    Возврат пШтрихКод + РаботаСТорговымОборудованием.КонтрольныйСимволEAN13ТО(пШтрихКод);
КонецФункции

При выполнении этого кода в сеансе фонового задания платформа выдает сообщение: «Ошибка инициализации модуля... Переменная не определена (РаботаСТорговымОборудованием)».

Выясним причину: почему отладчик не останавливается на точках останова

Проанализируем механизм выполнения фонового потока на сервере приложений. Существует несколько ключевых факторов, из-за которых отладка фонового задания не срабатывает:

  1. Фатальная ошибка компиляции при инициализации контекста. Фоновое задание выполняется в изолированном серверном сеансе. При старте сеанса сервер 1С компилирует общие модули. Если в модуле содержится обращение к несуществующей функции, переменной или модулю, который недоступен в серверном контексте, происходит критическая ошибка инициализации. Сеанс аварийно закрывается еще до того, как управление передается телу исполняемой процедуры, поэтому точка останова физически не может быть достигнута.
  2. Служба сервера 1С запущена без режима отладки. Наличие флага «Автоматически подключать фоновые задания» в конфигураторе бесполезно, если служба ragent запущена без параметра -debug.
  3. Сетевые задержки подключения отладчика. Конфигуратор опрашивает сервер кластера с интервалом в несколько секунд. Если фоновое задание падает за миллисекунды, отладчик просто не успевает инициализировать TCP/HTTP-соединение с новым потоком.

Анализ ошибки «Переменная не определена (ИмяОбщегоМодуля)»

Когда платформа пишет, что имя общего модуля является неопределенной переменной, это указывает на одну из следующих ситуаций:

  1. Модуль не скомпилирован на сервере. В свойствах общего модуля РаботаСТорговымОборудованием снят флаг Сервер или установлены только флаги клиента (например, Клиент (управляемое приложение) или Клиент (обычное приложение)). Фоновое задание выполняется исключительно в серверном контексте, где данный модуль попросту отсутствует в глобальном пространстве имен.
  2. Модуль объявлен как глобальный. Если у модуля включено свойство Глобальный, обращаться к нему через точку нельзя. Конструкция РаботаСТорговымОборудованием.КонтрольныйСимволEAN13ТО() вызовет ошибку, так как платформа ищет локальную переменную с именем модуля. Для глобальных модулей метод вызывается напрямую: КонтрольныйСимволEAN13ТО().
  3. Директивы препроцессора внутри модуля. Даже если флаг Сервер установлен, сама экспортируемая функция может быть обернута в блок #Если Клиент Тогда ... #КонецЕсли, что исключает ее компиляцию на стороне сервера.

Способы решения проблемы

Рассмотрим подробнее варианты устранения ошибки в зависимости от архитектуры конфигурации.

Вариант 1. Локализация служебного алгоритма

Если общий модуль предназначен исключительно для клиентских операций торгового оборудования (драйверы, сканеры, фискальные регистраторы), переносить весь модуль на сервер нецелесообразно. Расчет контрольного символа штрихкода по алгоритму EAN-13 представляет собой простую математическую операцию. Оптимальным решением будет перенос функции расчета в серверный модуль печати:


Функция КонтрольныйСимволEAN13(Штрихкод) Экспорт
    Четн = 0;
    Нечетн = 0;
    
    Для Индекс = 1 По 12 Цикл
        СимволКода = Число(Сред(Штрихкод, Индекс, 1));
        Если Индекс % 2 = 0 Тогда
            Четн = Четн + СимволКода;
        Иначе
            Нечетн = Нечетн + СимволКода;
        КонецЕсли;
    КонецЦикла;
    
    Сумма = Нечетн + Четн * 3;
    КонтрольныйСимвол = (10 - (Сумма % 10)) % 10;
    
    Возврат Строка(КонтрольныйСимвол);
КонецФункции

После переноса алгоритма заменим внешний вызов на локальный:


Функция глСформироватьШтрихКодПечатнойФормы(сДокумент) Экспорт
    Перем пПрефиксНомера;
    пШтрихКод = "27" + ПолучитьСоответствиеПрефиксаШтрихКода(Лев(сДокумент.Номер, 2)) + глПолучитьИндексШтрихКодаДокумента(ТипЗнч(сДокумент)) + Прав(СокрЛП(сДокумент.Номер), 6);
    Возврат пШтрихКод + КонтрольныйСимволEAN13(пШтрихКод);
КонецФункции

Вариант 2. Корректировка свойств общего модуля

Если функционал модуля требуется на сервере в неизменном виде, выполним следующие шаги:

  1. Откроем свойства общего модуля РаботаСТорговымОборудованием в палитре свойств.
  2. Убедимся, что установлены флаги Сервер и Вызов сервера (при необходимости обращения с клиента).
  3. Проверим свойство Глобальный. Если флаг включен, исправим вызовы во всех модулях, удалив префикс имени модуля перед функцией.
  4. Выполним синтаксическую проверку конфигурации (Конфигурация -> Проверка конфигурации), отметив пункты «Сервер», «Внешнее соединение» и «Фоновые задания», чтобы гарантировать отсутствие других несовместимых вызовов.

Альтернативный способ отладки фонового кода

Чтобы не тратить время на перезапуск фоновых потоков при отладке логики, рекомендуется временно вызывать исполняемую процедуру напрямую из внешней обработки или клиентской формы синхронно без создания отдельного фонового задания с помощью метода ФоновыеЗадания.Выполнить(). Это позволит гарантированно остановиться на нужной точке останова в сеансе пользователя.

← На главную