Как запускать внутреннюю или внешнюю обработку по расписанию в 1С:Предприятии 8.3?

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

При автоматизации бизнес-процессов в среде 1С часто возникает необходимость выполнять определенные действия регулярно и без участия пользователя. Типичный пример — периодическая загрузка заказов с внешнего сайта или маркетплейса через API каждые несколько минут. Начинающие разработчики часто сталкиваются с трудностями при переносе интерактивного кода (нажатия кнопки на форме) в фоновый режим.

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

Почему возникает ошибка при попытке открыть форму на сервере?

В процессе разработки программисты часто пытаются использовать привычные методы вроде ПолучитьФорму() или вызвать процедуру модуля формы из фонового задания. В результате система выдает критическую ошибку выполнения. Выясним причину этого поведения.

Регламентные и фоновые задания в 1С всегда выполняются строго на сервере. На сервере полностью отсутствует понятие графического интерфейса пользователя (экран, окна, диалоги). Платформа 1С физически не может инициализировать элементы формы, так как для них нет контекста отображения. Любые интерактивные методы, такие как Предупреждение(), Вопрос(), работа с элементами формы или вызовы процедур с директивой &НаКлиенте, на сервере вызовут исключение. Поэтому бизнес-логику интеграции необходимо четко отделять от интерфейсной части.

Рассмотрим по шагам, как правильно структурировать код и настроить расписание.

Способ 1. Запуск встроенной обработки через регламентное задание

Если обработка уже интегрирована в метаданные вашей конфигурации (является встроенной), нам не нужно полностью переносить весь ее код в общий модуль. Мы можем оставить основную логику в модуле объекта обработки, а из общего модуля лишь инициализировать ее выполнение.

Выполним следующие действия:

  1. Откроем конфигуратор и найдем нашу встроенную обработку.
  2. Перейдем в Модуль объекта обработки (не путать с модулем формы).
  3. Разместим там основную процедуру интеграции, обязательно добавив ключевое слово Экспорт:

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

Теперь нам нужно создать точку входа для регламентного задания. Напрямую обратиться к модулю объекта обработки регламентное задание не может — оно умеет работать только с экспортными процедурами общих модулей. Создадим такой модуль:

  1. В ветке конфигурации Общие -> Общие модули добавим новый модуль с именем РегламентныеПроцедурыСервер.
  2. В свойствах модуля обязательно установим флаг Сервер и снимем флаг Клиент (управляемое приложение). Флаг Вызов сервера устанавливается при необходимости вызывать методы модуля из клиентского контекста.
  3. Пропишем в модуле процедуру-обертку, которая будет создавать экземпляр нашей обработки на сервере:

Процедура ЗагрузитьЗаказыПоРасписанию() Экспорт
    // Создаем объект обработки напрямую на сервере без инициализации формы
    ОбработкаОбъект = Обработки.ИмяВашейОбработки.Создать();
    // Вызываем экспортный метод модуля объекта
    ОбработкаОбъект.ВыполнитьЗагрузкуЗаказовИзИнтернета();
КонецПроцедуры

Остается настроить само регламентное задание:

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

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

Способ 2. Использование БСП для запуска внешних обработок (без изменения конфигурации)

Если ваша база находится на поддержке и вы не хотите вносить изменения в структуру метаданных (чтобы облегчить последующие обновления базы), оптимальным решением будет использование подсистемы "Дополнительные отчеты и обработки" Библиотеки стандартных подсистем (БСП). Этот механизм присутствует во всех типовых конфигурациях (УТ, ERP, КА, УНФ, БП).

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

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


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

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

Теперь добавим в этот же модуль объекта экспортную процедуру ВыполнитьКоманду(), которую БСП автоматически вызовет при запуске регламентного задания:


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
    Если ИдентификаторКоманды = "ЗапуститьЗагрузку" Тогда
        ВыполнитьОсновнуюЛогикуИнтеграции();
    КонецЕсли;
КонецПроцедуры

Процедура ВыполнитьОсновнуюЛогикуИнтеграции()
    // Основной рабочий код работы с HTTP-запросами
    // Например:
    // Соединение = Новый HTTPСоединение("api.mysite.com");
    // Запрос = Новый HTTPЗапрос("/orders");
    // Ответ = Соединение.Получить(Запрос);
