Как создать и использовать HTTP-сервисы в 1С:Предприятии для обмена данными?

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

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

В этой статье мы подробно рассмотрим, как правильно реализовать HTTP-сервис в 1С 8.3 на управляемых формах. Мы разберем по шагам создание сервиса, его публикацию, обработку различных типов запросов (GET и POST) и формирование ответов, а также покажем, как к такому сервису можно обратиться из другой базы 1С или внешнего клиента. Присоединяйтесь, и давайте вместе создадим работающий HTTP-сервис!

Что такое HTTP-сервисы в 1С и зачем они нужны?

HTTP-сервисы в 1С:Предприятии – это механизм, позволяющий конфигурировать обработчики HTTP-запросов непосредственно внутри конфигурации. Они являются мощным инструментом для организации взаимодействия между различными информационными системами. В отличие от веб-сервисов (SOAP), HTTP-сервисы обычно используются для реализации RESTful API (для этого удобно применять конструктор API для обмена в формате JSON), что предполагает более легковесный и гибкий подход к обмену данными, часто с использованием форматов JSON или XML.

Основные сценарии использования HTTP-сервисов:

  1. Интеграция с внешними веб-приложениями: Например, мобильные приложения (см. HTTP API сервис задач), интернет-магазины, порталы могут получать или отправлять данные в 1С через HTTP-сервисы — в этом поможет система управления интеграциями по HTTP и JSON.
  2. Обмен данными между базами 1С: Разные базы, расположенные на разных серверах, могут взаимодействовать друг с другом, используя обмен данными O-Bridges или HTTP-сервисы как точку обмена — есть готовый универсальный перенос данных между базами по HTTP.
  3. Создание внутренних API: Для построения сложных распределенных систем внутри одной организации (например, для интеграции 1С с Google Таблицами).

Мы сосредоточимся на практических аспектах создания и использования HTTP-сервиса, чтобы вы смогли применить полученные знания в своих проектах.

Пошаговое создание HTTP-сервиса в 1С:Предприятии

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

1. Регистрация HTTP-сервиса в конфигурации

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

  1. Откроем конфигурацию в режиме Конфигуратор.
  2. В дереве конфигурации найдем ветку "HTTP-сервисы".
  3. Щелкнем правой кнопкой мыши по этой ветке и выберем пункт "Добавить".
  4. В появившемся окне свойств нового HTTP-сервиса зададим его основные параметры:
    • Имя: Дадим сервису понятное имя, например, MyService. Это имя будет использоваться в URL для идентификации нашего сервиса.
    • Корневой URL: Оставим его пустым или зададим общий префикс, например, api. Это позволит нам строить более структурированные URL. Для нашего простого примера оставим пустым.

Важно: имя HTTP-сервиса должно быть уникальным в пределах конфигурации.

2. Добавление URL-шаблона и методов

После создания самого сервиса нам нужно определить, по каким URL-адресам он будет доступен и какие HTTP-методы (GET, POST, PUT, DELETE) он будет поддерживать. Для этого:

  1. Развернем наш HTTP-сервис MyService в дереве конфигурации.
  2. Щелкнем правой кнопкой мыши по ветке "URL-шаблоны" и выберем "Добавить".
  3. В свойствах нового URL-шаблона укажем:
    • Шаблон: Зададим шаблон, который будет определять конкретный ресурс нашего сервиса. Например, /hello. Таким образом, полный URL для обращения к нашему сервису будет выглядеть примерно так: http://[сервер]/[имя_базы]/hs/MyService/hello. Мы также можем использовать переменные в шаблоне, например, /users/{id}, чтобы передавать параметры прямо в URL.
  4. Внутри созданного URL-шаблона мы теперь можем добавить методы. Щелкнем правой кнопкой мыши по созданному URL-шаблону и выберем "Добавить".

Для нашего первого примера, который будет возвращать "Hello, World!", нам понадобится только метод GET:

  1. Выберите "GET" из списка доступных HTTP-методов.
  2. В поле "Имя обработчика" укажем имя функции, которая будет вызываться при получении GET-запроса. Например, ОбработкаGet. Эта функция будет располагаться в модуле HTTP-сервиса.

