При сопровождении и автоматизации типовых или нетиповых конфигураций часто возникает задача: запускать определенную обработку по расписанию, не снимая конфигурацию с поддержки и не внося в нее изменений. В клиент-серверном варианте с типовой подсистемой БСП можно использовать механизм дополнительных отчетов и обработок, однако в файловых базах регламентные задания в фоновом режиме по умолчанию не стартуют без активного сеанса пользователя. Разберем, как решить эту задачу с помощью параметров командной строки, планировщика задач операционной системы и встроенного языка 1С:Предприятия.
Платформа 1С:Предприятие поддерживает специальный ключ командной строки /Execute, который позволяет указать путь к файлу внешней обработки (.epf), выполняемой сразу после старта сеанса. Проанализируем базовый синтаксис команды запуска для файловой или клиент-серверной базы.
Посмотрим на пример пакетного файла (.bat или .cmd), предназначенного для запуска через Планировщик заданий (Windows Task Scheduler):
"C:\Program Files\1cv8\current\bin\1cv8.exe" ENTERPRISE /F "C:\Bases\MyBase" /N "Робот" /P "Пароль" /DisableStartupMessages /Execute "C:\Scripts\MyProcessing.epf"
Разберем параметры командной строки подробнее:
ENTERPRISE — запуск платформы в режиме «1С:Предприятие»./F (или /S для клиент-серверного режима) — указание пути к информационной базе./N и /P — имя пользователя и пароль учетной записи, под которой запускается процесс. Для таких задач рекомендуется заводить отдельного сервисного пользователя./DisableStartupMessages — подавление стартовых диалогов и информационных сообщений при входе в систему./Execute — путь к запускаемому файлу внешней обработки.Часто в рамках одной обработки требуется вызывать различные процедуры в зависимости от времени запуска или дня недели, либо передавать дополнительные флаги выполнения. Для этого используем ключ командной строки /C. Значение, переданное после этого ключа, считывается в коде 1С с помощью свойства глобального контекста ПараметрЗапуска.
Посмотрим на пример командной строки с передачей параметра действия:
"C:\Program Files\1cv8\current\bin\1cv8.exe" ENTERPRISE /F "C:\Bases\MyBase" /N "Робот" /P "Пароль" /DisableStartupMessages /C "ВыгрузитьОстатки" /Execute "C:\Scripts\MyProcessing.epf"
Теперь выясним, как обработать этот параметр внутри формы внешней обработки. При открытии управляемой формы мы считываем свойство ПараметрЗапуска и маршрутизируем выполнение на нужные процедуры:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Проверяем, передан ли параметр через ключ /C
Если Не ПустаяСтрока(ПараметрЗапуска) Тогда
// Подключаем обработчик ожидания для корректного старта после полной отрисовки формы
ПодключитьОбработчикОжидания("ВыполнитьДействиеПоРасписанию", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействиеПоРасписанию()
Попытка
Если ВРег(СокрЛП(ПараметрЗапуска)) = "ВЫГРУЗИТЬОСТАТКИ" Тогда
ВыполнитьВыгрузкуОстатковСервер();
ИначеЕсли ВРег(СокрЛП(ПараметрЗапуска)) = "ЗАГРУЗИТЬЦЕНЫ" Тогда
ВыполнитьЗагрузкуЦенСервер();
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Автозапуск обработки", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// Обязательно завершаем работу сеанса
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
При настройке автоматического исполнения обработок через планировщик необходимо учитывать ряд критических особенностей платформы 1С:Предприятие 8.3:
/Execute лишь открывает файл, но не закрывает 1С после завершения алгоритма. Если в коде не вызвать ЗавершитьРаботуСистемы(Ложь) или ПрекратитьРаботуСистемы(), процесс 1cv8.exe останется висеть в памяти, блокируя клиентские лицензии и последующие запуски.DisableUnsafeActionProtection в конфигурационном файле conf.cfg.Попытка ... Исключение, записывая результаты работы и ошибки в системный журнал через метод ЗаписьЖурналаРегистрации.1cv8c.exe) прямое исполнение серверных алгоритмов из модуля объекта обработки без вызова процедур формы недоступно, поэтому для регламентных задач целесообразно использовать запуск через толстый клиент 1cv8.exe.Рассмотрим другие подходы, если запуск интерактивного сеанса через командную строку не подходит:
V83.COMConnector. Метод ВнешниеОбработки.Создать() позволяет загрузить файл обработки и вызвать требуемую функцию напрямую без отображения пользовательского интерфейса.