Как правильно передавать параметры в вебхуки Bitrix24 из 1С при работе с задачами?

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

Интеграция 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 не принимается методом task.item.getdata

Рассмотрим исходный вариант кода, который часто пишется по типовым примерам работы с 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-объект, обработчик вебхука не может сопоставить имя поля с нулевым аргументом функции.

Решение 1. Передача позиционных параметров для устаревших методов

Если проект жестко завязан на использование устаревшего метода 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-запросах.

Решение 2. Переход на актуальный метод tasks.task.get (рекомендуемый способ)

В современной разработке интеграций рекомендуется полностью отказаться от устаревших методов task.item.* и перейти на актуальное семейство методов tasks.task.*. Для получения данных задачи используется метод tasks.task.get.

Преимущества актуального метода:

  1. Принимает стандартные именованные структуры JSON без привязки к номерам позиций.
  2. Позволяет через параметр select гибко выбирать только необходимые поля (включая пользовательские поля UF_*).
  3. Возвращает стандартизированный ответ в объекте 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);

Решение 3. Использование простого GET-запроса через строку URL

Для простых операций чтения данных из Битрикс24 нет необходимости формировать тело запроса через ЗаписьJSON. Параметры можно передать непосредственно в строке запроса (Query String) методом GET:


ИдентификаторЗадачи = 1;
Ресурс = "rest/" + Пользователь + "/" + Токен + "/tasks.task.get.json?taskId=" + Формат(ИдентификаторЗадачи, "ЧГ=0");

Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = мHTTPСоединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    Результат = ПрочитатьJSON(ЧтениеJSON);
    
    ДанныеЗадачи = Результат.result.task;
КонецЕсли;

Важные правила при работе с REST API Битрикс24 из 1С

  1. Заголовок Content-Type: При отправке JSON в теле запроса обязательно задавайте заголовок Content-Type: application/json; charset=utf-8. Если заголовок не указан, сервер может расценить тело как форму и проигнорировать структуру JSON.
  2. Суффикс формата: Добавление суффикса .json к имени команды (например, tasks.task.get.json) гарантирует возврат ответа в формате JSON независимо от настроек портала.
  3. Форматирование чисел: При конструировании URL-параметров с помощью функции Формат() всегда отключайте группировку разрядов ("ЧГ=0"), чтобы избежать появления неразрывных пробелов в идентификаторах.
  4. Пакетные запросы (batch): Если из 1С требуется запросить или обновить данные десятков задач, используйте метод batch, объединяющий до 50 команд в один HTTP-запрос. Это защитит от превышения лимитов на количество вызовов REST API в секунду.
← На главную