Интеграция 1С с внешними CRM-системами, такими как EnvyCRM, является стандартной задачей, однако при реализации часто возникают технические нюансы, связанные с форматом передачи данных и структурой запроса. В этой статье мы подробно разберем, как избежать типичных ошибок при работе с HTTP-запросами в 1С, почему сервер может возвращать ошибку 500 и как правильно подготовить JSON для взаимодействия с EnvyCRM.
Рассмотрим ситуацию, когда при попытке получить список клиентов разработчик сталкивается с тем, что сервер возвращает 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Запрос(ПутьКМетоду);
Выясним причину возникновения ошибки 500 ("Неверный request"). Часто она связана с тем, что API ожидает строго определенную иерархию данных в теле запроса. Согласно документации EnvyCRM, параметры поиска должны быть обернуты в корневой объект request.
Рассмотрим пошагово, как правильно подготовить такую структуру в 1С:
request.
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("keyword", "");
ПараметрыПоиска.Вставить("limit", 100);
ПараметрыПоиска.Вставить("offset", 0);
ПараметрыПоиска.Вставить("date_start", "2023-01-01");
ПараметрыПоиска.Вставить("date_end", "2023-12-31");
// Оборачиваем в "request"
КорневойОбъект = Новый Структура;
КорневойОбъект.Вставить("request", ПараметрыПоиска);
Проанализируем типы данных: обратите внимание, что такие параметры, как limit и offset, должны передаваться как числа, а не как строки. В 1С это контролируется отсутствием кавычек при присваивании значения в структуре.
Даже если тело запроса сформировано верно, сервер может не понять, в каком формате пришли данные, если не указать соответствующие заголовки (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);
Сообщить("Код ответа: " + Результат.КодСостояния);
Сообщить("Тело ответа: " + ОтветСервера);
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если решение все еще выдает ошибки, проанализируем следующие моменты:
Postman. Если в Postman запрос проходит, сравните заголовки и структуру JSON с теми, что генерирует 1С.HTTPСоединение, если вы используете api_key в URL. Лишние данные могут сбивать механизмы авторизации сервера.Таким образом, успех интеграции зависит от трех составляющих: правильного разделения URL, корректной вложенности в структуре Структура -> JSON и обязательного указания заголовка Content-Type: application/json.