При разработке и отладке механизмов автоматизации в платформе 1С:Предприятие разработчики часто сталкиваются с неожиданным поведением планировщика задач. Типичный сценарий: вы создаете новое регламентное задание, настраиваете его расписание на запуск каждые 10 секунд, но при тестировании в файловой базе обнаруживаете, что оно упорно запускается гораздо реже — примерно раз в 60 секунд. При этом база абсолютно пуста, другие процессы отсутствуют, а само задание выполняется мгновенно.
В этой статье мы подробно разберем, почему планировщик 1С ведет себя именно так в файловом режиме работы, рассмотрим внутреннюю архитектуру этого механизма и предложим надежные практические решения для обхода данного ограничения.
Для того чтобы понять логику работы платформы, обратимся к официальной технической документации. В файловом варианте работы базы данных архитектура выполнения фоновых и регламентных заданий имеет ряд жестких ограничений, зашитых на уровне ядра платформы 1С:
1Cv8.1CD.Именно поэтому, какое бы маленькое значение интервала (например, 5 или 10 секунд) вы ни указали в настройках расписания регламентного задания, в файловом режиме оно физически не сможет запускаться чаще, чем один раз в минуту.
Многие разработчики замечают интересную особенность: если открыть форму «Консоль регламентных заданий» или программный список фоновых заданий и активно нажимать кнопку «Обновить», то регламентное задание начинает выполняться вовремя — каждые 10 секунд, как и настроено в расписании.
Проанализируем эту ситуацию. Принудительное обновление интерфейса в администрирующих формах неявно вызывает системные механизмы платформы. Платформа воспринимает обращение к списку фоновых заданий как команду немедленно синхронизировать состояние планировщика и выполнить накопившиеся в очереди задачи. Происходит внеочередной «тик» таймера, игнорирующий стандартное 60-секундное ограничение. Однако оставлять открытую форму с автообновлением на рабочем сервере — крайне неэффективное решение.
Если специфика вашей бизнес-логики (например, оперативный обмен с сайтом, постоянное получение данных из внешней системы или интеграция с оборудованием) требует выполнения кода чаще, чем один раз в минуту, стандартный механизм регламентных заданий в файловой базе использовать напрямую нельзя. Рассмотрим подробнее два эффективных обходных пути.
Вместо регламентного задания мы можем организовать работу так называемого «робота» — выделенного сеанса 1С, запущенного на сервере или техническом компьютере. В этом сеансе выполнение нужного нам кода будет инициировано встроенным методом платформы ПодключитьОбработчикОжидания.
Этот метод работает на стороне клиента и позволяет вызывать процедуру модуля управляемого или обычного приложения с абсолютно любым интервалом в секундах, полностью обходя ограничения серверного планировщика файлов.
Рассмотрим по шагам реализацию данного подхода:
1. В модуле управляемого приложения пропишем инициализацию обработчика при старте системы:
Процедура ПриНачалеРаботыСистемы()
#Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
// Проверяем, что это запуск под специальным техническим пользователем
Если ИмяПользователя() = "РоботОбмена" Тогда
ПодключитьОбработчикОжидания("ВыполнитьОперативноеДействие", 10, Ложь);
КонецЕсли;
#КонецЕсли;
КонецПроцедуры
2. Там же, в модуле управляемого приложения, опишем процедуру, которая будет вызываться каждые 10 секунд:
Процедура ВыполнитьОперативноеДействие() Экспорт
// Вызываем процедуру общего модуля, выполняющую полезную работу на сервере
Попытка
ОбработкаОперативныхЗаданийСервер.ВыполнитьОбменДанными();
Исключение
ЗаписьЖурналаРегистрации("Ошибка робота обмена",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Этот способ гарантирует стабильный запуск вашей процедуры строго каждые 10 секунд без каких-либо отклонений и задержек.
Если вам принципиально важно использовать именно стандартный механизм регламентных заданий (например, чтобы иметь возможность гибко менять расписание через стандартные интерфейсы без изменения кода), вы можете использовать специальный метод платформы ВыполнитьОбработкуЗаданий().
Для этого также потребуется запустить выделенный технический сеанс 1С, который будет циклически принудительно заставлять платформу обрабатывать очередь заданий. В модуле управляемого приложения этого сеанса мы подключаем обработчик ожидания с частотой, например, в 5 секунд:
Процедура ПриНачалеРаботыСистемы()
#Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
Если ИмяПользователя() = "ПланировщикФайловый" Тогда
ПодключитьОбработчикОжидания("ПринудительныйЗапускЗаданий", 5, Ложь);
КонецЕсли;
#КонецЕсли;
КонецПроцедуры
Процедура ПринудительныйЗапускЗаданий() Экспорт
// Метод заставляет платформу проверить расписание регламентных заданий прямо сейчас
ВыполнитьОбработкуЗаданий();
КонецПроцедуры
При вызове метода ВыполнитьОбработкуЗаданий() платформа немедленно проверяет таблицу регламентных заданий, находит те, у которых подошло время запуска (так как прошло уже 10 секунд с прошлого запуска), и запускает их, не дожидаясь наступления 60-секундного системного интервала.
Помимо ограничения по времени запуска, при проектировании системы в файловом варианте необходимо учитывать следующие критические особенности:
/AllowExecuteScheduledJobs: По умолчанию планировщик фоновых заданий может инициализироваться в сеансе любого случайного пользователя, зашедшего в базу первым. Это приводит к тому, что компьютер обычного сотрудника начинает заметно притормаживать раз в минуту. Рекомендуется прописывать в параметрах запуска обычных пользователей ключ /AllowExecuteScheduledJobs - (запретить выполнение заданий), а для регламентных задач запускать один выделенный сеанс с ключом /AllowExecuteScheduledJobs +.Понимание этих архитектурных особенностей позволит вам проектировать надежные и быстродействующие решения даже в рамках ограничений файлового режима работы 1С:Предприятия.