Разработка и отладка регламентных заданий в платформе 1С:Предприятие 8.3 под управлением файлового варианта базы данных часто преподносит неприятные сюрпризы. Механизмы, которые без проблем работают на клиент-серверной архитектуре под управлением планировщика сервера 1С, в файловом режиме ведут себя совершенно иначе. Разработчики часто сталкиваются с тем, что регламентные задания не запускаются в назначенное время, отладчик упорно игнорирует точки останова, а система выдает неочевидные ошибки времени выполнения.
В этой статье мы подробно проанализируем реальный практический кейс, разберем ключевые особенности файлового планировщика задач, выявим причины типичных ошибок и составим пошаговую инструкцию по корректной настройке регламентных заданий.
---
Для начала разберем главный вопрос: почему регламентное задание автора не отрабатывало, когда в расписании был задан жесткий интервал активности (например, с 14:00 до 14:02), но стабильно запустилось после настройки повторения «каждые 100 секунд»?
В клиент-серверном варианте за планирование и запуск фоновых задач отвечает специальный менеджер кластера. Он работает непрерывно и с точностью до миллисекунд инициирует выполнение потоков. В файловом режиме полноценный сервер отсутствует. Роль планировщика выполняет активный сеанс пользователя, запущенный в режиме «Предприятие».
Платформа осуществляет периодический опрос очереди регламентных заданий. По умолчанию этот опрос происходит примерно один раз в минуту (или при вызове метода ВыполнитьОбработкуЗаданий()). Проанализируем, к чему это приводит на практике:
---
Когда регламентное задание автора наконец запустилось, оно мгновенно завершилось аварийно с ошибкой нехватки параметров. Посмотрим на код процедуры, которую пытался вызвать автор:
Процедура ПроизвестиФоновоеВычисление(Параметр) Экспорт
ВыполнитьОбработкуЗаданий;
ВремНач = ТекущаяДата; // Обратите внимание: правильно писать ТекущаяДата() со скобками
Пока ТекущаяДата() - ВремНач <= 2 Цикл
// Имитация задержки
КонецЦикла;
КонецПроцедуры
В чем заключается ошибка? Метод общего модуля, который напрямую привязывается к регламентному заданию в конфигураторе через свойство «Имя метода», вызывается планировщиком без передачи аргументов. Если в объявлении процедуры указан обязательный параметр Параметр, платформа не сможет сопоставить вызов и выбросит исключение.
Разберем два способа решения этой проблемы.
Самый простой вариант — сделать все параметры процедуры общего модуля необязательными. Для этого достаточно присвоить им значение по умолчанию (например, Неопределено) непосредственно в сигнатуре метода:
Процедура ПроизвестиФоновоеВычисление(Параметр = Неопределено) Экспорт
// Теперь процедуру можно вызывать как с параметром, так и без него
Если Параметр <> Неопределено Тогда
// Логика обработки переданного параметра
КонецЕсли;
КонецПроцедуры
Если параметры передавать необходимо и они определяются динамически, стандартного интерактивного расписания будет недостаточно. В этом случае нам потребуется создать и запустить задание программно, передав параметры в виде массива:
// Создаем массив параметров для передачи в фоновое задание
МассивПараметров = Новый Массив;
МассивПараметров.Добавить("ВажноеЗначениеПараметра");
// Получаем регламентное задание по метаданным или ищем существующее
РеглЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.МоеРегламентноеЗадание);
РеглЗадание.Параметры = МассивПараметров;
РеглЗадание.Использование = Истина;
РеглЗадание.Записать();
---
В процессе обсуждения на форуме автору посоветовали включить флаг «Вызов сервера» (Server call) для общего модуля, в котором расположена процедура регламентного задания. Рассмотрим подробнее, почему этот совет является технически неверным и вредным.
---
Автор темы столкнулся с тем, что при ручном запуске фонового задания через обработку отладчик сработал на точке останова только спустя 7–8 минут. Почему возникла такая гигантская задержка?
Это связано со спецификой однопоточности файлового режима выполнения задач:
rphost).---
Если у вас не запускается регламентное задание, последовательно пройдите по следующим шагам для локализации проблемы:
Процедура ПриНажатииКнопки()
ВыполнитьОбработкуЗаданий();
КонецПроцедуры
Использование установлен в значение Истина. Сделать это надежнее всего через универсальную обработку «Консоль регламентных заданий».