Мы определили, что по URL /hello наш сервис будет обрабатывать GET-запросы через функцию ОбработкаGet.

3. Реализация обработчика GET-запроса

Теперь нам нужно написать код для функции ОбработкаGet. Этот код будет выполняться каждый раз, когда наш HTTP-сервис получит GET-запрос по указанному URL. Для этого:

  1. Дважды щелкнем по имени нашего HTTP-сервиса MyService в дереве конфигурации. Откроется модуль HTTP-сервиса.
  2. В этом модуле разместим следующий код:

// Обработчик GET-запроса для URL-шаблона "/hello"
// Параметр "Запрос" содержит объект ЗапросHTTPСервиса, который предоставляет информацию о входящем запросе.
Функция ОбработкаGet(Запрос)

    // Создаем новый объект HTTPСервисОтвет с кодом состояния 200 (ОК).
    // Код состояния 200 означает, что запрос был успешно обработан.
    Ответ = Новый HTTPСервисОтвет(200);

    // Устанавливаем тело ответа. В данном случае, это простая строка "Hello, World!".
    // Мы указываем кодировку текста UTF8 и тип контента "text/plain".
    // Тип контента важен, чтобы клиент понимал, какого формата данные он получает.
    Ответ.УстановитьТелоИзСтроки("Hello, World!", КодировкаТекста.UTF8, "text/plain");
    
    // Возвращаем объект ответа. Система 1С автоматически преобразует его в HTTP-ответ.
    Возврат Ответ;

КонецФункции

В этом коде мы создаем объект HTTPСервисОтвет с кодом состояния 200 (что означает успешное выполнение) и устанавливаем в его тело строку "Hello, World!". Важно указать правильную кодировку (КодировкаТекста.UTF8) и тип содержимого ("text/plain"), чтобы клиент мог корректно интерпретировать ответ.

4. Публикация HTTP-сервиса

Чтобы наш HTTP-сервис стал доступен извне, необходимо опубликовать базу на веб-сервере (Apache или IIS). Если ваша база уже опубликована, возможно, достаточно будет просто обновить публикацию. Если нет, то выполним следующие действия:

  1. В конфигураторе перейдем в меню Администрирование -> Публикация на веб-сервере...
  2. В открывшемся окне убедимся, что выбрано имя нашей базы.
  3. Обязательно установим флажок "Публиковать HTTP-сервисы".
  4. Нажмем кнопку "Опубликовать".
  5. При успешной публикации будет выдано соответствующее сообщение.

После публикации наш сервис будет доступен по URL, формируемому следующим образом:

http://[имя_веб-сервера]/[имя_публикации_базы]/hs/[имя_HTTP_сервиса]/[URL_шаблон]

Например, если ваша база опубликована как "MyBase" на локальном веб-сервере (localhost), то URL для нашего примера будет:

http://localhost/MyBase/hs/MyService/hello

Откройте эту ссылку в браузере, и вы должны увидеть текст "Hello, World!". Это означает, что ваш первый HTTP-сервис успешно работает!

Расширение функционала: работа с параметрами и POST-запросами

Простой "Hello, World!" - это хорошо, но на практике нам часто требуется передавать данные в сервис и получать более сложный ответ, например, в формате JSON. Рассмотрим эти возможности.

1. Передача параметров через GET-запрос

Для передачи параметров через GET-запрос мы используем стандартные URL-параметры (query parameters). Например: /hello?name=Иван&age=30.

Для получения этих параметров на стороне сервиса мы используем объект Запрос, который передается в обработчик.


