При интеграции 1С с Битрикс24 часто возникает задача массовой обработки данных. Рассмотрим ситуацию, когда метод добавления новых записей crm.contact.add в пакетном режиме отрабатывает отлично, а вот обновление через crm.contact.update не приносит результатов. Запрос уходит, сервер возвращает статус 200 (ОК), но в карточках клиентов изменения не появляются.
Проанализируем причины такого поведения и разберем по шагам, как правильно составить строку batch-запроса, чтобы групповое обновление полей в Битрикс24 работало стабильно и без ошибок.
При отправке запросов через вебхуки или стандартный 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(ЗаписьЖсон, СтруктураДляЖсон);
СтрокаЖсон = ЗаписьЖсон.Закрыть();
Почему же даже правильно сформированный 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:
cmd) можно поместить максимум 50 команд. Если вам нужно обновить 100 контактов, потребуется отправить два отдельных запроса."halt": 1.result_error в ответе. Если внутри него есть данные, значит какие-то из команд не отработали (например, не найден контакт с указанным ID).Отдельно разберем нюанс обновления контактных данных. Поля типа телефон (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.