Как настроить выполнение обработки 1С по расписанию и сохранить возможность ручного запуска?

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

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

Разделение логики: перенос кода из модуля формы в модуль объекта

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

Нам необходимо перенести всю бизнес-логику (подключение к серверу, формирование GET и POST запросов, парсинг ответов) в Модуль объекта. Процедуры в модуле объекта должны быть помечены ключевым словом Экспорт, чтобы их можно было вызвать как из формы, так и из регламентного задания.

Рассмотрим пример правильной структуры процедуры в модуле объекта:


Процедура ВыполнитьОбменДанными() Экспорт
    // Логика подключения к сайту
    Соединение = Новый HTTPСоединение("mysite.com", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос("/api/data");
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            // Обработка данных
            СоздатьДокументыНаОснованииДанных(Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ОбменССайтом", УровеньЖурналаРегистрации.Ошибка, , , КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
КонецПроцедуры

Работа с данными и табличными частями

Часто в ручном режиме программисты используют табличные части формы для предварительного просмотра загруженных данных. Чтобы эта логика работала в регламентном задании, мы должны перенести реквизиты и табличные части из Формы в саму Обработку (как объект метаданных). Это позволит нам заполнять их в памяти сервера даже при отсутствии открытого окна у пользователя.

Выясним, как обеспечить универсальность запуска. В модуле формы при нажатии на кнопку "Выполнить" мы будем вызывать метод модуля объекта следующим образом:


&НаСервере
Процедура ВыполнитьНаСервере()
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    ОбъектОбработки.ВыполнитьОбменДанными();
    ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры

Метод РеквизитФормыВЗначение превращает данные формы в объект обработки, где доступен наш экспортный метод ВыполнитьОбменДанными. После выполнения мы возвращаем данные обратно в форму через ЗначениеВРеквизитФормы, чтобы пользователь увидел результат в табличной части.

Интеграция с Библиотекой стандартных подсистем (БСП)

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

Разберем пример структуры этой функции:


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

При такой настройке вы сможете загрузить обработку в справочник "Дополнительные отчеты и обработки" и прямо там настроить расписание в интерфейсе программы, не прибегая к изменению конфигурации в режиме "Конфигуратор".

Особенности выполнения HTTP-запросов на сервере

Проанализируем технические нюансы, которые могут привести к ошибкам при переходе в фоновый режим:

  1. SSL-сертификаты: Если обмен идет через HTTPS, сервер 1С должен доверять сертификату сайта. Используйте объект Новый ЗащищенноеСоединениеOpenSSL() в конструкторе HTTPСоединение.
  2. Прокси-сервер: На сервере могут быть другие настройки интернета, отличные от вашего рабочего места. Убедитесь, что параметры прокси настроены в 1С:Предприятии или прописаны в коде.
  3. Таймауты: В регламентных заданиях всегда устанавливайте таймаут (например, 30-60 секунд). Это предотвратит "зависание" рабочих процессов сервера, если сайт перестанет отвечать.

Логирование и оповещение об ошибках

В ручном режиме вы видите ошибки в окне сообщений. В фоновом режиме Сообщить не работает. Поэтому крайне важно использовать ЗаписьЖурналаРегистрации. Проанализируем, как это реализовать структурно: фиксируйте не только ошибки, но и количество созданных документов. Это позволит системному администратору контролировать работу обмена через стандартный журнал регистрации 1С.

Важный совет: При регламентном запуске старайтесь минимизировать работу с интерфейсными вещами. Если в обработке есть функции Вопрос или Предупреждение, они должны быть строго ограничены условием #Если Клиент Тогда, иначе фоновое задание завершится с критической ошибкой.

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

← На главную