Каждый начинающий разработчик в среде 1С:Предприятие рано или поздно сталкивается со странным поведением платформы: регламентное задание успешно создано в Конфигураторе, расписание настроено, код написан, но в назначенное время ничего не происходит. Лог-файлы не создаются, данные не обновляются, а в консоли администрирования тишина. На первый взгляд это кажется недоработкой платформы или скрытым багом, но на самом деле такое поведение обусловлено строгой архитектурной логикой 1С. В этой статье мы подробно разберем, почему регламентные задания могут "саботировать" свою работу, проанализируем основные подводные камни и пошагово настроим систему для гарантированного выполнения задач.
Давайте начнем с фундаментального понятия — свойства Предопределенное в свойствах регламентного задания в Конфигураторе. Это ключевой переключатель, который в корне меняет логику работы планировщика.
Если флажок Предопределенное включен, платформа берет на себя заботу по автоматическому созданию одного рабочего экземпляра этого задания в базе данных при первом ее обновлении (применении конфигурации). В этом случае расписание, которое вы задали в Конфигураторе, автоматически применится к созданному экземпляру, и задание начнет выполняться в соответствии с заданными интервалами.
Если же флажок Предопределенное выключен (непредопределенное задание), то все ваши настройки расписания в Конфигураторе — это всего лишь шаблон, описание структуры. Сам по себе рабочий экземпляр задания в базе данных автоматически создан не будет. Чтобы такое задание заработало, нам необходимо создать его экземпляр программно с помощью встроенного языка или воспользоваться готовой консолью регламентных заданий в режиме «1С:Предприятие».
Проанализируем программный способ создания непредопределенного регламентного задания. Для этого мы можем выполнить следующий код в серверном контексте:
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ИмяВашегоРегламентногоЗадания");
НовоеЗадание.Наименование = "Мое регулярное фоновое задание";
НовоеЗадание.Использование = Истина;
// Настроим расписание, например, каждый день с 9:00
НовоеРасписание = Новый РасписаниеРегламентногоЗадания;
НовоеРасписание.ВремяНачала = '00010101090000';
НовоеЗадание.УстановитьРасписание(НовоеРасписание);
НовоеЗадание.Записать();
После выполнения этого кода в базе данных появится физический экземпляр задания, который начнет подчиняться планировщику. Непредопределенные задания крайне полезны, когда один и тот же алгоритм (например, интеграцию с маркетплейсом или обмен данными) нужно запускать по разным расписаниям для разных филиалов, складов или контрагентов.
Выясним причину, почему поведение планировщика кардинально отличается в зависимости от архитектуры размещения вашей информационной базы.
В клиент-серверном варианте запуск регламентных заданий полностью делегирован менеджеру кластера серверов 1С:Предприятия. Планировщик работает непрерывно на стороне сервера. Задания выполняются в фоновом режиме в соответствии с расписанием независимо от того, открыты ли у кого-то из пользователей клиентские приложения.
В файловом варианте выделенного сервера и отдельного процесса планировщика по умолчанию нет. Платформа физически не может запустить фоновый процесс, если база закрыта. Поэтому главным условием для выполнения регламентных заданий в файловой базе является наличие хотя бы одного активного сеанса пользователя. Если в офисе наступили выходные, все сотрудники выключили компьютеры и вышли из программы, ни одно регламентное задание не запустится.
Для решения этой проблемы в современных версиях платформы файловая 1С автоматически порождает фоновые потоки при наличии активных пользователей. В старых же версиях платформы разработчикам приходилось выделять отдельный компьютер ("дежурный сеанс"), на котором круглосуточно была запущена 1С, и настраивать обработчик ожидания, периодически вызывающий метод ВыполнитьОбработкуЗаданий().
Давайте подробно разберем пример кода, который часто используют для тестирования регламентных заданий (подобный код привел автор темы на форуме):
Процедура РегламентноеЗадание1 Экспорт
ЛогФайл = Новый ТекстовыйДокумент;
ЛогФайл.ДобавитьСтроку("test");
ИмяЛогФайла = "C:\1C\test.txt";
ЛогФайл.Записать(ИмяЛогФайла);
КонецПроцедуры
На первый взгляд код абсолютно рабочий и простой. Однако при запуске в качестве регламентного задания он с высокой долей вероятности завершится ошибкой. Рассмотрим подробнее две скрытые здесь проблемы:
"C:\1C\test.txt" указывает не на локальный диск вашего рабочего компьютера, на котором вы запустили Конфигуратор, а на жесткий диск физического сервера, где развернута служба 1С. Если на сервере нет папки "C:\1C", система выдаст ошибку и прервет выполнение задания.USR1CV8, а в Linux — пользователь 1c. Если у этой системной учетной записи нет явных прав на чтение и запись в целевую директорию (в нашем примере — на диск C: сервера), операционная система заблокирует создание файла. Задание завершится аварийно, а в журнале регистрации зафиксируется ошибка доступа.Вместо прямой записи в файл на диске C:, правильным решением будет использование системного Журнала регистрации. Давайте посмотрим на пример безопасного логирования:
Процедура РегламентноеЗадание1 Экспорт
ЗаписьЖурналаРегистрации(
"РегламентныеЗадания.Тест",
УровеньЖурналаРегистрации.Информация,
,
,
"Тестовое регламентное задание успешно запущено и выполнено."
);
КонецПроцедуры
Этот способ гарантирует, что запись попадет в системную базу данных 1С, и мы сможем увидеть её через стандартную обработку просмотра журнала регистрации, не заботясь о правах файловой системы операционной системы.
Процедура, которая запускается регламентным заданием, должна находиться в общем модуле, параметры которого настроены строго определенным образом. Давайте по шагам проверим свойства этого общего модуля:
Экспорт.Еще одна неочевидная причина, почему полностью исправное и настроенное задание упорно не запускается — это административная блокировка на уровне кластера серверов. При переносе баз данных, создании тестовых копий или проведении технических работ администраторы часто отключают планировщик.
Чтобы проверить этот момент, выполним следующие действия:
Как справедливо отметили участники обсуждения на форуме, настройка расписания непосредственно в Конфигураторе — это крайне неудобный и часто неэффективный путь. Если вам потребуется изменить время запуска задания на 10 минут, вам придется выгонять пользователей из базы, заходить в Конфигуратор, менять настройки и обновлять конфигурацию базы данных.
Правильный подход — это управление расписанием и активностью заданий прямо в режиме «1С:Предприятие». В современных типовых конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), для этого уже есть встроенный и очень удобный инструмент. Найти его можно в разделе "Администрирование" — "Обслуживание" — "Регламентные и фоновые задания".
Если же вы разрабатываете собственную конфигурацию с нуля ("самописную базу"), настоятельно рекомендуем интегрировать в нее подсистему "Регламентные задания" из БСП или использовать стороннюю обработку "Консоль регламентных заданий". Это позволит вам:
Подводя итог, отметим: стабильная работа регламентных заданий складывается из правильного выбора типа задания (предопределенное или нет), понимания контекста его выполнения на сервере, проверки прав доступа операционной системы к файловым ресурсам и грамотного администрирования в режиме «1С:Предприятие».