В процессе эксплуатации файловых баз данных «1С:Предприятие 8» разработчики и администраторы часто сталкиваются с проблемой: регламентные и фоновые задания либо вообще не выполняются, если в системе нет активных пользователей, либо работают крайне нестабильно («через раз»), когда пользователи находятся в системе. В этой статье мы подробно разберем внутренние механизмы планировщика заданий в файловом режиме, выясним причины такого поведения платформы и рассмотрим эффективные практические способы решения этой проблемы.
Для начала проанализируем архитектуру файлового режима работы «1С:Предприятие». В отличие от клиент-серверного варианта, где за выполнение расписания отвечает служба кластера серверов 1С (которая запущена непрерывно как служба Windows или демон Linux), в файловом режиме выделенного сервера приложений нет. База данных представляет собой физический файл 1Cv8.1CD на диске.
Это означает, что исполнять программный код регламентных заданий физически некому, если не запущено ни одно клиентское приложение (тонкий, толстый или веб-клиент). Компьютер или сервер «не знает» о внутреннем расписании базы данных 1С, пока не инициализирован исполняемый движок платформы.
Ранее, в старых версиях платформы (до версии 8.3.3), для автоматического выполнения задач требовалось запускать отдельный служебный сеанс 1С, который выполнял роль планировщика. В этом сеансе с помощью обработки ожидания регулярно вызывался метод ВыполнитьОбработкуЗаданий(). Это было крайне неудобно, так как требовало постоянного контроля за «висящим» окном программы.
Начиная с версии 8.3.3, фирма «1С» существенно упростила этот механизм. Теперь при запуске любого клиентского приложения (тонкого или толстого клиента), а также при наличии активных соединений с веб-сервером, платформа автоматически создает внутри этого приложения дополнительный фоновый поток. Этот поток и занимается выполнением регламентных заданий. Метод ВыполнитьОбработкуЗаданий() больше вызывать вручную не нужно.
Если пользователи в базе есть, но задания все равно выполняются нерегулярно, причинами могут быть следующие особенности платформы:
Рассмотрим по шагам три проверенных сценария настройки, которые помогут обойти эти ограничения и добиться стабильной работы автоматизации.
---
Если в вашей базе постоянно работают несколько пользователей, необходимо исключить ситуацию, когда регламентные задания пытаются выполняться на их слабых рабочих станциях. Мы можем принудительно указать платформе, какому компьютеру разрешено выполнять фоновые задачи, а каким — строго запрещено.
Для этого используются параметры запуска командной строки 1С:
/AllowExecuteScheduledJobs — разрешить выполнение регламентных заданий в данном сеансе./DenyExecuteScheduledJobs — запретить выполнение регламентных заданий в данном сеансе.Алгоритм настройки:
/DenyExecuteScheduledJobs/AllowExecuteScheduledJobsТаким образом, выполнение фоновых процессов сосредоточится исключительно в одном контролируемом сеансе, не мешая остальным пользователям и не вызывая зависаний их систем.
---
Что делать, если ночью в базе никого нет, а регламентные задания (например, резервное копирование или обмен с сайтом) должны отработать? Наиболее надежный способ — настроить регулярный автоматический запуск специального «технического» сеанса 1С через планировщик операционной системы Windows.
Разберем по шагам, как настроить этот процесс:
Шаг 1. Создание служебного пользователя в 1С
В конфигураторе создайте нового пользователя, например, с именем Робот. Назначьте ему полные права (роль Администратор), чтобы у платформы не возникало проблем с доступом к объектам метаданных при выполнении кода под служебной учетной записью DefUser.
Шаг 2. Написание кода для автоматического завершения работы
Чтобы сеанс «Робота» не висел в системе вечно, занимая лицензию и оперативную память, настроим его автоматическое закрытие сразу после того, как он выполнит все необходимые фоновые задачи. Для этого в Конфигураторе откройте Модуль управляемого приложения и найдите предопределенную процедуру ПриНачалеРаботыСистемы(). Добавим в нее код анализа параметров запуска:
Процедура ПриНачалеРаботыСистемы()
// Получаем параметры, переданные через ключ /C командной строки
ПараметрыЗапускаСкрипта = ПараметрыЗапуска;
Если Найти(ВРег(ПараметрыЗапускаСкрипта), "START_ROBOT") > 0 Тогда
// Записываем событие старта в Журнал регистрации
ЗаписатьВЖурналРегистрации("РегламентныеЗадания.Робот",
УровеньЖурналаРегистрации.Информация, , ,
"Запущен регламентный сеанс обслуживания базы.");
Попытка
// Платформа автоматически запустит фоновый поток выполнения регламентных заданий.
// Даем ей время на выполнение задач (например, приостанавливаем поток на 2 минуты)
Предупреждение("Выполнение регламентных задач...", 120);
Исключение
ЗаписатьВЖурналРегистрации("РегламентныеЗадания.Робот",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// Завершаем работу сеанса без вывода диалоговых окон
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Шаг 3. Настройка Планировщика Windows
"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe"ENTERPRISE /F "C:\1C_Bases\MyBase" /N "Робот" /P "ПарольРобота" /C "START_ROBOT" /AllowExecuteScheduledJobsТеперь планировщик Windows будет самостоятельно запускать сеанс 1С в фоновом режиме по расписанию. Сеанс отработает регламентные задания в течение двух минут и корректно закроется, освободив ресурсы компьютера.
---
Если ваша файловая база данных опубликована на веб-сервере (под управлением Microsoft IIS или Apache), веб-сервер способен самостоятельно управлять фоновыми заданиями. Однако для этого также требуется хотя бы одно активное соединение.
Для реализации этого метода можно использовать любой внешний скрипт (например, на языке PowerShell, Python или с помощью утилиты cURL), который будет отправлять пустые HTTP/GET-запросы по расписанию к вашей базе (например, обращаясь к простейшему опубликованному HTTP-сервису 1С).
При получении запроса веб-сервер инициализирует сеанс связи с файловой БД. Платформа тут же проверяет очередь регламентных заданий, запускает накопившиеся фоновые процессы в отдельном потоке, обрабатывает их и закрывает соединение. Это элегантное и незаметное решение, которое отлично подходит для баз данных, работающих в режиме 24/7.