// Обработчик GET-запроса, который теперь принимает параметры
Функция ОбработкаGet(Запрос)

    // Получаем коллекцию параметров запроса
    Параметры = Запрос.ПараметрыЗапросаHTTPСервиса;
    
    // Пытаемся получить параметр "name"
    Имя = Параметры.Получить("name");
    Если Имя = Неопределено Тогда
        Имя = "Гость"; // Значение по умолчанию, если параметр не передан
    КонецЕсли;

    // Пытаемся получить параметр "age" и преобразовать его в число
    ВозрастСтрока = Параметры.Получить("age");
    Возраст = Неопределено;
    Если ВозрастСтрока <> Неопределено Тогда
        Попытка
            Возраст = Число(ВозрастСтрока);
        Исключение
            // Обработка ошибки, если возраст не удалось преобразовать в число
            Сообщить("Некорректное значение возраста: " + ВозрастСтрока);
        КонецПопытки;
    КонецЕсли;

    // Формируем ответ
    ОтветТекст = "Привет, " + Имя + "!";
    Если Возраст <> Неопределено Тогда
        ОтветТекст = ОтветТекст + " Вам " + Возраст + " лет.";
    КонецЕсли;

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ОтветТекст, КодировкаТекста.UTF8, "text/plain");
    
    Возврат Ответ;

КонецФункции

Теперь, если мы обратимся по адресу http://localhost/MyBase/hs/MyService/hello?name=Алексей, мы получим "Привет, Алексей!". А по адресу http://localhost/MyBase/hs/MyService/hello?name=Ольга&age=25, мы увидим "Привет, Ольга! Вам 25 лет."

2. Обработка POST-запросов и JSON-данных

Для отправки более сложных данных, таких как объекты или большие объемы информации, обычно используются POST-запросы. Данные в POST-запросах передаются в теле запроса, часто в формате JSON или XML.

Для реализации POST-запроса нам необходимо:

  1. Добавить метод POST к нашему URL-шаблону /hello (или создать новый URL-шаблон для POST).
    • В свойствах URL-шаблона /hello (или нового) добавим новый метод, выбрав "POST".
    • В поле "Имя обработчика" укажем ОбработкаPost.
  2. Реализовать функцию ОбработкаPost в модуле HTTP-сервиса.

// Обработчик POST-запроса
Функция ОбработкаPost(Запрос)
    
    Попытка
        // Получаем тело запроса как строку. Обычно это JSON.
        ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();

        // Попытаемся разобрать JSON-строку в Структуру или Соответствие 1С.
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
        ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();

        // Предполагаем, что получили Структуру с полями "Имя" и "Сообщение"
        Если ТипЗнч(ДанныеJSON) = Тип("Структура") Тогда
            Имя = ДанныеJSON.Имя;
            Сообщение = ДанныеJSON.Сообщение;
            ОтветТекст = "Получено от " + Имя + ": " + Сообщение;
        Иначе
            ОтветТекст = "Некорректный формат JSON или ожидается Структура.";
        КонецЕсли;

        // Формируем успешный ответ в формате JSON
        Ответ = Новый HTTPСервисОтвет(200);
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        
        РезультатОтвета = Новый Структура;
        РезультатОтвета.Вставить("Статус", "Успех");
        РезультатОтвета.Вставить("Данные", ОтветТекст);
        
        ЗаписатьJSON(ЗаписьJSON, РезультатОтвета);
        
        Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8, "application/json");

    Исключение
        // Если произошла ошибка (например, некорректный JSON), возвращаем 500 ошибку.
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Ошибка обработки запроса: " + ОписаниеОшибки(), КодировкаТекста.UTF8, "text/plain");
    КонецПопытки;
    
    Возврат Ответ;

КонецФункции

В этом примере мы:

  1. Получаем тело POST-запроса с помощью Запрос.ПолучитьТелоКакСтроку().
  2. Разбираем полученную строку как JSON, используя объекты ЧтениеJSON и функцию ПрочитатьJSON.
  3. Обрабатываем полученные данные (в нашем случае, извлекаем "Имя" и "Сообщение").
  4. Формируем ответ, также в формате JSON, используя объекты ЗаписьJSON и функцию ЗаписатьJSON. Обратите внимание на тип контента "application/json" для JSON-ответа.
  5. Предусматриваем обработку ошибок с возвратом соответствующего HTTP-кода состояния (500 Internal Server Error) в случае сбоя.

После изменения кода не забудьте обновить публикацию базы на веб-сервере.

Обращение к HTTP-сервису из 1С:Предприятия (Клиентская часть)

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

1. Обращение из другой базы 1С

Для отправки HTTP-запросов из клиентского кода 1С используются объекты HTTPСоединение и HTTPЗапрос. Мы рассмотрим примеры для GET и POST запросов.

GET-запрос к сервису:

