Как правильно настроить HTTP-запрос к API EnvyCRM из 1С для получения данных в формате JSON?

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

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

Разбор типичных ошибок при создании HTTP-соединения

Рассмотрим ситуацию, когда при попытке получить список клиентов разработчик сталкивается с тем, что сервер возвращает HTML-код главной страницы вместо ожидаемых данных или выдает ошибку "Неверный request". Проанализируем основные причины такого поведения.

Первая и самая распространенная ошибка — неправильное разделение адреса ресурса между объектами HTTPСоединение и HTTPЗапрос. В 1С объект HTTPСоединение отвечает за установку связи с сервером (доменным именем), а HTTPЗапрос — за обращение к конкретному методу (пути) на этом сервере.

Важно: При создании объекта HTTPЗапрос нельзя указывать доменное имя повторно. Путь должен начинаться от корня сайта (с косой черты). Рассмотрим правильный пример инициализации:


// Неправильно:
// Запрос = Новый HTTPЗапрос("https://mycrm.envycrm.com/crm/api/v1/client/list/");

// Правильно:
ПутьКМетоду = "/crm/api/v1/client/list/?api_key=ВАШ_КЛЮЧ_API";
Запрос = Новый HTTPЗапрос(ПутьКМетоду);

Формирование структуры JSON: вложенность параметров

Выясним причину возникновения ошибки 500 ("Неверный request"). Часто она связана с тем, что API ожидает строго определенную иерархию данных в теле запроса. Согласно документации EnvyCRM, параметры поиска должны быть обернуты в корневой объект request.

Рассмотрим пошагово, как правильно подготовить такую структуру в 1С:

  1. Создаем структуру для внутренних параметров (фильтров).
  2. Создаем основную (корневую) структуру.
  3. Вставляем вложенную структуру в основную под ключом request.

ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("keyword", "");
ПараметрыПоиска.Вставить("limit", 100);
ПараметрыПоиска.Вставить("offset", 0);
ПараметрыПоиска.Вставить("date_start", "2023-01-01");
ПараметрыПоиска.Вставить("date_end", "2023-12-31");

// Оборачиваем в "request"
КорневойОбъект = Новый Структура;
КорневойОбъект.Вставить("request", ПараметрыПоиска);

Проанализируем типы данных: обратите внимание, что такие параметры, как limit и offset, должны передаваться как числа, а не как строки. В 1С это контролируется отсутствием кавычек при присваивании значения в структуре.

Установка заголовков HTTP-запроса

Даже если тело запроса сформировано верно, сервер может не понять, в каком формате пришли данные, если не указать соответствующие заголовки (Headers). Для работы с JSON-интерфейсами критически важно установить Content-Type.

Посмотрим на пример установки заголовков:


ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Content-Type", "application/json");
ЗаголовокHTTP.Вставить("Accept", "application/json");

ПутьКМетоду = "/crm/api/v1/client/list/?api_key=ВАШ_КЛЮЧ";
Запрос = Новый HTTPЗапрос(ПутьКМетоду, ЗаголовокHTTP);

Использование application/x-www-form-urlencoded (как иногда ошибочно советуют на форумах) в данном случае не подходит, так как мы передаем необработанный JSON в теле (raw body).

Кодировка и передача данных

Разберем процесс преобразования структуры в строку JSON и передачи её в запрос. При использовании метода УстановитьТелоИзСтроки необходимо явно указывать отсутствие BOM (Byte Order Mark), так как многие веб-серверы воспринимают его как мусор в начале строки, что ломает парсинг JSON.


// Преобразуем структуру в JSON-строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, КорневойОбъект);
СтрJSON = ЗаписьJSON.Закрыть();

// Устанавливаем тело запроса без BOM
Запрос.УстановитьТелоИзСтроки(СтрJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Полный пример кода для получения списка клиентов

Ниже приведем консолидированный пример кода, который объединяет все вышеперечисленные исправления. Этот шаблон можно использовать в обработках 1С для взаимодействия с EnvyCRM.


Процедура ПолучитьСписокКлиентов()
    
    Домен = "********.envycrm.com";
    API_Key = "********************************";
    
    // 1. Создание защищенного соединения SSL
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(Домен, , , , , , Защита);
    
    // 2. Формирование структуры JSON с учетом вложенности request
    Фильтр = Новый Структура;
    Фильтр.Вставить("keyword", "");
    Фильтр.Вставить("limit", 50);
    Фильтр.Вставить("offset", 0);
    
    ТелоЗапроса = Новый Структура;
    ТелоЗапроса.Вставить("request", Фильтр);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // 3. Создание запроса и установка заголовков
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json");
    
    Путь = "/crm/api/v1/client/list/?api_key=" + API_Key;
    Запрос = Новый HTTPЗапрос(Путь, Заголовки);
    Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    // 4. Отправка и получение ответа
    Попытка
        Результат = Соединение.ОтправитьДляОбработки(Запрос);
        ОтветСервера = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        
        Сообщить("Код ответа: " + Результат.КодСостояния);
        Сообщить("Тело ответа: " + ОтветСервера);
    Исключение
        Сообщить("Ошибка связи: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Советы по диагностике

Если решение все еще выдает ошибки, проанализируем следующие моменты:

  1. Версия TLS: Если вы используете старую версию платформы 1С, она может не поддерживать протоколы TLS 1.2/1.3, которые требует современное API. В этом случае необходимо обновить платформу.
  2. Сторонние инструменты: Попробуйте выполнить этот же запрос через Postman. Если в Postman запрос проходит, сравните заголовки и структуру JSON с теми, что генерирует 1С.
  3. Логин и пароль: Для EnvyCRM не требуется указывать логин и пароль в параметрах HTTPСоединение, если вы используете api_key в URL. Лишние данные могут сбивать механизмы авторизации сервера.

Таким образом, успех интеграции зависит от трех составляющих: правильного разделения URL, корректной вложенности в структуре Структура -> JSON и обязательного указания заголовка Content-Type: application/json.

← На главную