Как правильно изменить статус сделки в amoCRM API v4 из 1С и почему приходит «неполный» ответ?

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

Интеграция 1С с внешними CRM-системами, такими как amoCRM, требует строгого соблюдения спецификаций API. Одной из частых проблем, с которыми сталкиваются разработчики при переходе на v4 API, является получение неожиданного формата ответа или отсутствие изменений в данных при получении кода состояния 200 OK. Разберем подробно, почему это происходит и как правильно составить HTTP-запрос для изменения статуса сделки.

Анализируем причину «неполного» JSON-ответа

Рассмотрим ситуацию: вы отправляете запрос на редактирование сделки и в ответ вместо ожидаемого массива со всеми данными получаете краткую структуру с id, updated_at и ссылкой _links. Выясним причину такого поведения системы. В amoCRM API v4 существует два принципиально разных метода для редактирования сделок (Leads):

  1. Редактирование конкретной сделки: Запрос отправляется на /api/v4/leads/{id}.
  2. Массовое редактирование сделок: Запрос отправляется на /api/v4/leads.

Если вы указываете ID сделки прямо в URL-адресе, сервер воспринимает это как запрос на изменение одиночного объекта. По спецификации amoCRM, в этом случае ответ возвращает только данные измененной сущности без секции _embedded. Тот формат, который вы ожидаете (с блоком _embedded и списком leads), возвращается только при использовании метода массового обновления. Таким образом, код 200 говорит о том, что запрос выполнен успешно, а «неполный» JSON — это стандартное поведение данного эндпоинта.

Разбираем типичную ошибку форматирования ID в 1С

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

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);

Проверяем структуру JSON в теле запроса

Для метода PATCH по адресу /api/v4/leads/{id} amoCRM ожидает в теле запроса объект (соответствие), а не массив. В исходном коде автора используется МассивСоответствий, что превращает JSON в массив [{...}]. Несмотря на то, что некоторые парсеры на стороне API могут «прощать» такую обертку, правильно будет передавать структуру напрямую.

Посмотрим, как должно выглядеть наполнение данных для смены статуса и воронки:


ДанныеЗапроса = Новый Соответствие;
ДанныеЗапроса.Вставить("status_id", 38446171); // ID нового статуса
ДанныеЗапроса.Вставить("pipeline_id", 3959986); // ID воронки (обязательно, если статус меняется на другую воронку)

Обратите внимание, что передавать id внутри JSON при использовании эндпоинта с ID в URL избыточно, но не запрещено.

Реализуем правильный HTTP-запрос

Теперь соберем все исправления в единый рабочий алгоритм. Рассмотрим по шагам процесс подготовки и отправки данных.

Шаг 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?

Если ваша задача требует получения структуры _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} с передачей простого объекта с новыми параметрами.

← На главную