В практике разработчика 1С часто возникает задача автоматизировать обмен данными с внешними сайтами или сервисами. Типичная ситуация: вы написали обработку, которая по кнопке выполняет HTTP-запросы, получает данные и создает документы. Однако со временем ручной запуск становится неудобным, и требуется настроить выполнение по расписанию. Разберем подробно, как модифицировать архитектуру обработки, чтобы она корректно работала и в интерактивном режиме, и в фоновом задании.
Основная проблема при попытке запустить обычную обработку по расписанию заключается в том, что регламентные задания выполняются на стороне сервера в неинтерактивном режиме. Это означает, что у системы "нет лица" — модуль формы не создается, и обратиться к его элементам невозможно. Проанализируем, что нужно сделать в первую очередь.
Нам необходимо перенести всю бизнес-логику (подключение к серверу, формирование GET и POST запросов, парсинг ответов) в Модуль объекта. Процедуры в модуле объекта должны быть помечены ключевым словом Экспорт, чтобы их можно было вызвать как из формы, так и из регламентного задания.
Рассмотрим пример правильной структуры процедуры в модуле объекта:
Процедура ВыполнитьОбменДанными() Экспорт
// Логика подключения к сайту
Соединение = Новый HTTPСоединение("mysite.com", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/api/data");
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка данных
СоздатьДокументыНаОснованииДанных(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ОбменССайтом", УровеньЖурналаРегистрации.Ошибка, , , КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Часто в ручном режиме программисты используют табличные части формы для предварительного просмотра загруженных данных. Чтобы эта логика работала в регламентном задании, мы должны перенести реквизиты и табличные части из Формы в саму Обработку (как объект метаданных). Это позволит нам заполнять их в памяти сервера даже при отсутствии открытого окна у пользователя.
Выясним, как обеспечить универсальность запуска. В модуле формы при нажатии на кнопку "Выполнить" мы будем вызывать метод модуля объекта следующим образом:
&НаСервере
Процедура ВыполнитьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ОбъектОбработки.ВыполнитьОбменДанными();
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры
Метод РеквизитФормыВЗначение превращает данные формы в объект обработки, где доступен наш экспортный метод ВыполнитьОбменДанными. После выполнения мы возвращаем данные обратно в форму через ЗначениеВРеквизитФормы, чтобы пользователь увидел результат в табличной части.
Если вы работаете в современных конфигурациях (таких как УТ 11, ERP, БП 3.0), лучшим способом запуска по расписанию является использование механизма Дополнительных отчетов и обработок. Для этого в модуле объекта необходимо добавить функцию СведенияОВнешнейОбработке.
Разберем пример структуры этой функции:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Автоматический обмен с сайтом";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить обмен сейчас";
НоваяКоманда.Идентификатор = "ВыполнитьОбменДанными";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
При такой настройке вы сможете загрузить обработку в справочник "Дополнительные отчеты и обработки" и прямо там настроить расписание в интерфейсе программы, не прибегая к изменению конфигурации в режиме "Конфигуратор".
Проанализируем технические нюансы, которые могут привести к ошибкам при переходе в фоновый режим:
HTTPS, сервер 1С должен доверять сертификату сайта. Используйте объект Новый ЗащищенноеСоединениеOpenSSL() в конструкторе HTTPСоединение.1С:Предприятии или прописаны в коде.В ручном режиме вы видите ошибки в окне сообщений. В фоновом режиме Сообщить не работает. Поэтому крайне важно использовать ЗаписьЖурналаРегистрации. Проанализируем, как это реализовать структурно: фиксируйте не только ошибки, но и количество созданных документов. Это позволит системному администратору контролировать работу обмена через стандартный журнал регистрации 1С.
Важный совет: При регламентном запуске старайтесь минимизировать работу с интерфейсными вещами. Если в обработке есть функции Вопрос или Предупреждение, они должны быть строго ограничены условием #Если Клиент Тогда, иначе фоновое задание завершится с критической ошибкой.
Таким образом, правильная стратегия заключается в переносе всей "умной" части в модуль объекта, обеспечении возможности работы с данными без визуализации и использовании механизмов БСП для управления расписанием.