Предположим, мы хотим получить "Hello, World!" или данные с параметрами.


// Функция для выполнения GET-запроса к нашему HTTP-сервису
Функция ВыполнитьGETЗапросКСервису()
    
    // Параметры подключения к серверу, где опубликован HTTP-сервис
    // Замените на актуальные данные вашего сервера и публикации
    Сервер = "localhost"; // IP-адрес или доменное имя сервера 1С
    Порт = 80;            // Порт веб-сервера (обычно 80 для HTTP, 443 для HTTPS)
    
    // Полный путь к нашему HTTP-сервису с URL-шаблоном и параметрами
    // Для примера с параметрами: "/MyBase/hs/MyService/hello?name=Тест&age=42"
    ПутьРесурса = "/MyBase/hs/MyService/hello"; 
    
    // Создаем объект HTTPСоединение.
    // Если используется HTTPS, то указываем четвертый параметр ИспользоватьЗащищенноеСоединение = Истина.
    Соединение = Новый HTTPСоединение(Сервер, Порт);
    
    // Создаем объект HTTPЗапрос.
    // В конструктор передаем путь к ресурсу.
    Запрос = Новый HTTPЗапрос(ПутьРесурса);
    
    // В случае возникновения ошибок, мы их перехватим.
    Попытка
        // Выполняем GET-запрос. Метод Получить() предназначен для GET-запросов.
        Ответ = Соединение.Получить(Запрос);
        
        // Анализируем код состояния ответа. 200 - это успех.
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Успешный ответ сервера:");
            Сообщить(Ответ.ПолучитьТелоКакСтроку()); // Получаем тело ответа как строку
        Иначе
            Сообщить("Ошибка при выполнении GET-запроса. Код состояния: " + Ответ.КодСостояния);
            Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку()); // Выводим тело ошибки
        КонецЕсли;
    Исключение
        // Если произошла ошибка на уровне соединения (например, сервер недоступен)
        Сообщить("Ошибка соединения с HTTP-сервисом: " + ОписаниеОшибки());
    КонецПопытки;

КонецФункции
POST-запрос к сервису:

Для отправки POST-запроса нам нужно передать данные в теле запроса.


