Как правильно составить batch запрос для группового обновления полей контактов в Битрикс24 из 1С?

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

При интеграции 1С с Битрикс24 часто возникает задача массовой обработки данных. Рассмотрим ситуацию, когда метод добавления новых записей crm.contact.add в пакетном режиме отрабатывает отлично, а вот обновление через crm.contact.update не приносит результатов. Запрос уходит, сервер возвращает статус 200 (ОК), но в карточках клиентов изменения не появляются.

Проанализируем причины такого поведения и разберем по шагам, как правильно составить строку batch-запроса, чтобы групповое обновление полей в Битрикс24 работало стабильно и без ошибок.

Формирование тела запроса: URL-encoded против JSON

При отправке запросов через вебхуки или стандартный REST API многие разработчики начинают с формата application/x-www-form-urlencoded, собирая строку с амперсандами и кодируя спецсимволы. Однако этот подход чреват ошибками: малейшая невнимательность с %26 или пробелами ломает разбор тела запроса на стороне Битрикс24.

Мы настоятельно рекомендуем перейти на формат application/json. Отправляя данные в виде JSON-структуры, вы получаете наглядное и легко читаемое тело запроса, а 1С сама берет на себя экранирование нужных символов. При этом сами команды внутри JSON можно не URL-кодировать (пробелы и русские символы передаются «как есть»).

Посмотрим на пример формирования структуры команд в 1С:


СтруктураДляЖсон = Новый Структура;
СтруктураДляЖсон.Вставить("cmd", Новый Структура(
    "cmd1", "crm.contact.update?id=1&fields[NAME]=Иван&fields[LAST_NAME]=Иванов",
    "cmd2", "crm.contact.update?id=3&fields[NAME]=Петр&fields[LAST_NAME]=Петров"
));

ЗаписьЖсон = Новый ЗаписьJSON;
ЗаписьЖсон.УстановитьСтроку(Новый ПараметрыЗаписиJSON(," "));
ЗаписатьJSON(ЗаписьЖсон, СтруктураДляЖсон);
СтрокаЖсон = ЗаписьЖсон.Закрыть();

Главная проблема: Кодировка и невидимый BOM

Почему же даже правильно сформированный JSON иногда игнорируется Битрикс24, а в ответе мы получаем пустой массив "result":[] без реальных обновлений? Выясним причину.

По умолчанию платформа 1С при записи строки в кодировке UTF-8 добавляет в начало невидимый маркер последовательности байтов — BOM (Byte Order Mark). Парсер JSON на серверах Битрикс24 спотыкается об этот маркер, не может разобрать тело запроса и тихо завершает работу (возвращая HTTP 200, но не выполняя ни одной команды).

Решение этой проблемы крайне простое: необходимо явно указать 1С не использовать BOM при конвертации строки в тело HTTP-запроса. Для этого используется системное перечисление ИспользованиеByteOrderMark.НеИспользовать.

Рассмотрим правильный код установки тела запроса:


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

ЗапросHTTP = Новый HTTPЗапрос(Сервис, Заголовки);
// Отключаем BOM для корректной обработки на стороне Битрикс24
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаЖсон, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);

Ограничения пакетных запросов и обработка ошибок

При работе с методом batch важно учитывать технические лимиты и архитектурные особенности REST API Битрикс24:

  1. Лимит в 50 команд: В один batch-запрос (в блок cmd) можно поместить максимум 50 команд. Если вам нужно обновить 100 контактов, потребуется отправить два отдельных запроса.
  2. Параметр halt: По умолчанию, если одна из команд завершится ошибкой, Битрикс24 продолжит выполнение остальных. Если вы хотите, чтобы пакет остановился при первой же неудаче, добавьте в запрос параметр "halt": 1.
  3. Ошибки не меняют HTTP-статус: Важно понимать, что успешный код ответа HTTP (200) означает лишь то, что пакет доставлен. Обязательно проверяйте массив result_error в ответе. Если внутри него есть данные, значит какие-то из команд не отработали (например, не найден контакт с указанным ID).

Особенности обновления множественных полей (Телефоны и Email)

Отдельно разберем нюанс обновления контактных данных. Поля типа телефон (PHONE) и электронная почта (EMAIL) в Битрикс24 являются множественными. Если в команде crm.contact.update вы просто передадите новый телефон, система добавит его к списку существующих, а не заменит старый.

Для корректного обновления множественного поля в структуру fields необходимо передавать значение с указанием типа (например, WORK или MOBILE). Если требуется полная перезапись или удаление старых номеров, придется сначала получить их ID через метод crm.contact.get, а затем передавать эти ID в команде обновления.

Итоги

Для успешного массового обновления контактов в Битрикс24 из 1С используйте пакетные batch-запросы в формате JSON. Обязательно добавляйте заголовок Content-Type: application/json и, что самое важное, передавайте тело запроса в кодировке UTF-8 без метки BOM. Следуя этим правилам, вы обеспечите стабильную и быструю синхронизацию данных между вашей базой и облачной CRM.

← На главную