Разработка и Конфигурация · 12 мин
Как отлаживать фоновые задания в 1С
Как отлаживать фоновые задания в 1С: настройка отладки на сервере, подключение к сеансу, типичные ошибки и способы поиска причин сбоев регламентных заданий.
Фоновое задание в 1С выполняется в отдельном сеансе на сервере, поэтому обычный запуск отладчика из конфигуратора его не «ловит». Разработчик ставит точку останова в общем модуле, запускает отладку — а точка не срабатывает, потому что код исполняется в другом процессе, часто под другим пользователем и в другое время. Чтобы отладить такой код, нужно явно разрешить отладку фоновых заданий и подключиться к нужному сеансу.
Проблема усугубляется тем, что фоновые задания часто запускаются по расписанию, работают с реальными данными и завершаются с ошибкой, которая видна только в журнале регистрации одной строкой без контекста. Поэтому отладка фоновых заданий — это не только подключение отладчика, но и умение воспроизвести сбой, собрать диагностику и отличить ошибку кода от ошибки инфраструктуры.
Ниже разобран практический порядок действий: как включить отладку на сервере, как подключиться к сеансу фонового задания, как отлаживать регламентные задания, которые нельзя запустить вручную, и что делать, когда отладчик недоступен.
Где выполняется фоновое задание и почему обычная отладка не работает
Фоновое задание исполняется рабочим процессом сервера 1С (rphost) в собственном сеансе. Код, который вы вызываете через ФоновыеЗадания.Выполнить() или который запускает планировщик регламентных заданий, не имеет никакой связи с сеансом толстого или тонкого клиента, из которого вы запустили отладку. Отладчик конфигуратора по умолчанию подключён только к вашему клиентскому сеансу.
Кроме того, фоновое задание выполняется под служебным пользователем (для регламентных заданий — под пользователем, указанным в свойствах задания, либо без пользователя), без пользовательского интерфейса и без модальных окон. Любой вызов Предупреждение(), Вопрос() или попытка открыть форму в фоновом коде приведёт к ошибке — это частая причина «задание падает, хотя в отладке из клиента всё работало».
Практический вывод: отлаживать логику фонового задания нужно либо подключением отладчика к самому фоновому сеансу, либо выносом прикладной логики в отдельную процедуру общего модуля, которую можно вызвать синхронно из клиента с теми же параметрами. Второй способ проще и покрывает большинство ошибок в бизнес-логике.
Включение отладки на сервере 1С
Отладка серверного кода возможна, только если сервер 1С запущен в режиме отладки. Для клиент-серверного варианта службу агента сервера нужно запускать с ключом -debug (для отладки по протоколу TCP) или с параметрами отладки по HTTP. Если сервер работает без этого ключа, конфигуратор не сможет подключиться ни к одному серверному сеансу, включая фоновые.
Для проверки откройте свойства службы «Агент сервера 1С:Предприятия» и посмотрите строку запуска. Типичный вариант для TCP-отладки выглядит так:
"C:\Program Files\1cv8\<версия>\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d "C:\Program Files\1cv8\srvinfo"Для отладки по HTTP (актуально при работе через веб-сервер и для тонкого/веб-клиента) используется ключ -debug -http у агента и публикация отладочного интерфейса на веб-сервере. В файловом варианте базы отладка включается проще: достаточно запустить конфигуратор и клиентское приложение на той же базе — но фоновые задания в файловом варианте выполняются планировщиком в отдельном сеансе, и к ним всё равно нужно подключаться явно.
Настройка конфигуратора для отладки фоновых заданий
Откройте конфигуратор, перейдите в меню Сервис → Параметры → Отладка. В разделе «Автоматическое подключение» отметьте виды предметов отладки «Фоновые задания» (для клиент-серверного режима — «Серверные фоновые задания»). Без этой настройки отладчик будет игнорировать фоновые сеансы даже при включённой отладке на сервере.
Затем запустите отладку обычным способом (F5 или «Начать отладку»). Поставьте точку останова в процедуре общего модуля, которую выполняет задание. Важно: процедура фонового задания должна находиться в серверном общем модуле с признаком «Вызов сервера» или в серверном общем модуле без этого признака — главное, чтобы модуль компилировался на сервере. Точка останова в клиентском модуле для фонового задания бессмысленна.
Теперь запустите задание. Если это ручной запуск из кода — выполните ФоновыеЗадания.Выполнить("ИмяМодуля.ИмяПроцедуры", Параметры). Отладчик автоматически подключится к новому фоновому сеансу и остановится на точке. Обратите внимание: фоновое задание стартует почти мгновенно, поэтому точка останова должна стоять до запуска, а не после.
- 1Убедитесь, что сервер 1С запущен с ключом -debug (или настроена HTTP-отладка)
- 2В конфигураторе: Сервис → Параметры → Отладка → включите автоподключение фоновых заданий
- 3Поставьте точку останова в серверном общем модуле, в процедуре задания
- 4Начните отладку (F5)
- 5Запустите фоновое задание вручную или дождитесь запуска по расписанию
- 6Проверьте, что отладчик остановился в фоновом сеансе: в окне предметов отладки появится отдельный сеанс
Отладка регламентного задания, которое запускается по расписанию
Регламентное задание стартует планировщиком в непредсказуемый момент, и автоподключение может не успеть или быть отключено. Надёжный способ — ручное подключение: в конфигураторе откройте Отладка → Подключение, в списке доступных предметов отладки найдите сеанс с типом «Фоновое задание» и подключитесь к нему. Список обновляйте кнопкой «Обновить» — фоновый сеанс живёт, пока выполняется задание.
Если задание выполняется секунды и поймать его сеанс вживую не получается, есть два рабочих приёма. Первый — временно добавить в начало процедуры цикл ожидания или вызов длительной операции, чтобы успеть подключиться (только на тестовой базе). Второй — запустить регламентное задание принудительно: в консоли заданий (стандартная обработка «Консоль заданий» из состава БСП или аналог) или кодом, найдя задание через РегламентныеЗадания.НайтиПредопределенное() и вызвав выполнение связанного метода.
Третий вариант — отладка логики вне планировщика. Вызовите процедуру регламентного задания синхронно из внешней обработки или из кнопки в тестовом режиме: ОбщийМодуль.ПроцедураЗадания(Параметры). Так вы отладите всю бизнес-логику в обычном сеансе, а к фоновому запуску вернётесь только для проверки специфики: прав, контекста, транзакционности.
Большинство ошибок «задание не работает» на деле оказываются не ошибками отладки, а проблемами окружения: задание заблокировано, у пользователя задания нет прав, расписание неактивно или предыдущий экземпляр завис. Перед подключением отладчика откройте консоль заданий и проверьте состояние: дата последнего выполнения, признак блокировки и текст ошибки в журнале регистрации экономят часы.
Диагностика без отладчика: журнал регистрации и логирование
На рабочем сервере отладчик часто недоступен или нежелателен. В этом случае основной инструмент — журнал регистрации. Ошибки фоновых заданий фиксируются там с событием вида «Ошибка выполнения регламентного задания» и полным текстом исключения, включая стек вызовов. Отфильтруйте журнал по уровню «Ошибка» и по имени задания — в большинстве случаев причина видна сразу: нарушение прав, блокировка данных, деление на ноль, недоступность внешнего ресурса.
Для систематической диагностики добавьте в процедуру задания собственное логирование через ЗаписьЖурналаРегистрации(): фиксируйте старт, ключевые параметры, промежуточные этапы и завершение. Это позволяет понять, на каком шаге задание останавливается, не подключая отладчик. Оборачивайте тело процедуры в Попытка ... Исключение с записью ОписаниеОшибки() и ИнформацияОбОшибке() в журнал — иначе часть деталей теряется.
Полезный приём — технологический журнал (logcfg.xml) с событиями EXCP и DBMSSQL/DBPOSTGRS, если подозрение падает на запросы к СУБД. Он тяжелее журнала регистрации и требует аккуратной настройки фильтров, но показывает фактические запросы и исключения на уровне платформы. Включайте его точечно и на ограниченное время — объём логов растёт быстро.
Особенности прав, блокировок и контекста выполнения
Фоновое задание, запущенное вручную, наследует пользователя текущего сеанса, а регламентное — пользователя, указанного в его свойствах. Если у этого пользователя нет прав на объекты, задание будет падать именно в фоновом режиме, хотя интерактивно тот же код у администратора работает. Проверяйте права заранее или выполняйте привилегированные операции в УстановитьПривилегированныйРежим(Истина) осознанно — это расширяет доступ и должно быть обосновано.
Вторая группа проблем — блокировки. Фоновое задание, обрабатывающее большие объёмы данных в одной транзакции, может конфликтовать с пользователями и с другими заданиями. В отладке это проявляется как «зависание» на записи или ошибка превышения времени ожидания. Разбивайте обработку на порции с фиксацией транзакций и проверяйте, не запущен ли второй экземпляр того же задания — платформа не даёт выполняться двум экземплярам одного регламентного задания одновременно, и «лишние» просто ожидают или пропускаются.
Наконец, помните про ограничения контекста: в фоновом задании недоступны данные формы, временные хранилища клиентского сеанса и всё, что привязано к интерактивному контексту. Передавайте в задание только сериализуемые параметры — примитивные типы, структуры, массивы, ссылки. Передача, например, табличного документа или объекта формы приведёт к ошибке сериализации ещё до начала выполнения.
Как проверить результат
В списке предметов отладки виден сеанс «Фоновое задание», точка останова срабатывает
Сеанс не появляется — проверьте ключ -debug и настройку автоподключения
В консоли заданий состояние «Завершено», в журнале регистрации нет ошибок
Состояние «Ошибка» или задание «висит» в активных дольше обычного
Код выполняется под тем же пользователем, что и в продуктиве
Отладка под администратором скрывает ошибки прав
Есть записи о старте и завершении с ожидаемыми параметрами
Записей нет — задание не запускалось, проверяйте расписание и блокировку
Частые вопросы об отладке фоновых заданий
Почему точка останова не срабатывает, хотя отладка запущена?
Чаще всего не включено автоматическое подключение фоновых заданий в параметрах отладки конфигуратора либо сервер запущен без ключа -debug. Также проверьте, что точка стоит в серверном общем модуле, а не в клиентском коде, и что вы отлаживаете ту же базу, в которой запускается задание.
Можно ли отладить фоновое задание в файловой базе?
Да. В файловом варианте фоновые задания выполняет отдельный сеанс планировщика. Запустите отладку в конфигураторе, включите автоподключение фоновых заданий и инициируйте выполнение — отладчик подключится к сеансу планировщика так же, как в клиент-серверном варианте.
Как отладить задание, которое падает только ночью по расписанию?
Добавьте в процедуру подробное логирование через ЗаписьЖурналаРегистрации с фиксацией параметров и этапов. После ночного запуска проанализируйте журнал. Если причина неясна, воспроизведите запуск днём на копии базы с теми же данными и подключите отладчик к фоновому сеансу вручную.
Задание работает у меня, но падает в продуктиве. Что проверить в первую очередь?
Права пользователя, под которым выполняется задание, доступность внешних ресурсов с сервера (каталоги, веб-сервисы), отличия данных и версию платформы на сервере. Проверьте также, не заблокировано ли задание и не конфликтует ли оно с другим экземпляром или смежным заданием по расписанию.
Как остановить зависшее фоновое задание?
В консоли заданий (или через консоль кластера серверов) найдите активное задание и вызовите отмену. В коде длительных заданий полезно периодически проверять возможность прерывания, чтобы отмена срабатывала быстро, а не после завершения текущей порции обработки.
Опасно ли включать режим отладки на рабочем сервере?
Да, это снижает производительность и открывает возможность подключения отладчика к чужим сеансам. Включайте режим на ограниченное время, по согласованию с администратором, и отключайте после завершения диагностики. По возможности выполняйте отладку на копии базы.
Что важно запомнить
Фоновое задание выполняется в отдельном серверном сеансе, поэтому нужны отладка на сервере (-debug) и автоподключение фоновых заданий в конфигураторе. Регламентные задания удобнее отлаживать через ручное подключение к сеансу или синхронный вызов процедуры. На рабочих базах основой диагностики служат журнал регистрации и собственное логирование, а отладчик — только на копии с согласованным окном обслуживания.