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

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

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

Понимание работы фоновых и регламентных заданий в 1С

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

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

Автор исходной темы описывает ситуацию, когда регламентное задание успешно запускается и выполняет подготовительные действия, включая "выгрузку пользователей". Однако на этапе вызова фонового задания с помощью ФоновыеЗадания.Выполнить процесс прерывается, и само фоновое задание не стартует, не оставляя никаких записей в журнале регистрации.

Анализируем симптомы: фоновое задание не запускается и нет записей в журнале

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

  1. Блокировки выполнения регламентных и фоновых заданий: Это одна из наиболее частых причин подобных проблем. Давайте проверим несколько видов блокировок:

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

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

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

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

    3. Монопольный режим: Если в коде (например, в самом регламентном задании до момента вызова фонового) был установлен монопольный режим командой УстановитьМонопольныйРежим(Истина), это может препятствовать созданию новых сеансов, включая сеансы для фоновых заданий. Хотя в данном случае автор упомянул, что регламентное задание выполняется, что подразумевает отсутствие монопольного режима в его начале, но стоит проверить, не устанавливается ли он непосредственно перед вызовом фонового задания, блокируя тем самым его запуск.

      Как проверить: Используем отладчик (подробнее об отладке мы поговорим далее) или добавляем отладочные записи в журнал регистрации до и после потенциального вызова УстановитьМонопольныйРежим(Истина).

    4. Блокировка в файловом режиме: В файловых базах регламентные задания можно заблокировать, добавив параметр /AllowExecuteScheduledJobs –off при запуске 1С. Это редко используется для рабочих баз, но исключать не стоит.

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

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

    Как диагностировать: Создайте копию рабочей базы и запускайте регламентное задание на ней. Это позволит вам полноценно отлаживать код и экспериментировать без риска для основной работы. Вставьте в код регламентного задания, непосредственно перед и после вызова ФоновыеЗадания.Выполнить, подробные записи в журнал регистрации, выводя все параметры, передаваемые в фоновое задание. Используйте метод ЗаписьЖурналаРегистрации().

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

    Как проверить: Убедитесь, что метод, который должен быть выполнен фоновым заданием, имеет параметры, и вы передаете их все корректно. Если метод принимает параметры по умолчанию, попробуйте явно передать их, чтобы исключить несовпадения.

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

    Как диагностировать и решить:

    1. Проверьте список активных сеансов в консоли кластера серверов или через стандартную обработку "Активные пользователи".
    2. Рестарт службы агента сервера 1С:Предприятия. Это радикальный, но часто эффективный метод для очистки "призрачных" сеансов и зависших процессов. Он перезагружает все процессы сервера 1С и может решить проблему. Однако это требует согласования с пользователями, так как все их сеансы будут принудительно завершены.
  5. Зависшие задания или проблемы с сервером 1С: В редких случаях причиной могут быть внутренние проблемы с работой кластера серверов 1С или зависшие процессы. Кластер может быть перегружен или работать нестабильно.

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

  6. Особенности файлового режима: Если рабочая база работает в файловом режиме (что маловероятно для тяжелых расчетов, но возможно), для выполнения фоновых заданий требуется, чтобы хотя бы один клиентский процесс периодически вызывал функцию ВыполнитьОбработкуЗаданий(). Если такой процесс отсутствует или не работает, фоновые задания не будут выполняться. В клиент-серверном режиме этим занимается сам агент сервера.

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

  7. Недостаточность ресурсов сервера: Если регламентное задание само по себе является "тяжелым", как упомянул автор, и потребляет много ресурсов, сервер может просто не иметь достаточно свободной памяти или процессорного времени для запуска нового фонового задания. Это особенно актуально, если на сервере работают и другие приложения.

    Как диагностировать: Мы можем использовать средства мониторинга операционной системы сервера (например, Диспетчер задач в Windows или аналогичные утилиты в Linux), чтобы отследить загрузку CPU и объем свободной оперативной памяти во время выполнения регламентного задания. Если ресурсы критически низки, это может быть причиной отказа в запуске фонового задания.

  8. Конфликт блокировок при обновлении конфигурации: Если на сервере в момент запуска регламентного задания или вызова фонового происходит системное фоновое задание, связанное, например, с обновлением конфигурации или лицензированием, оно может устанавливать монопольные блокировки, которые препятствуют запуску новых фоновых заданий. На такие системные задания стандартная блокировка регламентных заданий может не действовать.

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

