Интеграция 1С с внешними CRM-системами, такими как amoCRM, требует строгого соблюдения спецификаций API. Одной из частых проблем, с которыми сталкиваются разработчики при переходе на v4 API, является получение неожиданного формата ответа или отсутствие изменений в данных при получении кода состояния 200 OK. Разберем подробно, почему это происходит и как правильно составить HTTP-запрос для изменения статуса сделки.
Рассмотрим ситуацию: вы отправляете запрос на редактирование сделки и в ответ вместо ожидаемого массива со всеми данными получаете краткую структуру с id, updated_at и ссылкой _links. Выясним причину такого поведения системы. В amoCRM API v4 существует два принципиально разных метода для редактирования сделок (Leads):
/api/v4/leads/{id}./api/v4/leads.Если вы указываете ID сделки прямо в URL-адресе, сервер воспринимает это как запрос на изменение одиночного объекта. По спецификации amoCRM, в этом случае ответ возвращает только данные измененной сущности без секции _embedded. Тот формат, который вы ожидаете (с блоком _embedded и списком leads), возвращается только при использовании метода массового обновления. Таким образом, код 200 говорит о том, что запрос выполнен успешно, а «неполный» JSON — это стандартное поведение данного эндпоинта.
Проанализируем фрагмент кода формирования пути запроса:
HTTPЗапрос = Новый HTTPЗапрос("/api/v4/leads/" + id, AccessToken);
В 1С переменная id, как правило, имеет числовой тип. При неявном преобразовании числа в строку (через оператор «+») 1С использует региональные настройки, которые по умолчанию добавляют неразрывные пробелы в качестве разделителей групп разрядов. Вместо нужного 9339101 вы можете получить строку "9 339 101". Это приведет к тому, что URL станет некорректным, и система может либо выдать ошибку 404, либо обработать запрос неверно.
Чтобы избежать этой проблемы, всегда используйте функцию Формат с параметром ЧГ=0 (исключение группировки разрядов):
СтрокаID = Формат(id, "ЧГ=0");
ПутьКРесурсу = "/api/v4/leads/" + СтрокаID;
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу, AccessToken);
Для метода PATCH по адресу /api/v4/leads/{id} amoCRM ожидает в теле запроса объект (соответствие), а не массив. В исходном коде автора используется МассивСоответствий, что превращает JSON в массив [{...}]. Несмотря на то, что некоторые парсеры на стороне API могут «прощать» такую обертку, правильно будет передавать структуру напрямую.
Посмотрим, как должно выглядеть наполнение данных для смены статуса и воронки:
ДанныеЗапроса = Новый Соответствие;
ДанныеЗапроса.Вставить("status_id", 38446171); // ID нового статуса
ДанныеЗапроса.Вставить("pipeline_id", 3959986); // ID воронки (обязательно, если статус меняется на другую воронку)
Обратите внимание, что передавать id внутри JSON при использовании эндпоинта с ID в URL избыточно, но не запрещено.
Теперь соберем все исправления в единый рабочий алгоритм. Рассмотрим по шагам процесс подготовки и отправки данных.
Шаг 1. Подготовка заголовков. Для авторизации в amoCRM используется Bearer токен. Также необходимо явно указать тип контента application/json.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ЗначениеAccessToken);
Заголовки.Вставить("Content-Type", "application/json");
Шаг 2. Формирование тела запроса. Используем ЗаписьJSON для корректной сериализации объекта 1С.
ПараметрыОбновления = Новый Соответствие;
ПараметрыОбновления.Вставить("status_id", 38446171);
ПараметрыОбновления.Вставить("pipeline_id", 3959986);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыОбновления);
СтрокаТела = ЗаписьJSON.Закрыть();
Шаг 3. Отправка запроса методом PATCH. Выясним важный момент: amoCRM v4 требует именно метод PATCH для обновления данных.
// Предположим, Соединение уже инициализировано
ПутьКРесурсу = "/api/v4/leads/" + Формат(id, "ЧГ=0");
Запрос = Новый HTTPЗапрос(ПутьКРесурсу, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаТела, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ВызватьHTTPМетод("PATCH", Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Сделка успешно обновлена");
// Читаем ответ, если нужны технические данные (updated_at)
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
Иначе
Сообщить("Ошибка при обновлении: " + Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Если ваша задача требует получения структуры _embedded в ответе, вам необходимо использовать метод массового редактирования. В этом случае тело запроса обязательно должно быть массивом, а ID сделки передается внутри каждого объекта массива. URL при этом не содержит ID конкретной сделки.
Пример структуры для массового обновления:
МассивДанных = Новый Массив;
Сделка1 = Новый Соответствие;
Сделка1.Вставить("id", 9339101);
Сделка1.Вставить("status_id", 38446171);
МассивДанных.Добавить(Сделка1);
// Сериализуем МассивДанных в JSON и отправляем на "/api/v4/leads"
Резюме: Чтобы ваш запрос работал корректно, всегда проверяйте тип данных ID (используйте Формат), следите за соответствием структуры JSON (объект или массив) выбранному эндпоинту и используйте правильные HTTP-методы. В большинстве случаев для простого изменения статуса одной сделки достаточно метода PATCH на адрес /api/v4/leads/{id} с передачей простого объекта с новыми параметрами.