При разработке регламентных и фоновых заданий в 1С разработчики нередко сталкиваются с ситуацией: точка останова установлена, в конфигураторе включено автоматическое подключение фоновых заданий, но при старте процесса отладчик не срабатывает, а в журнале регистрации или консоли заданий фиксируется аварийное завершение. Разберем по шагам, почему возникает ошибка инициализации общего модуля, почему отладчик не успевает перехватить поток и как исправить работу серверного кода.
Рассмотрим типовой фрагмент кода, на котором происходит сбой при формировании штрихкода печатной формы:
Функция глСформироватьШтрихКодПечатнойФормы(сДокумент) Экспорт
Перем пПрефиксНомера;
пШтрихКод = "27" + ПолучитьСоответствиеПрефиксаШтрихКода(Лев(сДокумент.Номер, 2)) + глПолучитьИндексШтрихКодаДокумента(ТипЗнч(сДокумент)) + Прав(СокрЛП(сДокумент.Номер), 6);
Возврат пШтрихКод + РаботаСТорговымОборудованием.КонтрольныйСимволEAN13ТО(пШтрихКод);
КонецФункции
При выполнении этого кода в сеансе фонового задания платформа выдает сообщение: «Ошибка инициализации модуля... Переменная не определена (РаботаСТорговымОборудованием)».
Проанализируем механизм выполнения фонового потока на сервере приложений. Существует несколько ключевых факторов, из-за которых отладка фонового задания не срабатывает:
ragent запущена без параметра -debug.Когда платформа пишет, что имя общего модуля является неопределенной переменной, это указывает на одну из следующих ситуаций:
РаботаСТорговымОборудованием снят флаг Сервер или установлены только флаги клиента (например, Клиент (управляемое приложение) или Клиент (обычное приложение)). Фоновое задание выполняется исключительно в серверном контексте, где данный модуль попросту отсутствует в глобальном пространстве имен.РаботаСТорговымОборудованием.КонтрольныйСимволEAN13ТО() вызовет ошибку, так как платформа ищет локальную переменную с именем модуля. Для глобальных модулей метод вызывается напрямую: КонтрольныйСимволEAN13ТО().#Если Клиент Тогда ... #КонецЕсли, что исключает ее компиляцию на стороне сервера.Рассмотрим подробнее варианты устранения ошибки в зависимости от архитектуры конфигурации.
Если общий модуль предназначен исключительно для клиентских операций торгового оборудования (драйверы, сканеры, фискальные регистраторы), переносить весь модуль на сервер нецелесообразно. Расчет контрольного символа штрихкода по алгоритму EAN-13 представляет собой простую математическую операцию. Оптимальным решением будет перенос функции расчета в серверный модуль печати:
Функция КонтрольныйСимволEAN13(Штрихкод) Экспорт
Четн = 0;
Нечетн = 0;
Для Индекс = 1 По 12 Цикл
СимволКода = Число(Сред(Штрихкод, Индекс, 1));
Если Индекс % 2 = 0 Тогда
Четн = Четн + СимволКода;
Иначе
Нечетн = Нечетн + СимволКода;
КонецЕсли;
КонецЦикла;
Сумма = Нечетн + Четн * 3;
КонтрольныйСимвол = (10 - (Сумма % 10)) % 10;
Возврат Строка(КонтрольныйСимвол);
КонецФункции
После переноса алгоритма заменим внешний вызов на локальный:
Функция глСформироватьШтрихКодПечатнойФормы(сДокумент) Экспорт
Перем пПрефиксНомера;
пШтрихКод = "27" + ПолучитьСоответствиеПрефиксаШтрихКода(Лев(сДокумент.Номер, 2)) + глПолучитьИндексШтрихКодаДокумента(ТипЗнч(сДокумент)) + Прав(СокрЛП(сДокумент.Номер), 6);
Возврат пШтрихКод + КонтрольныйСимволEAN13(пШтрихКод);
КонецФункции
Если функционал модуля требуется на сервере в неизменном виде, выполним следующие шаги:
РаботаСТорговымОборудованием в палитре свойств.Чтобы не тратить время на перезапуск фоновых потоков при отладке логики, рекомендуется временно вызывать исполняемую процедуру напрямую из внешней обработки или клиентской формы синхронно без создания отдельного фонового задания с помощью метода ФоновыеЗадания.Выполнить(). Это позволит гарантированно остановиться на нужной точке останова в сеансе пользователя.