Почему нет записей в журнале регистрации?

Отсутствие записей — это один из самых обескураживающих симптомов. Разберем, почему так происходит и как с этим бороться:

  1. Задание не было создано или прервалось до начала выполнения: Если система по какой-либо из вышеперечисленных причин (блокировка, критическая ошибка при инициализации) не смогла даже создать объект фонового задания или оно было прервано до того, как его код начал выполняться, то никаких записей от самого фонового задания не будет.
  2. Низкий уровень детализации журнала: Возможно, в настройках журнала регистрации установлен низкий уровень детализации, который не включает информационные сообщения или сообщения об ошибках, возникающие до момента полного старта фонового задания.

Как обеспечить записи в журнале:

  1. Детальная запись из вызывающего кода: Как мы уже рассматривали, крайне важно добавлять вызовы ЗаписьЖурналаРегистрации() непосредственно перед и после вызова ФоновыеЗадания.Выполнить() в коде регламентного задания, а также оборачивать вызов в блок Попытка...Исключение, чтобы зафиксировать любые ошибки, возникающие при самом запуске. Это позволяет понять, дошел ли код до этого места и что произошло в процессе вызова.

  2. Настройка уровня детализации: В настройках журнала регистрации (через "Администрирование" -> "Обслуживание" -> "Журнал регистрации" -> "Настроить") установите более высокий уровень детализации для событий, связанных с регламентными и фоновыми заданиями. Убедитесь, что включены события категории "Ошибка", "Предупреждение", "Информация" для объектов, связанных с регламентными и фоновыми заданиями, а также для "Метаданные" и "Сервер".

Эффективные методы отладки фоновых заданий

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

  1. Автоматическое подключение отладки: В конфигураторе, в меню "Отладка" -> "Подключение...", мы можем настроить автоматическое подключение к фоновым заданиям. Это позволяет устанавливать точки останова в коде фонового задания и отлаживать его, как обычный клиентский или серверный код.

  2. Запуск сервера 1С с параметром -debug: Для клиент-серверного варианта работы, чтобы отладчик мог полноценно подключаться к процессам сервера и фоновым заданиям, необходимо запустить сервер 1С:Предприятия с параметром -debug. Это делается через свойства службы агента сервера 1С или при запуске исполняемого файла ragent.exe.

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

    Пример запуска из БСП (с кнопкой "Выполнить не в фоне"):

    
    // Предполагается, что у вас открыта обработка "Регламентные и фоновые задания"
    // и вы выбрали нужное регламентное задание.
    // Вместо стандартного "Выполнить сейчас" нажимаем "Выполнить не в фоне" (если она доступна).
    
  4. Отладочная обработка: Мы можем создать внешнюю обработку, которая вызывает ту же самую функцию (или экспортную процедуру модуля), что и ваше регламентное задание. Это позволит нам запустить код в интерактивном режиме, передать тестовые параметры и отлаживать его. Это особенно полезно, если фоновое задание имеет сложную логику, и мы хотим изолировать проблему от контекста регламентного задания.

  5. Анализ журнала регистрации: Включите максимально подробный журнал регистрации и используйте его для анализа. Фильтруйте события по объектам (например, по имени регламентного задания или классу метаданных "ФоновоеЗадание"), по пользователю (если регламентное задание выполняется от имени конкретного пользователя, как в случае с "Регламент"). В журнале отображаются такие параметры фоновых заданий, как состояние, наименование, начало, окончание. Даже если ваше фоновое задание не писало ничего, мы можем увидеть записи о его попытке запуска и прерывании от самой платформы. Для автоматического мониторинга подобных инцидентов подойдёт обработка для анализа ошибок регламентных заданий по журналу регистрации.

  6. Контроль состояния фонового задания: После вызова ФоновыеЗадания.Выполнить() мы получаем объект "ФоновоеЗадание". У этого объекта есть свойство Состояние, которое можем периодически проверять для отслеживания статуса выполнения. Если задание даже не доходит до состояния "Выполняется", это подтверждает, что проблема на этапе инициализации.

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

Рекомендации по оптимизации и дальнейшей диагностике

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

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

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

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

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

← На главную