При автоматизации рутинных регламентных операций в 1С часто возникает задача запуска обработок по расписанию через планировщик задач операционной системы. Для файлов на диске платформа 1С:Предприятие предоставляет стандартный параметр запуска /Execute <ПутьКФайлу>. Однако при хранении обработок внутри информационной базы — в справочнике ВнешниеОбработки конфигурации «Управление торговлей 10.3» — прямой запуск через ключ командной строки не срабатывает.
Выясним причину этого ограничения, проанализируем архитектуру хранения внешних файлов в базе данных и разберем по шагам надежные способы реализации такого запуска.
Параметр /Execute платформы 1С предназначен исключительно для работы с файловой системой операционной системы. В него можно передать только физический путь к файлу с расширением .epf (или .erf для внешних отчетов). Передать в этот ключ ссылку на элемент справочника, внутренний идентификатор базы или навигационную ссылку невозможно, так как платформа не имеет штатного ключа для вызова обработок прямо из таблиц базы данных.
В конфигурации «Управление торговлей 10.3» файл обработки хранится внутри базы данных как двоичные данные в реквизите ХранилищеВнешнейОбработки справочника ВнешниеОбработки. Следовательно, чтобы запустить такую обработку средствами встроенного языка, необходимо сначала выгрузить двоичные данные во временный файл на диске и подключить его программно.
Рассмотрим базовый алгоритм встроенного языка 1С, позволяющий извлечь файл из справочника и выполнить заложенный в него алгоритм:
ВнешниеОбработки по наименованию или коду.ХранилищеВнешнейОбработки, который имеет тип ХранилищеЗначения.ПолучитьИмяВременногоФайла("epf") и записать туда полученные двоичные данные.ВнешниеОбработки.Создать() или открыть ее интерактивно через ВнешниеОбработки.ПолучитьФорму().Посмотрим на пример программного кода, реализующего эту последовательность действий:
СсылкаНаЭлемент = Справочники.ВнешниеОбработки.НайтиПоНаименованию("ВыгрузкаДанных");
Если Не СсылкаНаЭлемент.Пустая() Тогда
ДвоичныеДанные = СсылкаНаЭлемент.ХранилищеВнешнейОбработки.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Второй параметр "Ложь" отключает безопасный режим, если обработке требуются полные права
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
ОбъектОбработки.ВыполнитьДействие();
// Очищаем временный файл, чтобы не засорять диск
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// Игнорируем ошибку, если файл еще заблокирован платформой
КонецПопытки;
КонецЕсли;
КонецЕсли;
Это наиболее гибкий и безопасный подход, поскольку он не требует внесения изменений в типовую конфигурацию. Конфигурация остается полностью на поддержке поставщика.
Смысл решения заключается в создании компактной внешней обработки-переходника (например, launcher.epf), которая физически лежит на сервере. Командная строка запускает этот лаунчер через /Execute, а в ключе /C передается наименование обработки, которую требуется достать из справочника.
Строка запуска в планировщике задач Windows будет выглядеть следующим образом:
"C:\Program Files\1cv82\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Робот" /P "Пароль" /DisableStartupMessages /C "ВыгрузкаДанных" /Execute "C:\Scripts\launcher.epf"
Разберем, что происходит внутри модуля формы обработки launcher.epf в процедуре ПриОткрытии:
Процедура ПриОткрытии()
ИмяНужнойОбработки = СокрЛП(ПараметрЗапуска);
Если Не ПустаяСтрока(ИмяНужнойОбработки) Тогда
СсылкаНаЭлемент = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяНужнойОбработки);
Если Не СсылкаНаЭлемент.Пустая() Тогда
ДвоичныеДанные = СсылкаНаЭлемент.ХранилищеВнешнейОбработки.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
ВременныйФайл = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ВременныйФайл);
Попытка
Обработка = ВнешниеОбработки.Создать(ВременныйФайл, Ложь);
Обработка.ВыполнитьДействие();
Исключение
ЗаписьЖурналаРегистрации("ЗапускОбработки", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Попытка
УдалитьФайлы(ВременныйФайл);
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Безусловно закрываем сеанс 1С после завершения регламентной операции
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Преимущество такого подхода: при обновлении алгоритма основной обработки достаточно перезаписать ее в справочнике информационной базы. Менять файлы на диске серверов и настройки планировщика задач больше не потребуется.
Если конфигурация уже снята с поддержки и допускает доработку, можно обойтись без файла-лаунчера. Для этого в процедуре ПриНачалеРаботыСистемы модуля обычного приложения выполняется разбор значения ПараметрЗапуска.
Команда запуска платформы будет содержать только параметр /C без ключа /Execute:
"C:\Program Files\1cv82\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Робот" /P "Пароль" /DisableStartupMessages /C "ЗапускОбработки:ВыгрузкаДанных"
В модуле обычного приложения анализируем переданную строку:
Процедура ПриНачалеРаботыСистемы()
// Стандартные вызовы типовой конфигурации...
Если Найти(ПараметрЗапуска, "ЗапускОбработки:") = 1 Тогда
ИмяОбработки = Сред(ПараметрЗапуска, 16);
Ссылка = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОбработки);
Если ЗначениеЗаполнено(Ссылка) Тогда
ДвоичныеДанные = Ссылка.ХранилищеВнешнейОбработки.Получить();
ПутьКФайлу = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ПутьКФайлу);
Попытка
Экземпляр = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Экземпляр.ВыполнитьДействие();
Исключение
ЗаписьЖурналаРегистрации("ФоновыйЗапуск", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
КонецПопытки;
КонецЕсли;
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Еще один вариант, не требующий открытия графического сеанса «1С:Предприятия» и создания временных внешних файлов запуска, — использование внешнего скрипта (VBScript, PowerShell) и механизма COMConnector.
В этом сценарии скрипт подключается к базе напрямую в фоновом режиме, программно считывает справочник ВнешниеОбработки, сохраняет файл во временный каталог и вызывает его исполнение через методы подключенного COM-объекта.
ВнешниеОбработки.Создать(ПутьКФайлу, Ложь) второй параметр обязательно передавайте как Ложь, если обработка взаимодействует с диском, сетью, COM-объектами или выполняет привилегированные действия. При значении Истина функционал обработки будет ограничен./DisableStartupMessages, чтобы информационные окна платформы или сообщения о релизах конфигурации не прерывали выполнение скрипта.УдалитьФайлы() внутри блока Попытка ... Исключение обязателен. При частых запусках обработок без удаления временных файлов системный диск быстро переполнится дубликатами.ЗавершитьРаботуСистемы(Ложь) с параметром Ложь гарантирует безусловный выход из программы без показа модальных окон с вопросами пользователю.