Как отладить фоновое задание в 1С, если не срабатывает точка останова и возникает ошибка?

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

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

В этой статье мы подробно разберем, почему конфигуратор «пролетает» мимо точек останова в фоновых заданиях, как правильно настроить среду разработки, устранить конфликты контекстов исполнения (клиент-сервер) и гарантированно локализовать ошибку.

Причина 1. Несовпадение строки соединения информационной базы

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

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

  1. Разница в регистре имени сервера или базы данных: например, Srvr="SQL-SERVER" в конфигураторе и Srvr="sql-server" на сервере 1С.
  2. Использование IP-адреса вместо DNS-имени хоста в одной из строк подключения (например, 192.168.1.10 вместо Server1C).
  3. Лишние пробелы или кавычки в параметрах подключения.

Для проверки точной строки соединения, которую использует сервер 1С, выполним простой прием. Временно добавим в код фонового задания запись в Журнал регистрации:


ЗаписьЖурналаРегистрации("Отладка.СтрокаСоединения", 
    УровеньЖурналаРегистрации.Информация, , , 
    СтрокаСоединенияИнформационнойБазы());

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

Причина 2. Ошибки контекста и использование клиентских методов на сервере

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

При интерактивном запуске (например, напрямую из внешней обработки) код может выполняться на клиенте, поэтому ошибки не возникает. Но как только мы упаковываем этот код в ФоновыеЗадания.Выполнить(), серверная часть платформы падает при попытке обратиться к недоступным методам.

Выясним, какие интерактивные методы являются критичными для фоновых заданий:

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


#Если Клиент Тогда
    Предупреждение("Документ успешно проведен!");
#КонецЕсли

При этом важно понимать разницу между диалогами и выводом сообщений. Метод Сообщить() не блокирует выполнение фонового задания. Все сообщения, сгенерированные методом Сообщить() в процессе работы фонового задания, накапливаются в специальном массиве сообщений и могут быть получены в родительском сеансе пользователя после завершения задачи.

Причина 3. Быстротечность выполнения фонового задания

Даже при корректно настроенном сервере и совпадении строк подключения точка останова может не сработать, если алгоритм фонового задания отрабатывает очень быстро (за доли секунды). Конфигуратор и служба отладки физически не успевают зарегистрировать появление нового фонового сеанса на сервере, подключиться к нему и передать фокус на строку с точкой останова.

Для решения этой проблемы применим проверенный лайфхак. В самом начале серверного метода фонового задания установим искусственную паузу (задержку) на 5–10 секунд. Этого времени будет достаточно, чтобы конфигуратор обнаружил сеанс и подключился к нему:


ДатаСтарта = ТекущаяДата();
Пока ТекущаяДата() - ДатаСтарта < 10 Цикл
    // Ждем 10 секунд для успешного подключения отладчика
КонецЦикла;

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

Причина 4. Параметры запуска БСП для принудительной синхронной отладки

Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), то запуск фоновых задач обычно происходит через общие модули БСП (например, ДлительныеОперации). В БСП заложен элегантный встроенный механизм отладки без использования фоновых потоков.

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

  1. Откроем режим «1С:Предприятие».
  2. Перейдем в меню Сервис — Параметры — Запуск 1С:Предприятия.
  3. В поле Параметр запуска пропишем строковое значение: РежимОтладки (или запустим ярлык системы с ключом командной строки /C РежимОтладки).

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

Причина 5. Права доступа системной учетной записи сервера 1С

Если при ручном запуске внешней обработки алгоритм работает без ошибок, а в фоне падает, проблема может крыться в правах операционной системы. Фоновое задание выполняется непосредственно на сервере 1С под правами той системной учетной записи, от имени которой запущена служба сервера (например, USR1CV8 на ОС Windows или usr1cv8 на Linux).

В отличие от вашего интерактивного пользователя Windows, системная учетная запись сервера 1С может не иметь прав доступа на:

В таком случае рекомендуется временно предоставить учетной записи службы сервера 1С полные права на нужный сетевой ресурс или каталог для проверки гипотезы.

Альтернативный метод: Логирование ошибок через Журнал регистрации

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

Обернем весь код процедуры фонового задания в конструкцию попытки-исключения и запишем подробную информацию об ошибке в Журнал регистрации:


Процедура МоеЗаданиеНаСервере() Экспорт
    Попытка
        // Основной алгоритм выполнения фонового задания
        ПроводитьДокументы();
    Исключение
        // Фиксируем ошибку в Журнале регистрации
        ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        ЗаписьЖурналаРегистрации("ФоновыеЗадания.ОшибкаВыполнения",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            ,
            "Произошла ошибка при выполнении фонового задания: " + ТекстОшибки);
    КонецПопытки;
КонецПроцедуры

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

← На главную