// Функция для выполнения POST-запроса к нашему HTTP-сервису
Функция ВыполнитьPOSTЗапросКСервису()
    
    // Параметры подключения к серверу
    Сервер = "localhost"; 
    Порт = 80;
    ПутьРесурса = "/MyBase/hs/MyService/hello"; // Используем тот же URL-шаблон для примера

    Соединение = Новый HTTPСоединение(Сервер, Порт);
    Запрос = Новый HTTPЗапрос(ПутьРесурса);
    
    // Подготавливаем данные для отправки в формате JSON
    ДанныеДляОтправки = Новый Структура;
    ДанныеДляОтправки.Вставить("Имя", "Клиент 1С");
    ДанныеДляОтправки.Вставить("Сообщение", "Привет от клиентской базы!");

    // Сериализуем структуру в JSON-строку
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
    ТелоЗапросаJSON = ЗаписьJSON.Закрыть();
    
    // Устанавливаем заголовок Content-Type, чтобы сервер знал, что мы отправляем JSON
    Запрос.УстановитьЗаголовок("Content-Type", "application/json; charset=utf-8");
    
    // Устанавливаем тело запроса
    Запрос.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF8);
    
    Попытка
        // Выполняем POST-запрос. Метод Отправить() предназначен для POST-запросов.
        Ответ = Соединение.Отправить(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Успешный ответ сервера на POST-запрос:");
            Сообщить(Ответ.ПолучитьТелоКакСтроку());
        Иначе
            Сообщить("Ошибка при выполнении POST-запроса. Код состояния: " + Ответ.КодСостояния);
            Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    Исключение
        Сообщить("Ошибка соединения с HTTP-сервисом: " + ОписаниеОшибки());
    КонецПопытки;

КонецФункции

В POST-запросе мы:

  1. Формируем данные, которые хотим отправить, например, в виде структуры.
  2. Сериализуем эти данные в JSON-строку с помощью ЗаписьJSON и ЗаписатьJSON.
  3. Устанавливаем заголовок Content-Type: application/json, чтобы сервер знал, что в теле запроса находятся JSON-данные.
  4. Устанавливаем тело запроса с помощью Запрос.УстановитьТелоИзСтроки().
  5. Отправляем запрос с помощью метода Соединение.Отправить().

2. Обращение из браузера или внешних клиентов (например, Postman/Insomnia)

Как мы уже выяснили, GET-запросы можно просто открыть в браузере. Для POST-запросов и более удобной работы с HTTP-сервисами удобно использовать специализированные клиентские программы, такие как Postman или Insomnia. Они позволяют легко конструировать запросы, устанавливать заголовки, формировать тело запроса и анализировать ответы.

Пример POST-запроса в Postman:

  1. Установите метод запроса на POST.
  2. В поле URL введите полный адрес вашего HTTP-сервиса: http://localhost/MyBase/hs/MyService/hello.
  3. Перейдите на вкладку "Headers" и добавьте заголовок: Content-Type: application/json.
  4. Перейдите на вкладку "Body", выберите тип "raw" и формат "JSON".
  5. Введите JSON-данные, например:
  6. 
    {
        "Имя": "ВнешнийКлиент",
        "Сообщение": "Тестовое сообщение из Postman"
    }
    
  7. Нажмите кнопку "Send". Вы получите ответ от вашего HTTP-сервиса.

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

При работе с HTTP-сервисами в 1С есть несколько важных моментов, которые помогут вам создавать надежные и эффективные решения.

1. Обработка ошибок и коды состояния HTTP

Всегда старайтесь возвращать корректные HTTP-коды состояния в ответ на запросы. Это стандартный способ информирования клиента о результате выполнения запроса:

Мы видели примеры, где в блоке Попытка...Исключение мы возвращали 500-й код, что является хорошей практикой.

2. Кодировка данных

Обязательно указывайте кодировку (обычно UTF8) при работе с текстовыми данными в HTTP-сервисах (как при установке тела ответа на сервере, так и при отправке тела запроса на клиенте), а также при установке заголовка Content-Type.

Например, Ответ.УстановитьТелоИзСтроки(МояСтрока, КодировкаТекста.UTF8, "text/plain"); и Запрос.УстановитьЗаголовок("Content-Type", "application/json; charset=utf-8");.

3. Безопасность и аутентификация

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

При использовании HTTPСоединение в 1С можно указать имя пользователя и пароль: Соединение = Новый HTTPСоединение(Сервер, Порт, ИмяПользователя, Пароль);.

4. Переменные URL-шаблона

Мы можем использовать переменные в URL-шаблонах для более гибкой маршрутизации запросов. Например, шаблон /users/{id} позволит вам получить значение id из URL. В обработчике метода вы сможете получить значение этой переменной через свойство Запрос.ПараметрыURL.


// Пример обработчика для шаблона /users/{id}
Функция ОбработкаGetСПараметромURL(Запрос)
    IDПользователя = Запрос.ПараметрыURL.Получить("id");
    
    Ответ = Новый HTTPСервисОтвет(200);
    Если IDПользователя <> Неопределено Тогда
        Ответ.УстановитьТелоИзСтроки("Запрошен пользователь с ID: " + IDПользователя, КодировкаТекста.UTF8, "text/plain");
    Иначе
        Ответ.УстановитьТелоИзСтроки("ID пользователя не указан.", КодировкаТекста.UTF8, "text/plain");
    КонецЕсли;
    Возврат Ответ;
КонецФункции

5. Объекты HTTPСервисЗапрос и HTTPСервисОтвет

Познакомимся с этими объектами подробнее, так как они являются центральными для обработки запросов:

Заключение

Мы рассмотрели процесс создания, публикации и использования HTTP-сервисов в 1С:Предприятии 8.3. Теперь вы знаете, как принимать GET- и POST-запросы, обрабатывать параметры URL и тела запросов (в частности, JSON), а также формировать корректные HTTP-ответы. Мы также научились вызывать эти сервисы из клиентского кода 1С. HTTP-сервисы являются мощным инструментом для интеграции и обмена данными, и их освоение значительно расширит ваши возможности как разработчика 1С.

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

← На главную