КонецПроцедуры

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

  1. Откроем раздел НСИ и администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  2. Нажмем кнопку Добавить из файла и выберем нашу внешнюю обработку .epf.
  3. Обратите внимание, что система автоматически прочитает функцию СведенияОВнешнейОбработке() и заполнит таблицу команд.
  4. В строке с нашей командой появится колонка "Расписание". Нажмите на ссылку "Не настроено" и в открывшемся окне задайте периодичность запуска (например, каждые 5 минут).
  5. Нажмите кнопку Записать и закрыть. Платформа самостоятельно зарегистрирует фоновое регламентное задание в СУБД, которое будет вызывать процедуру ВыполнитьКоманду().

Способ 3. Запуск внешней обработки через Планировщик задач Windows

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

Создадим исполняемый bat-файл (например, run_integration.bat) со следующим содержимым:


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\1C_Bases\Trade" /N "ScheduledRobot" /P "RobotPassword" /Execute "C:\1C_External\LoadOrders.epf" /NoSplash

Разберем ключевые параметры этой командной строки:

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

В форме внешней обработки LoadOrders.epf пропишем обработчик события открытия формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Запуск основной процедуры обработки данных
    ВыполнитьЗагрузкуДанныхНаСервере();
    
    // Принудительное завершение работы приложения 1С без вывода интерактивных диалогов
    ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗагрузкуДанныхНаСервере()
    // Логика интеграции с веб-сайтом
КонецПроцедуры

Затем настроим Планировщик задач Windows (Task Scheduler): создадим новую простую задачу, укажем триггер "Ежедневно", настроим повторение задачи каждые 5 или 10 минут и выберем запуск нашего bat-файла в качестве действия.

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

Особенности выполнения регламентных заданий в файловом и клиент-серверном режимах базы

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

В клиент-серверном режиме регламентные задания выполняются полностью в автоматическом фоновом режиме на стороне сервера приложений 1С:Предприятия. Процесс контролируется менеджером кластера. Никаких дополнительных действий со стороны администратора не требуется. Задания будут выполняться точно по расписанию 24/7, даже если в базе нет ни одного активного пользователя.

В файловом режиме регламентные задания сами по себе не запускаются, так как в файловой базе нет постоянно активного серверного процесса. Выполнение заданий происходит только в контексте какого-либо запущенного клиентского сеанса. Это означает, что если в базе никто не работает, расписание выполняться не будет. Для решения этой проблемы необходимо организовать постоянный выделенный сеанс (например, запустить Тонкий клиент на сервере под специальной учетной записью) или настроить веб-сервер (IIS/Apache) для публикации базы, где обработчик заданий будет инициализироваться пулом соединений.

Важные нюансы работы с сетевыми HTTP-запросами на сервере

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

1. Права доступа серверной учетной записи в Интернет. Сервер приложений 1С обычно функционирует под специальной системной учетной записью (например, USR1CV8 в Windows или 1c в Linux). Часто системные администраторы ограничивают доступ в интернет для технологических учетных записей сервера в целях безопасности. Если регламентное задание падает с ошибкой "Не удалось установить соединение", в первую очередь необходимо проверить сетевые доступы и правила брандмауэра именно для учетной записи службы 1С.

2. Проблемы с SSL-сертификатами при HTTPS-соединении. Если вы подключаетесь к сайту по защищенному протоколу HTTPS, платформа 1С при установке HTTP-соединения проверяет цепочку SSL-сертификатов целевого ресурса. Если сертификат сайта самоподписанный или выдан не доверенным центром сертификации, сервер 1С заблокирует соединение. Чтобы решить эту проблему, необходимо установить корневой сертификат веб-сайта в локальное хранилище доверенных сертификатов операционной системы, под которой запущен сервер приложений 1С, либо явно отключить валидацию SSL-сертификата в коде (хотя это снижает безопасность соединения):


// Пример защищенного HTTP-соединения без проверки сертификата (для отладки)
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("api.mysite.com", 443, , , , 15, Защита);

Используя представленные шаблоны кода и выбрав подходящий под вашу архитектуру метод настройки расписания, мы сможем эффективно автоматизировать любые рутинные операции импорта и экспорта данных в 1С:Предприятии 8.3.

← На главную