В современной разработке часто возникает необходимость интегрировать 1С с внешними сервисами через REST API. Типовая схема такого взаимодействия включает два этапа: сначала нужно авторизоваться, получив токен доступа, а затем использовать этот токен для выполнения других запросов. Рассмотрим по шагам, как реализовать этот механизм в 1С, используя готовую заготовку интеграции со сторонним приложением, разобрав частые ошибки и предоставив примеры кода.
Проанализируем две ключевые задачи, которые часто встречаются при настройке обмена данными между базами 1С и приложениями:
Для работы с HTTP в 1С мы будем использовать встроенные объекты: HTTPСоединение, HTTPЗапрос и HTTPОтвет, которые позволяют, например, получать данные о контрагенте по УНП с сайта Kartoteka.by.
Наша первая задача — отправить POST-запрос на адрес вида /Auth, передав в теле логин и пароль в формате JSON (похожий принцип используется и для получения токена авторизации RuStore). В ответ сервер должен вернуть токен, который мы будем использовать в дальнейшем.
Шаг 1. Установка защищенного соединения
Большинство современных API работают по протоколу HTTPS. Для установления соединения с таким сервером в 1С необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Если этого не сделать, вы можете столкнуться с ошибками или редиректами (например, код ответа 301 или 308), так как сервер будет перенаправлять вас с HTTP на безопасный HTTPS.
Создадим объект HTTPСоединение:
// Указываем адрес сервера без "https://"
Сервер = "pharmapi.apteka.ru";
// Для работы с HTTPS обязательно создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение. Порт 443 для HTTPS является стандартным.
// Остальные параметры (прокси, таймаут) оставляем по умолчанию.
СоединениеHTTP = Новый HTTPСоединение(Сервер, 443, , , , , ЗащищенноеСоединение);
Шаг 2. Формирование тела запроса в формате JSON
Сервер ожидает получить данные в виде JSON-объекта, например: {"login": "myLogin", "password": "myPassword"}. Пытаться собрать такую строку вручную с помощью конкатенации — плохая практика, так как легко допустить ошибку с кавычками или экранированием символов. Правильный способ — использовать встроенные в 1С механизмы для работы с JSON.
Создадим структуру, которая соответствует нашему JSON, и преобразуем (сериализуем) ее в строку.
// Создаем структуру для тела запроса
ТелоСтруктура = Новый Структура;
ТелоСтруктура.Вставить("login", Логин); // Переменная "Логин" содержит логин
ТелоСтруктура.Вставить("password", Пароль); // Переменная "Пароль" содержит пароль
// Настраиваем запись в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(); // Указываем, что результат будет строкой
// Преобразуем структуру 1С в строку JSON
ЗаписатьJSON(ЗаписьJSON, ТелоСтруктура);
// Получаем готовую строку
ТелоЗапросаJSON = ЗаписьJSON.Закрыть();
Шаг 3. Создание и отправка HTTP-запроса
Теперь у нас есть всё для формирования запроса: соединение, адрес ресурса и тело. Важно также указать правильные заголовки. Ключевой заголовок для POST-запросов с телом — это Content-Type, который сообщает серверу, в каком формате мы прислали данные. Для JSON это application/json.
// Указываем адрес ресурса (эндпоинт)
АдресРесурса = "/Auth";
// Создаем объект для заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Создаем HTTP-запрос, передавая адрес и заголовки
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса, Заголовки);
// Устанавливаем ранее сформированное тело запроса
ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF8);
// Отправляем запрос методом POST и получаем ответ
ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод("POST", ЗапросHTTP);
Шаг 4. Обработка ответа и получение токена
После отправки запроса необходимо проанализировать ответ. Сначала проверим код состояния. Код 200 (OK) означает, что запрос прошел успешно. Если код другой (например, 400, 401, 500), значит, произошла ошибка, и ее описание, скорее всего, будет в теле ответа.
Если ответ успешный, токен будет находиться в теле ответа, также в формате JSON. Его нужно прочитать (десериализовать).
Если ОтветHTTP.КодСостояния = 200 Тогда
// Получаем тело ответа в виде строки
ТелоОтветаСтрокой = ОтветHTTP.ПолучитьТелоКакСтроку();
// Читаем JSON из строки
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтветаСтрокой);
// Преобразуем JSON в структуру или соответствие 1С
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
// Теперь можно получить токен по ключу (название ключа зависит от API)
Токен = ДанныеОтвета["access_token"]; // Пример, ключ может быть другим
Сообщить("Токен успешно получен!");
Иначе
// Если произошла ошибка, выводим код и тело ответа для анализа
Сообщить("Ошибка при получении токена!");
Сообщить("Код состояния: " + ОтветHTTP.КодСостояния);
Сообщить("Тело ответа: " + ОтветHTTP.ПолучитьТелоКакСтроку());
КонецЕсли;
Итак, токен у нас есть. Теперь решим вторую задачу: отправим на сервер POST-запрос с массивом номеров заказов. Для аутентификации этого запроса мы будем использовать полученный токен в заголовке Authorization.
Шаг 1. Формирование заголовков с токеном
Это ключевой шаг. Сервер должен понять, что мы авторизованы. Для этого используется стандартный заголовок Authorization со схемой Bearer.
ЗаголовкиЗапроса = Новый Соответствие;
ЗаголовкиЗапроса.Вставить("Accept", "application/json");
ЗаголовкиЗапроса.Вставить("Content-Type", "application/json; charset=utf-8");
// Формируем заголовок авторизации. Обратите внимание на пробел после "Bearer"
ЗаголовкиЗапроса.Вставить("Authorization", "Bearer " + Токен);
Шаг 2. Формирование тела запроса с массивом
По условию задачи, нам нужно отправить JSON вида: {"orderNums": ["Z001", "Z002"]}. Для этого в 1С мы создадим массив, поместим его в структуру, а затем сериализуем в JSON.
// Создаем массив 1С
МассивНомеров = Новый Массив;
МассивНомеров.Добавить("Z001"); // Добавляем номера заказов
МассивНомеров.Добавить("Z002");
// Создаем корневую структуру
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("orderNums", МассивНомеров);
// Сериализуем в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ЗапросJSON = ЗаписьJSON.Закрыть();
Шаг 3. Отправка запроса и получение результата
Собираем все вместе. Соединение можно использовать то же, что и на первом этапе. Создаем новый запрос с нужным адресом ресурса, новыми заголовками и новым телом.
Важный момент: заголовки нужно передавать при создании объекта HTTPЗапрос. Если создать запрос без заголовков, а потом пытаться их добавить, это может не сработать для некоторых типов заголовков. В теме на форуме именно это было финальной ошибкой, которая приводила к коду ответа 400.
// Указываем новый адрес ресурса
Адрес = "/Pharm/ShippedOrders";
// Соединение используем то же, что и для авторизации
// HTTPСоединение = Новый HTTPСоединение(...)
// Создаем запрос, СРАЗУ передавая заголовки в конструктор
HTTPЗапрос = Новый HTTPЗапрос(Адрес, ЗаголовкиЗапроса);
// Устанавливаем тело из JSON-строки
HTTPЗапрос.УстановитьТелоИзСтроки(ЗапросJSON, КодировкаТекста.UTF8);
// Отправляем POST-запрос
HTTPОтвет = СоединениеHTTP.ВызватьHTTPМетод("POST", HTTPЗапрос);
// Анализируем ответ
Если HTTPОтвет.КодСостояния = 200 Тогда
Сообщить("Данные успешно отправлены!");
Сообщить("Ответ сервера: " + HTTPОтвет.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Ошибка при отправке данных!");
Сообщить("Код состояния: " + HTTPОтвет.КодСостояния);
Сообщить("Ответ сервера: " + HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Таким образом, мы успешно решили обе задачи. Главные выводы, которые можно сделать: всегда используйте ЗащищенноеСоединениеOpenSSL для HTTPS, формируйте JSON с помощью встроенных объектов, внимательно следите за заголовками Content-Type и Authorization и передавайте их при создании объекта HTTPЗапрос.