Как запустить внешнюю обработку по расписанию в 1С:УПП на обычных формах?

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

Приветствуем вас, уважаемые коллеги! Сегодня мы подробно разберем одну из классических и крайне востребованных задач в сфере администрирования и программирования «1С:Предприятие» — автоматический запуск внешней обработки (файла с расширением .epf) по заданному расписанию. Особый интерес этой задаче придает контекст: мы работаем с конфигурацией «Управление производственным предприятием» (УПП) на платформе 8.3 с использованием обычных форм.

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

Вариант 1. Программный вызов обработки через регламентное задание (Рекомендуемый способ)

Этот способ является наиболее надежным и профессиональным, так как он позволяет полностью контролировать процесс выполнения на стороне сервера «1С:Предприятия», вести подробное логирование в журнал регистрации и не зависеть от работы конкретных пользовательских сеансов или сторонних утилит операционной системы.

Суть метода заключается в том, что мы сохраняем внешнюю обработку в стандартный справочник информационной базы (например, ВнешниеОбработки), создаем новое регламентное задание в Конфигураторе и прописываем код, который будет программно извлекать файл обработки на сервере, запускать его и выполнять нужную процедуру. Для наполнения базы файлами можно использовать обработку для пакетной загрузки внешних обработок в справочник.

Рассмотрим весь процесс по шагам.

Шаг 1. Подготовка модуля внешней обработки

Прежде всего, нам необходимо убедиться, что логика импорта XML-данных и создания документов «Отчет о розничных продажах» полностью отделена от экранных форм. Перенесем всю бизнес-логику в модуль объекта нашей внешней обработки и оформим ее в виде экспортной процедуры. Откроем модуль объекта обработки и создадим в нем следующую конструкцию:


Процедура ВыполнитьИмпортДанных() Экспорт
    // Здесь располагается основная логика чтения XML
    // и создания документов "Отчет о розничных продажах"
    
    ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
        УровеньЖурналаРегистрации.Информация,
        ,
        ,
        "Запуск процедуры импорта успешно произведен.");
        
    // Код чтения XML-файла и создания документов...
КонецПроцедуры

Шаг 2. Создание общего модуля в Конфигураторе

Для того чтобы регламентное задание могло вызвать наш код, нам понадобится общий модуль с определенными свойствами. Выполним следующие действия:

  1. В дереве метаданных Конфигуратора перейдем в ветку Общие -> Общие модули и добавим новый модуль (назовем его, например, мРегламентныеЗаданияСервер).
  2. В палитре свойств созданного модуля установим флаг «Сервер» и снимем флаг «Клиент (обычное приложение)». Свойство «Вызов сервера» можно оставить выключенным, если вызовы из клиентского кода не планируются.

Шаг 3. Написание кода вызова обработки

Теперь напишем в общем модуле процедуру, которая будет извлекать внешнюю обработку из справочника, сохранять ее во временную директорию на сервере, инициализировать объект и запускать экспортную процедуру. Проанализируем пример кода:


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

Шаг 4. Настройка регламентного задания в метаданных

Возвращаемся в Конфигуратор и выполняем финальные настройки:

  1. В дереве метаданных находим ветку Общие -> Регламентные задания и добавляем новое задание (например, РегламентныйИмпортДанныхXML).
  2. В поле «Имя метода» нажимаем кнопку выбора и указываем созданную нами процедуру общего модуля: мРегламентныеЗаданияСервер.ЗапуститьИмпортРозничныхПродаж.
  3. Устанавливаем флаг «Использование».
  4. Нажимаем на гиперссылку «Расписание» и настраиваем его: на вкладке «Дневное» указываем время начала — 09:15:00, а на вкладке «Общие» задаем ежедневное повторение.

Теперь сервер 1С:Предприятия будет самостоятельно запускать процедуру каждый день в назначенное время.

Вариант 2. Запуск через планировщик задач операционной системы (Альтернативный способ)

Если конфигурация находится на жесткой поддержке, и вы категорически избегаете добавления новых объектов метаданных в Конфигураторе, можно использовать запуск 1С в режиме предприятия из командной строки Windows (или Linux) с помощью планировщика задач (Task Scheduler). Для такой задачи также подойдёт готовый механизм запуска обработок по расписанию без изменения конфигурации.

