Как автоматически получать данные по внешнему URL-адресу в 1С:Предприятии?

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

В процессе интеграции 1С со сторонними веб-ресурсами (интернет-магазинами, CRM-системами, сервисами доставки или службами рассылки) часто возникает задача регулярного получения данных. Например, нам необходимо проверять статус заказа на внешнем сайте, отправляя GET-запрос по определенному URL-адресу, и обрабатывать возвращаемый сервером ответ.

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

Выбор архитектуры: HTTP-сервис или HTTP-запрос?

Начинающие разработчики часто путают два принципиально разных направления интеграции и задаются вопросом: нужно ли поднимать собственный HTTP-сервис в 1С для чтения данных по внешней ссылке? Выясним разницу между этими подходами:

  1. HTTP-сервисы в 1С (Входящая интеграция): Они необходимы тогда, когда внешняя система является инициатором запроса. В этом случае мы публикуем базу 1С на веб-сервере (IIS или Apache), описываем шаблоны URL и методы внутри 1С, а сторонний сайт обращается к нам.
  2. HTTP-запросы из 1С (Исходящая интеграция): Когда инициатором обмена выступает сама 1С, нам не нужно публиковать базу или создавать HTTP-сервисы. Мы используем встроенные объекты платформы 1С для отправки запросов на сторонние ресурсы. Внешний сервер обрабатывает наш запрос и возвращает результат в теле ответа.

Для нашей задачи — периодического опроса внешней ссылки — мы будем использовать второй вариант. Нам понадобятся объекты HTTPСоединение и HTTPЗапрос с методом Получить() (GET-запрос).

Реализация безопасного HTTP GET-запроса на сервере

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

Проанализируем пример кода, который учитывает работу по защищенному протоколу HTTPS, обработку ошибок и ограничение времени ожидания ответа:


&НаСервере
Функция ПолучитьДанныеСВнешнегоРесурса(НомерЗаказа, Сумма) Экспорт
    
    // Определяем параметры подключения
    Сервер = "r-media.ru";
    Ресурс = "/test.php?order=" + НомерЗаказа + "&amount=" + Сумма;
    Порт = 443; // Стандартный порт для HTTPS
    Таймаут = 15; // Время ожидания ответа в секундах (обязательно к установке!)
    
    // Инициализируем защищенное соединение SSL
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    
    Попытка
        // Создаем HTTP-соединение с явным указанием таймаута и SSL
        Соединение = Новый HTTPСоединение(Сервер, Порт, , , , Таймаут, ЗащищенноеСоединение);
        
        // Формируем GET-запрос
        Запрос = Новый HTTPЗапрос(Ресурс);
        
        // Выполняем запрос
        Ответ = Соединение.Получить(Запрос);
        
        // Анализируем HTTP-статус ответа
        Если Ответ.КодСостояния = 200 Тогда
            // Успешный запрос, получаем тело ответа в виде строки
            ВозвращаемоеЗначение = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
            Возврат ВозвращаемоеЗначение;
        Иначе
            // Сервер вернул ошибку (например, 404 или 500)
            ЗаписьЖурналаРегистрации("Интеграция.HTTP",
                УровеньЖурналаРегистрации.Предупреждение,
                , ,
                "Ошибка при обращении к серверу. Код состояния: " + Ответ.КодСостояния);
            Возврат Неопределено;
        EndIf;
        
    Исключение
        // Обрабатываем критические сетевые ошибки (недоступность хоста, таймаут)
        ИнформацияОбОшибке = ИнформацияОбОшибке();
        ЗаписьЖурналаРегистрации("Интеграция.HTTP",
            УровеньЖурналаРегистрации.Ошибка,
            , ,
            "Критическая ошибка сетевого соединения: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Обратите внимание на ключевые особенности этого кода:

Автоматизация процесса: Использование регламентных заданий

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

Для настройки автоматического опроса по расписанию идеально подходит механизм Регламентных заданий.

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

Разберем по шагам структуру модуля внешней обработки (с расширением .epf), которую можно загрузить в базу и настроить ее запуск по расписанию:


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

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

Процедура ВыполнитьОпросИОбработатьДанные()
    
    // Здесь мы определяем логику получения параметров для запроса
    // Например, выбираем из базы документы "ЗаказПокупателя", ожидающие оплаты
    НомерТестовогоЗаказа = "68test4112";
    СуммаТестовая = "258";
    
    РезультатЗапроса = ПолучитьДанныеСВнешнегоРесурса(НомерТестовогоЗаказа, СуммаТестовая);
    
    Если ЗначениеЗаполнено(РезультатЗапроса) Тогда
        // Обрабатываем полученный ответ (например, записываем статус "2154" в реквизиты документа)
        ЗаписатьРезультатВБазу(НомерТестовогоЗаказа, РезультатЗапроса);
    КонецЕсли;
    
КонецПроцедуры

После создания такой обработки достаточно перейти в режим «1С:Предприятие», открыть раздел Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки, загрузить туда наш файл и настроить расписание прямо в пользовательском интерфейсе (например, выполнять каждые 5 минут).

Оптимизация нагрузки на сервер

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

Альтернативный вариант: Архитектура Push (Вебхуки)

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

В этом случае рекомендуется сменить концепцию интеграции на архитектуру Push (вебхуки). Вместо того чтобы 1С постоянно «стучалась» на внешний сайт с вопросом «Появилось ли что-то новое?», мы настраиваем интеграцию в обратном направлении:

  1. На стороне 1С создается и публикуется на веб-сервере полноценный HTTP-сервис.
  2. В настройках личного кабинета внешней системы (или в коде внешнего сайта) прописывается адрес нашего HTTP-сервиса (Webhook URL).
  3. При наступлении целевого события (например, успешной оплаты заказа) внешний сайт сам мгновенно отправляет POST-запрос на адрес нашей 1С, передавая все нужные параметры.

Этот подход полностью снимает паразитную нагрузку с сервера 1С в периоды затишья и обеспечивает моментальную обработку бизнес-событий в момент их возникновения.

← На главную