Интеграция 1С с Битрикс24 через входящие вебхуки — частая задача при автоматизации бизнес-процессов. Однако разработчики нередко сталкиваются с ошибками валидации типов при отправке параметров в REST API. Разберем типичную ситуацию: при попытке вызвать метод получения задачи платформа Битрикс24 возвращает ошибку вида TASKS_ERROR_EXCEPTION_#256: Param #0 (taskId) for method ctaskitem::getdata() expected to be of type "integer", but given something else. Проанализируем причины такого поведения и рассмотрим корректные способы формирования HTTP-запросов из 1С.
Рассмотрим исходный вариант кода, который часто пишется по типовым примерам работы с JSON в 1С:
Команда = "task.item.getdata";
Ресурс = "rest/" + Пользователь + "/" + Токен + "/" + Команда;
Запрос = Новый HTTPЗапрос(Ресурс);
мПараметры = Новый Соответствие;
мПараметры.Вставить("TASKID", 1);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, мПараметры);
ПараметрыСтрокой = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(ПараметрыСтрокой);
Ответ = мHTTPСоединение.ОтправитьДляОбработки(Запрос);
При выполнении этого запроса веб-сервис Битрикс24 возвращает ошибку, сообщая, что аргумент номер 0 ожидается с типом integer, но передано другое значение. Смена типа данных с числа на строку или массив проблему не решает.
Выясним причину ошибки: методы семейства task.item.* (в частности, task.item.getdata) относятся к первому, устаревшему поколению API задач. Внутри платформы Битрикс24 эти методы реализованы как прямые вызовы внутренних PHP-функций, которые ожидают не ассоциативный массив с именованными ключами (такими как TASKID), а позиционные аргументы (аргумент 0 — идентификатор задачи, аргумент 1 — дополнительные параметры и так далее). Когда 1С передает именованный JSON-объект, обработчик вебхука не может сопоставить имя поля с нулевым аргументом функции.
Если проект жестко завязан на использование устаревшего метода task.item.getdata, необходимо передавать параметры в формате строки формы с указанием индекса позиции аргумента. Разберем рабочий пример:
Команда = "task.item.getdata";
Ресурс = "rest/" + Пользователь + "/" + Токен + "/" + Команда;
Запрос = Новый HTTPЗапрос(Ресурс);
// Передаем нулевой позиционный аргумент с идентификатором задачи
ПараметрыСтрокой = "0=1";
Запрос.УстановитьТелоИзСтроки(ПараметрыСтрокой);
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
Ответ = мHTTPСоединение.ОтправитьДляОбработки(Запрос);
Такой вызов корректно распознается старым ядром API задач Битрикс24 как в POST-, так и в GET-запросах.
В современной разработке интеграций рекомендуется полностью отказаться от устаревших методов task.item.* и перейти на актуальное семейство методов tasks.task.*. Для получения данных задачи используется метод tasks.task.get.
Преимущества актуального метода:
select гибко выбирать только необходимые поля (включая пользовательские поля UF_*).result.task.Рассмотрим по шагам, как правильно выполнить POST-запрос с JSON-телом к методу tasks.task.get:
Команда = "tasks.task.get.json";
Ресурс = "rest/" + Пользователь + "/" + Токен + "/" + Команда;
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Формируем параметры запроса
мПараметры = Новый Структура;
мПараметры.Вставить("taskId", 1);
// При необходимости указываем список нужных полей
МассивПолей = Новый Массив;
МассивПолей.Добавить("ID");
МассивПолей.Добавить("TITLE");
МассивПолей.Добавить("STATUS");
МассивПолей.Добавить("RESPONSIBLE_ID");
мПараметры.Вставить("select", МассивПолей);
// Сериализуем параметры в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, мПараметры);
ПараметрыСтрокой = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(ПараметрыСтрокой, КодировкаТекста.UTF8);
Ответ = мHTTPСоединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Для простых операций чтения данных из Битрикс24 нет необходимости формировать тело запроса через ЗаписьJSON. Параметры можно передать непосредственно в строке запроса (Query String) методом GET:
ИдентификаторЗадачи = 1;
Ресурс = "rest/" + Пользователь + "/" + Токен + "/tasks.task.get.json?taskId=" + Формат(ИдентификаторЗадачи, "ЧГ=0");
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = мHTTPСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
ДанныеЗадачи = Результат.result.task;
КонецЕсли;
Content-Type: application/json; charset=utf-8. Если заголовок не указан, сервер может расценить тело как форму и проигнорировать структуру JSON..json к имени команды (например, tasks.task.get.json) гарантирует возврат ответа в формате JSON независимо от настроек портала.Формат() всегда отключайте группировку разрядов ("ЧГ=0"), чтобы избежать появления неразрывных пробелов в идентификаторах.batch, объединяющий до 50 команд в один HTTP-запрос. Это защитит от превышения лимитов на количество вызовов REST API в секунду.