Почему не работает регламентное задание и как правильно настроить создание задач по расписанию в 1С

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

Разработка регламентных заданий в 1С — это стандартная задача, которая, тем не менее, часто вызывает трудности у начинающих разработчиков. Основные проблемы обычно связаны с двумя аспектами: невозможностью «поймать» точку останова при отладке и некорректным использованием контекста пользователя. В этой статье мы подробно разберем, как заставить отладчик работать с фоновыми заданиями, почему ИмяПользователя() может возвращать пустую строку и как правильно организовать логику создания задач для сотрудников по расписанию.

Настройка отладки для регламентных и фоновых заданий

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

Во-первых, необходимо убедиться, что сервер «1С:Предприятия» запущен в режиме отладки. Если вы работаете в клиент-серверном варианте, в строке запуска службы сервера должен присутствовать ключ /debug. Без этого ключа никакие манипуляции в конфигураторе не помогут.

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

  1. Перейдем в меню Отладка — Подключение....
  2. В открывшемся окне нажмем кнопку Автоматическое подключение.
  3. Установим флажок напротив пункта Фоновые задания.

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

Проблема пустого пользователя в фоновом задании

Выясним причину, по которой ИмяПользователя() или ПараметрыСеанса.ТекущийПользователь оказываются незаполненными. Проанализируем специфику работы сеанса фонового задания. В отличие от обычного сеанса, который запускает пользователь через 1cv8.exe, регламентное задание запускается системой. Если в свойствах регламентного задания в дереве метаданных (или в настройках в пользовательском режиме) не указан конкретный пользователь, под которым оно должно выполняться, задание стартует от имени специального системного пользователя.

В этом случае при старте сеанса вызывается процедура УстановкаПараметровСеанса в модуле сеанса. Рассмотрим типичную ошибку в коде этой процедуры:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    глТекПользователь = Справочники.ФизическиеЛица.НайтиПоКоду(ИмяПользователя());
    Если не ЗначениеЗаполнено(глТекПользователь) Тогда
        // Здесь код падает или выводит сообщение, которое никто не увидит
    Иначе
        ПараметрыСеанса.ТекущийПользователь = глТекПользователь;
    КонецЕсли;
КонецПроцедуры

Поскольку ИмяПользователя() для фонового задания — это пустая строка, поиск в справочнике ничего не дает, и ПараметрыСеанса.ТекущийПользователь остается пустым. Использовать параметры сеанса, завязанные на текущего пользователя, внутри регламентного задания — это архитектурная ошибка, так как задание должно работать глобально для всей базы, а не для конкретного человека, «сидящего» внутри этого задания.

Корректная реализация логики создания задач

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

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


Процедура СоздатьЗадачуЭкспорт()
    // Устанавливаем привилегированный режим, чтобы избежать проблем с правами доступа (RLS)
    УстановитьПривилегированныйРежим(Истина);

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СведенияОСотрудникахСрезПоследних.Сотрудник КАК Сотрудник
        |ИЗ
        |	РегистрСведений.СведенияОСотрудниках.СрезПоследних КАК СведенияОСотрудникахСрезПоследних";

    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

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

Важные нюансы при работе с фоновыми заданиями

Проанализируем несколько важных моментов, которые помогут сделать ваши регламентные задания более надежными:

  1. Привилегированный режим: Мы использовали команду УстановитьПривилегированныйРежим(Истина). Это критично, так как фоновое задание может быть запущено под пользователем с ограниченными правами. Привилегированный режим позволяет коду игнорировать проверку прав доступа (RLS) и успешно выполнять запросы к данным.
  2. Журнал регистрации: В фоновом задании нет интерфейса. Если вы используете Сообщить() или Предупреждение(), это либо вызовет ошибку, либо сообщение уйдет «в никуда». Для отслеживания хода выполнения всегда используйте ЗаписьЖурналаРегистрации(). Это единственный надежный способ понять, почему задание не отработало в реальных условиях эксплуатации.
  3. Обработка ошибок: Оборачивайте запись объектов в блок Попытка...Исключение внутри цикла. Если создание задачи для одного сотрудника завершится ошибкой (например, из-за блокировки объекта), это не должно прерывать выполнение задания для остальных ста сотрудников.
  4. Параметры сеанса: Если ваша конфигурация (например, на базе БСП) жестко требует инициализации ПараметрыСеанса.ТекущийПользователь при старте любого сеанса, в процедуре УстановкаПараметровСеанса следует предусмотреть проверку. Если это фоновое задание, можно назначать «Служебного пользователя» или просто пропускать инициализацию, если это допустимо логикой.

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

← На главную