Как запустить внешнюю обработку из справочника через командную строку в 1С:Управление торговлей 10.3

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При автоматизации рутинных регламентных операций в 1С часто возникает задача запуска обработок по расписанию через планировщик задач операционной системы. Для файлов на диске платформа 1С:Предприятие предоставляет стандартный параметр запуска /Execute <ПутьКФайлу>. Однако при хранении обработок внутри информационной базы — в справочнике ВнешниеОбработки конфигурации «Управление торговлей 10.3» — прямой запуск через ключ командной строки не срабатывает.

Выясним причину этого ограничения, проанализируем архитектуру хранения внешних файлов в базе данных и разберем по шагам надежные способы реализации такого запуска.

Ограничение параметра командной строки /Execute

Параметр /Execute платформы 1С предназначен исключительно для работы с файловой системой операционной системы. В него можно передать только физический путь к файлу с расширением .epf (или .erf для внешних отчетов). Передать в этот ключ ссылку на элемент справочника, внутренний идентификатор базы или навигационную ссылку невозможно, так как платформа не имеет штатного ключа для вызова обработок прямо из таблиц базы данных.

В конфигурации «Управление торговлей 10.3» файл обработки хранится внутри базы данных как двоичные данные в реквизите ХранилищеВнешнейОбработки справочника ВнешниеОбработки. Следовательно, чтобы запустить такую обработку средствами встроенного языка, необходимо сначала выгрузить двоичные данные во временный файл на диске и подключить его программно.

Механизм программного извлечения и запуска обработки из справочника

Рассмотрим базовый алгоритм встроенного языка 1С, позволяющий извлечь файл из справочника и выполнить заложенный в него алгоритм:

  1. Найти требуемый элемент в справочнике ВнешниеОбработки по наименованию или коду.
  2. Получить двоичные данные из реквизита ХранилищеВнешнейОбработки, который имеет тип ХранилищеЗначения.
  3. Сформировать путь с помощью метода ПолучитьИмяВременногоФайла("epf") и записать туда полученные двоичные данные.
  4. Подключить обработку методом ВнешниеОбработки.Создать() или открыть ее интерактивно через ВнешниеОбработки.ПолучитьФорму().
  5. Очистить за собой временные файлы после выполнения работы.

Посмотрим на пример программного кода, реализующего эту последовательность действий:


СсылкаНаЭлемент = Справочники.ВнешниеОбработки.НайтиПоНаименованию("ВыгрузкаДанных");

Если Не СсылкаНаЭлемент.Пустая() Тогда
    ДвоичныеДанные = СсылкаНаЭлемент.ХранилищеВнешнейОбработки.Получить();
    
    Если ДвоичныеДанные <> Неопределено Тогда
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
        ДвоичныеДанные.Записать(ИмяВременногоФайла);
        
        // Второй параметр "Ложь" отключает безопасный режим, если обработке требуются полные права
        ОбъектОбработки = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
        ОбъектОбработки.ВыполнитьДействие();
        
        // Очищаем временный файл, чтобы не засорять диск
        Попытка
            УдалитьФайлы(ИмяВременногоФайла);
        Исключение
            // Игнорируем ошибку, если файл еще заблокирован платформой
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Способ 1. Универсальная внешняя обработка-загрузчик (Launcher)

Это наиболее гибкий и безопасный подход, поскольку он не требует внесения изменений в типовую конфигурацию. Конфигурация остается полностью на поддержке поставщика.

Смысл решения заключается в создании компактной внешней обработки-переходника (например, 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С после завершения регламентной операции
    ЗавершитьРаботуСистемы(Ложь);
    
КонецПроцедуры

Преимущество такого подхода: при обновлении алгоритма основной обработки достаточно перезаписать ее в справочнике информационной базы. Менять файлы на диске серверов и настройки планировщика задач больше не потребуется.

Способ 2. Обработка параметра запуска в модуле обычного приложения

Если конфигурация уже снята с поддержки и допускает доработку, можно обойтись без файла-лаунчера. Для этого в процедуре ПриНачалеРаботыСистемы модуля обычного приложения выполняется разбор значения ПараметрЗапуска.

Команда запуска платформы будет содержать только параметр /C без ключа /Execute:


"C:\Program Files\1cv82\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Trade" /N "Робот" /P "Пароль" /DisableStartupMessages /C "ЗапускОбработки:ВыгрузкаДанных"

В модуле обычного приложения анализируем переданную строку:


Процедура ПриНачалеРаботыСистемы()
    
    // Стандартные вызовы типовой конфигурации...
    
    Если Найти(ПараметрЗапуска, "ЗапускОбработки:") = 1 Тогда
        ИмяОбработки = Сред(ПараметрЗапуска, 16);
        Ссылка = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяОбработки);
        
        Если ЗначениеЗаполнено(Ссылка) Тогда
            ДвоичныеДанные = Ссылка.ХранилищеВнешнейОбработки.Получить();
            ПутьКФайлу = ПолучитьИмяВременногоФайла("epf");
            ДвоичныеДанные.Записать(ПутьКФайлу);
            
            Попытка
                Экземпляр = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
                Экземпляр.ВыполнитьДействие();
            Исключение
                ЗаписьЖурналаРегистрации("ФоновыйЗапуск", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
            КонецПопытки;
            
            Попытка
                УдалитьФайлы(ПутьКФайлу);
            Исключение
            КонецПопытки;
        КонецЕсли;
        
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Запуск через COM-соединение

Еще один вариант, не требующий открытия графического сеанса «1С:Предприятия» и создания временных внешних файлов запуска, — использование внешнего скрипта (VBScript, PowerShell) и механизма COMConnector.

В этом сценарии скрипт подключается к базе напрямую в фоновом режиме, программно считывает справочник ВнешниеОбработки, сохраняет файл во временный каталог и вызывает его исполнение через методы подключенного COM-объекта.

Важные технические нюансы

  1. Безопасный режим: При вызове ВнешниеОбработки.Создать(ПутьКФайлу, Ложь) второй параметр обязательно передавайте как Ложь, если обработка взаимодействует с диском, сетью, COM-объектами или выполняет привилегированные действия. При значении Истина функционал обработки будет ограничен.
  2. Подавление диалогов: При автоматическом пакетном запуске всегда используйте параметр /DisableStartupMessages, чтобы информационные окна платформы или сообщения о релизах конфигурации не прерывали выполнение скрипта.
  3. Очистка каталога временных файлов: Вызов УдалитьФайлы() внутри блока Попытка ... Исключение обязателен. При частых запусках обработок без удаления временных файлов системный диск быстро переполнится дубликатами.
  4. Завершение сеанса: Метод ЗавершитьРаботуСистемы(Ложь) с параметром Ложь гарантирует безусловный выход из программы без показа модальных окон с вопросами пользователю.
← На главную