Для этого мы можем настроить запуск платформы с параметрами пакетного выполнения логики. Посмотрим на пример команды для планировщика Windows:


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\Bases\UPP_UA" /N"РоботРозничнойПродажи" /P"ПарольРобота" /Execute"C:\Processed\ImportXml.epf"

В самой обработке ImportXml.epf в модуле формы или в модуле объекта при старте системы необходимо прописать автоматическое закрытие программы после выполнения логики:


Процедура ПриОткрытии()
    Попытка
        ВыполнитьИмпортДанных();
    Исключение
        ЗаписьЖурналаРегистрации("ВнешнийЗапуск", УровеньЖурналаРегистрации.КритическаяОшибка,,, ОписаниеОшибки());
    КонецПопытки;
    
    // Завершаем работу сеанса 1С
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

Важное предостережение: Данный способ расходует одну клиентскую лицензию на время выполнения и требует постоянно включенного компьютера с запущенной учетной записью пользователя ОС, из-под которой планировщик будет стартовать сеанс. Кроме того, хранение пароля пользователя 1С в открытом виде в файлах сценариев снижает безопасность системы.

Критически важные нюансы при переносе кода на сервер

Очень часто программисты сталкиваются с тем, что обработка, которая отлично работала при ручном запуске пользователем, выдает ошибки или завершается аварийно при выполнении в регламентном задании. Давайте проанализируем основные причины таких сбоев и способы их предотвращения.

  1. Отсутствие клиентского окружения (Интерактивных методов):

    Поскольку фоновое задание выполняется непосредственно на сервере 1С без участия пользователя, в коде обработки категорически запрещено использовать такие операторы и методы, как Предупреждение(), Вопрос(), ОткрытьФорму(), а также обращаться к свойствам активного окна. Любой подобный вызов приведет к немедленной остановке процесса с ошибкой «Интерактивные операции недоступны».

    Вместо вывода предупреждений на экран всегда используйте метод ЗаписьЖурналаРегистрации(). Это позволит вам контролировать ход выполнения фонового процесса через стандартный инструмент администратора.

  2. Права доступа к файловой системе (XML-файлу):

    Если при ручном запуске вы читали файл, лежащий на вашем рабочем столе (например, C:\Users\User\Desktop\import.xml), то серверное регламентное задание не сможет получить к нему доступ. Серверная часть 1С выполняется под своей системной учетной записью (часто это локальный пользователь USR1CV8).

    Убедитесь, что:

    • Путь к файлу XML указан как сетевой путь (UNC, например: \\server-storage\exchange\import.xml) либо файл предварительно загружается на диск сервера.
    • Учетная запись ОС, от имени которой запущена служба «Агент сервера 1С:Предприятия», имеет полные права доступа (на чтение, запись и удаление) к этому каталогу.
  3. Контроль безопасного режима в платформе 8.3:

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

    Если вашей обработке требуется загружать данные из файлов или использовать внешние компоненты, обязательно передавайте параметр Ложь во второй параметр метода ВнешниеОбработки.Создать(), чтобы отключить безопасный режим. Также убедитесь, что в свойствах пользователя, под которым запускается регламентное задание, отключена опция «Защита от опасных действий» (начиная с релизов платформы 8.3.9).

  4. Работа с COM-объектами на сервере:

    Если для парсинга XML или файлов Excel в коде обработки используются вызовы типа Новый COMОбъект("Excel.Application") или библиотеки парсинга MSXML, помните, что эти компоненты должны быть установлены и зарегистрированы непосредственно на самом физическом сервере приложений 1С. Для 64-битного сервера приложений 1С потребуются 64-битные версии драйверов и COM-объектов. Для стабильности настоятельно рекомендуется использовать встроенные средства платформы — объект ЧтениеXML, который работает быстро, стабильно и не зависит от стороннего ПО.

Используя приведенные инструкции и учитывая серверную специфику работы фоновых заданий, вы сможете без труда автоматизировать рутинные операции импорта данных в вашей конфигурации «1С:УПП», обеспечив надежность и стабильность бизнес-процессов.

← На главную