Приветствуем вас, уважаемые коллеги! Сегодня мы подробно разберем одну из классических и крайне востребованных задач в сфере администрирования и программирования «1С:Предприятие» — автоматический запуск внешней обработки (файла с расширением .epf) по заданному расписанию. Особый интерес этой задаче придает контекст: мы работаем с конфигурацией «Управление производственным предприятием» (УПП) на платформе 8.3 с использованием обычных форм.
В отличие от современных конфигураций, построенных на базе Библиотеки стандартных подсистем (БСП) для управляемых форм, в старых редакциях УПП нет интуитивно понятного и полностью готового механизма для привязки расписания к произвольным внешним обработкам в пользовательском режиме. Тем не менее, решить эту задачу можно несколькими надежными способами. Давайте проанализируем ситуацию, выясним основные причины возможных ошибок и разберем по шагам наиболее эффективные варианты реализации.
Этот способ является наиболее надежным и профессиональным, так как он позволяет полностью контролировать процесс выполнения на стороне сервера «1С:Предприятия», вести подробное логирование в журнал регистрации и не зависеть от работы конкретных пользовательских сеансов или сторонних утилит операционной системы.
Суть метода заключается в том, что мы сохраняем внешнюю обработку в стандартный справочник информационной базы (например, ВнешниеОбработки), создаем новое регламентное задание в Конфигураторе и прописываем код, который будет программно извлекать файл обработки на сервере, запускать его и выполнять нужную процедуру. Для наполнения базы файлами можно использовать обработку для пакетной загрузки внешних обработок в справочник.
Рассмотрим весь процесс по шагам.
Шаг 1. Подготовка модуля внешней обработки
Прежде всего, нам необходимо убедиться, что логика импорта XML-данных и создания документов «Отчет о розничных продажах» полностью отделена от экранных форм. Перенесем всю бизнес-логику в модуль объекта нашей внешней обработки и оформим ее в виде экспортной процедуры. Откроем модуль объекта обработки и создадим в нем следующую конструкцию:
Процедура ВыполнитьИмпортДанных() Экспорт
// Здесь располагается основная логика чтения XML
// и создания документов "Отчет о розничных продажах"
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Информация,
,
,
"Запуск процедуры импорта успешно произведен.");
// Код чтения XML-файла и создания документов...
КонецПроцедуры
Шаг 2. Создание общего модуля в Конфигураторе
Для того чтобы регламентное задание могло вызвать наш код, нам понадобится общий модуль с определенными свойствами. Выполним следующие действия:
мРегламентныеЗаданияСервер).Шаг 3. Написание кода вызова обработки
Теперь напишем в общем модуле процедуру, которая будет извлекать внешнюю обработку из справочника, сохранять ее во временную директорию на сервере, инициализировать объект и запускать экспортную процедуру. Проанализируем пример кода:
Процедура ЗапуститьИмпортРозничныхПродаж() Экспорт
// 1. Поиск обработки в справочнике по наименованию
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("Импорт розницы из XML");
Если СсылкаНаОбработку.Пустая() Тогда
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Не найдена внешняя обработка в справочнике 'ВнешниеОбработки'!");
Возврат;
КонецЕсли;
// 2. Получение двоичных данных файла обработки из хранилища значений
ДвоичныеДанныеФайла = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
Если ДвоичныеДанныеФайла = Неопределено Тогда
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Хранилище внешней обработки пустое!");
Возврат;
КонецЕсли;
// 3. Создание уникального временного файла на диске сервера
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
Попытка
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
Исключение
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при записи временного файла на сервере: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 4. Подключение и запуск обработки
Попытка
// Передаем Ложь во втором параметре, чтобы отключить безопасный режим, если требуется
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
ОбработкаОбъект.ВыполнитьИмпортДанных();
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Информация,
,
,
"Импорт данных из XML успешно завершен регламентным заданием.");
Исключение
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Произошла критическая ошибка при выполнении обработки: " + ОписаниеОшибки());
КонецПопытки;
// 5. Обязательная очистка временных файлов
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// Игнорируем ошибку удаления, чтобы не прерывать транзакцию, но фиксируем в лог
ЗаписьЖурналаРегистрации("РегламентныйИмпорт",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось удалить временный файл " + ИмяВременногоФайла);
КонецПопытки;
КонецПроцедуры
Шаг 4. Настройка регламентного задания в метаданных
Возвращаемся в Конфигуратор и выполняем финальные настройки:
РегламентныйИмпортДанныхXML).мРегламентныеЗаданияСервер.ЗапуститьИмпортРозничныхПродаж.Теперь сервер 1С:Предприятия будет самостоятельно запускать процедуру каждый день в назначенное время.
Если конфигурация находится на жесткой поддержке, и вы категорически избегаете добавления новых объектов метаданных в Конфигураторе, можно использовать запуск 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С без участия пользователя, в коде обработки категорически запрещено использовать такие операторы и методы, как Предупреждение(), Вопрос(), ОткрытьФорму(), а также обращаться к свойствам активного окна. Любой подобный вызов приведет к немедленной остановке процесса с ошибкой «Интерактивные операции недоступны».
Вместо вывода предупреждений на экран всегда используйте метод ЗаписьЖурналаРегистрации(). Это позволит вам контролировать ход выполнения фонового процесса через стандартный инструмент администратора.
Если при ручном запуске вы читали файл, лежащий на вашем рабочем столе (например, C:\Users\User\Desktop\import.xml), то серверное регламентное задание не сможет получить к нему доступ. Серверная часть 1С выполняется под своей системной учетной записью (часто это локальный пользователь USR1CV8).
Убедитесь, что:
\\server-storage\exchange\import.xml) либо файл предварительно загружается на диск сервера.По умолчанию при создании объектов внешних обработок на сервере платформа 8.3 может запускать их в безопасном режиме. В безопасном режиме накладываются жесткие ограничения на использование COM-объектов, доступ к файловой системе и сети Интернет.
Если вашей обработке требуется загружать данные из файлов или использовать внешние компоненты, обязательно передавайте параметр Ложь во второй параметр метода ВнешниеОбработки.Создать(), чтобы отключить безопасный режим. Также убедитесь, что в свойствах пользователя, под которым запускается регламентное задание, отключена опция «Защита от опасных действий» (начиная с релизов платформы 8.3.9).
Если для парсинга XML или файлов Excel в коде обработки используются вызовы типа Новый COMОбъект("Excel.Application") или библиотеки парсинга MSXML, помните, что эти компоненты должны быть установлены и зарегистрированы непосредственно на самом физическом сервере приложений 1С. Для 64-битного сервера приложений 1С потребуются 64-битные версии драйверов и COM-объектов. Для стабильности настоятельно рекомендуется использовать встроенные средства платформы — объект ЧтениеXML, который работает быстро, стабильно и не зависит от стороннего ПО.
Используя приведенные инструкции и учитывая серверную специфику работы фоновых заданий, вы сможете без труда автоматизировать рутинные операции импорта данных в вашей конфигурации «1С:УПП», обеспечив надежность и стабильность бизнес-процессов.