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

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

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

Предопределенные и непредопределенные регламентные задания

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

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

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

Проанализируем программный способ создания непредопределенного регламентного задания. Для этого мы можем выполнить следующий код в серверном контексте:


НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ИмяВашегоРегламентногоЗадания");
НовоеЗадание.Наименование = "Мое регулярное фоновое задание";
НовоеЗадание.Использование = Истина;

// Настроим расписание, например, каждый день с 9:00
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ВремяНачала = '00010101090000';
НовоеЗадание.УстановитьРасписание(НовоеРасписание);

НовоеЗадание.Записать();

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

Разница между файловым и клиент-серверным режимами работы

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

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

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

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

Анализ контекста выполнения и прав операционной системы

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


Процедура РегламентноеЗадание1 Экспорт
    ЛогФайл = Новый ТекстовыйДокумент;
    ЛогФайл.ДобавитьСтроку("test");
    ИмяЛогФайла = "C:\1C\test.txt";
    ЛогФайл.Записать(ИмяЛогФайла);
КонецПроцедуры

На первый взгляд код абсолютно рабочий и простой. Однако при запуске в качестве регламентного задания он с высокой долей вероятности завершится ошибкой. Рассмотрим подробнее две скрытые здесь проблемы:

  1. Выполнение на стороне сервера. Любое фоновое и регламентное задание всегда выполняется исключительно на стороне сервера 1С:Предприятия. Это означает, что путь "C:\1C\test.txt" указывает не на локальный диск вашего рабочего компьютера, на котором вы запустили Конфигуратор, а на жесткий диск физического сервера, где развернута служба 1С. Если на сервере нет папки "C:\1C", система выдаст ошибку и прервет выполнение задания.
  2. Права доступа операционной системы. Процесс сервера 1С (фоновое задание) выполняется в операционной системе от имени специальной системной учетной записи. В Windows это чаще всего пользователь USR1CV8, а в Linux — пользователь 1c. Если у этой системной учетной записи нет явных прав на чтение и запись в целевую директорию (в нашем примере — на диск C: сервера), операционная система заблокирует создание файла. Задание завершится аварийно, а в журнале регистрации зафиксируется ошибка доступа.

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


Процедура РегламентноеЗадание1 Экспорт
    ЗаписьЖурналаРегистрации(
        "РегламентныеЗадания.Тест",
        УровеньЖурналаРегистрации.Информация,
        ,
        ,
        "Тестовое регламентное задание успешно запущено и выполнено."
    );
КонецПроцедуры

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

Правильная настройка свойств общего модуля

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

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

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

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

Чтобы проверить этот момент, выполним следующие действия:

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

Почему настраивать расписание нужно в режиме «1С:Предприятие»

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

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

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

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

← На главную