Как выполнить первый запрос к REST API из 1С

Scope: базовый, crm

Кто может выполнять методы: чтобы пройти сценарий целиком, нужно самое строгое из перечисленных прав — «Добавление|Импорт» компаний

  • crm.company.add — пользователь с правом «Добавление|Импорт» компаний
  • profile — любой пользователь

Выберите инструмент для разработки с AI-агентом:

  • используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
  • используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации

Запрос к REST API Битрикс24 — это обычный HTTP-запрос. Со стороны 1С:Предприятия его выполняют объекты HTTPСоединение и HTTPЗапрос, а параметры и ответ передаются в формате JSON. Дополнительные библиотеки не нужны.

В этом туториале мы соберем общий модуль ИнтеграцияБитрикс24, который выполняет любой метод REST API, разбирает ответ и обрабатывает ошибки. Остальные сценарии раздела вызывают функции этого модуля.

Перед началом

Для выполнения примеров нужны:

  • входящий вебхук. Как его создать, описано на странице Как выполнить свой первый запрос к API. Адрес вебхука выглядит так: https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/. Вебхук выполняет запросы с правами пользователя, который его создал
  • платформа 1С:Предприятие 8.3.10 и новее. Примеры используют встроенные функции работы с JSON
  • доступ в интернет с компьютера, где выполняется код. Код выполняется на сервере 1С или в толстом клиенте. В веб-клиенте и в тонком клиенте HTTP-запросы к внешним сервисам выполняют в серверном контексте

Секретный код вебхука не храните в коде модуля. Заведите константу с типом Строка (0) — например, АдресВебхукаБитрикс24, и заполните ее в режиме 1С:Предприятие.

Как использовать примеры в документации

1. Выполняем минимальный запрос

Метод profile не требует параметров и возвращает данные пользователя, от имени которого работает вебхук. Это удобный способ проверить, что соединение с Битрикс24 настроено верно.

&НаСервере
Процедура ПроверитьПодключениеНаСервере()
	
	// Адрес вебхука: https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/
	Сервер = "your-domain.bitrix24.ru";
	ПутьВебхука = "/rest/1/xxxxxxxxxxxxxxxx/";
	
	Соединение = Новый HTTPСоединение(Сервер, 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL);
	
	Запрос = Новый HTTPЗапрос(ПутьВебхука + "profile");
	Запрос.Заголовки.Вставить("Content-Type", "application/json");
	Запрос.Заголовки.Вставить("Accept", "application/json");
	
	Запрос.УстановитьТелоИзСтроки("{}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	
	Сообщить("Код состояния: " + Ответ.КодСостояния);
	Сообщить(Ответ.ПолучитьТелоКакСтроку("UTF-8"));
	
КонецПроцедуры

Разберем ключевые места.

  • Порт 443 и ЗащищенноеСоединениеOpenSSL. Битрикс24 работает только по HTTPS. Без объекта защищенного соединения платформа выполнит запрос по HTTP и получит ошибку
  • Адрес ресурса в HTTPЗапрос — это путь без имени сервера: путь вебхука плюс имя метода
  • ИспользованиеByteOrderMark.НеИспользовать — указывайте это значение явно. Если в начало тела попадет метка BOM, Битрикс24 не разберет JSON и вернет ошибку с кодом состояния 400 — например, ID is not defined or invalid. Ошибка выглядит так, будто параметры не переданы, хотя тело запроса сформировано верно
  • ОтправитьДляОбработки выполняет POST-запрос. Для методов REST API он подходит всегда: в теле POST можно передать вложенные структуры, которые в строке запроса пришлось бы кодировать

Успешный ответ выглядит так:

{
    "result": {
        "ID": "1",
        "ADMIN": true,
        "NAME": "Иван",
        "LAST_NAME": "Петров",
        "TIME_ZONE": "Europe/Moscow"
    },
    "time": {
        "start": 1787312393,
        "finish": 1787312393.489425,
        "duration": 0.4894249439239502,
        "processing": 0,
        "date_start": "2026-08-21T14:39:53+03:00",
        "date_finish": "2026-08-21T14:39:53+03:00",
        "operating_reset_at": 1787312993,
        "operating": 0
    }
}

Данные метода лежат в ключе result. Ключ time есть в ответе любого метода: он показывает время выполнения запроса и накопленную ресурсоемкость operating.

2. Передаем параметры метода

Параметры собирают в структуре и сериализуют в JSON функцией ЗаписатьJSON. Например, для метода crm.company.add нужно передать объект fields с полями компании.

Поля = Новый Структура;
Поля.Вставить("TITLE", "ООО «Ромашка»");
Поля.Вставить("COMPANY_TYPE", "CUSTOMER");

Телефон = Новый Структура;
Телефон.Вставить("VALUE", "+74951234567");
Телефон.Вставить("VALUE_TYPE", "WORK");

Телефоны = Новый Массив;
Телефоны.Добавить(Телефон);
Поля.Вставить("PHONE", Телефоны);

Параметры = Новый Структура;
Параметры.Вставить("fields", Поля);

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

В теле запроса получится:

{
    "fields": {
        "TITLE": "ООО «Ромашка»",
        "COMPANY_TYPE": "CUSTOMER",
        "PHONE": [
            {
                "VALUE": "+74951234567",
                "VALUE_TYPE": "WORK"
            }
        ]
    }
}

Структура или соответствие

Ключи структуры 1С должны быть допустимыми идентификаторами: буквы, цифры и подчеркивание. Поля REST API вроде TITLE или UF_CRM_1585078544414 этому условию отвечают, а ключи фильтров — нет. Фильтр {">ID": 100} через структуру собрать нельзя: символы >, <, !, %, @ в имени свойства недопустимы.

Для таких ключей используйте Соответствие — при сериализации оно превращается в такой же JSON-объект:

Фильтр = Новый Соответствие;
Фильтр.Вставить(">ID", 100);
Фильтр.Вставить("%TITLE", "Ромашка");

Параметры = Новый Структура;
Параметры.Вставить("filter", Фильтр);

Даты передавайте строкой в формате ISO 8601 с указанием смещения часового пояса. Тип Дата в 1С смещение не хранит, поэтому Битрикс24 иначе поймет дату, если смещение не указать явно.

// Функция ДатаВСтрокуISO входит в общий модуль — ее код приведен ниже
Поля.Вставить("BEGINDATE", ИнтеграцияБитрикс24.ДатаВСтрокуISO(Документ.Дата));

Для даты 21.08.2026 14:43:13 в базе с часовым поясом Москвы функция вернет 2026-08-21T14:43:13+03:00. Обратная операция — функция ДатаИзОтвета того же модуля: она разбирает дату из ответа Битрикс24 и приводит ее к часовому поясу информационной базы.

3. Разбираем ответ

Ответ читают функцией ПрочитатьJSON. Второй параметр Истина означает, что объекты JSON нужно читать в Соответствие, а не в Структуру. Это важно: ответы Битрикс24 содержат ключи, которые не могут быть именами свойств структуры — например, числовые идентификаторы файлов или команд пакета batch.

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8"));
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();

Результат = ДанныеОтвета.Получить("result");

Как значения JSON превращаются в типы 1С:

JSON

Тип в 1С

Объект {...}

Соответствие, если второй параметр ПрочитатьJSON равен Истина

Массив [...]

Массив

Строка

Строка

Число

Число

true и false

Булево

null

Неопределено

Разные группы методов возвращают идентификаторы по-разному. Методы crm.company.*, crm.contact.*, crm.deal.* возвращают "ID": "517" — строкой, а универсальные методы crm.item.* и методы каталога — "id": 517 — числом. Приводите идентификатор к числу явно, иначе сравнение с ссылкой из регистра сведений даст неверный результат.

4. Обрабатываем ошибки

Битрикс24 сообщает об ошибке кодом состояния HTTP и телом ответа с ключами error и error_description.

Ситуация

Код состояния

Тело ответа

Неверный код вебхука

401

{"error":"INVALID_CREDENTIALS","error_description":"Invalid request credentials"}

Метод не существует или у вебхука нет нужного scope

404

{"error":"ERROR_METHOD_NOT_FOUND","error_description":"Method not found!"}

Не передан обязательный параметр

400

{"error":"","error_description":"ID is not defined or invalid."}

Превышена интенсивность запросов

503

{"error":"QUERY_LIMIT_EXCEEDED","error_description":"Too many requests"}

Превышена ресурсоемкость метода

429

{"error":"OPERATION_TIME_LIMIT",...}

Обратите внимание: в ответе на неверные параметры ключ error пустой, а текст ошибки приходит только в error_description. Поэтому проверяйте и код состояния, и наличие ключа error в теле ответа.

Ошибки 503 и 429 — временные. Их обрабатывают повтором запроса с увеличивающейся паузой. Полный список кодов — на странице Коды ошибок, правила лимитов — на странице Лимиты REST API.

5. Собираем общий модуль

Соберем все вместе. Создайте общий модуль ИнтеграцияБитрикс24 с флагами Сервер и Вызов сервера и перенесите в него код.

#Область ПрограммныйИнтерфейс

// Выполняет метод REST API Битрикс24.
//
// Параметры:
//  ИмяМетода - Строка - имя метода, например "crm.company.add"
//  Параметры - Структура, Соответствие - параметры метода
//  КоличествоПопыток - Число - сколько раз повторить запрос при временной ошибке
//
// Возвращаемое значение:
//  Структура:
//   * Успешно - Булево - Истина, если метод выполнен без ошибок
//   * Результат - Произвольный - значение ключа result ответа
//   * Ответ - Соответствие - полный ответ Битрикс24, включая ключи total, next и time
//   * КодСостояния - Число - код состояния HTTP
//   * КодОшибки - Строка - значение ключа error
//   * ОписаниеОшибки - Строка - значение ключа error_description
//
Функция ВыполнитьМетод(ИмяМетода, Параметры = Неопределено, КоличествоПопыток = 3) Экспорт
	
	НомерПопытки = 1;
	
	Пока Истина Цикл
		
		Результат = ВыполнитьЗапрос(ИмяМетода, Параметры);
		
		Если Результат.Успешно
			ИЛИ НомерПопытки >= КоличествоПопыток
			ИЛИ НЕ ЭтоВременнаяОшибка(Результат) Тогда
			Прервать;
		КонецЕсли;
		
		// Метод ВызватьПаузу доступен начиная с версии платформы 8.3.25.
		// На более ранних версиях используйте свой способ задержки.
		ВызватьПаузу(1000 * НомерПопытки);
		
		НомерПопытки = НомерПопытки + 1;
		
	КонецЦикла;
	
	Если НЕ Результат.Успешно Тогда
		ЗаписьЖурналаРегистрации("Битрикс24.REST",
			УровеньЖурналаРегистрации.Ошибка,
			,
			,
			СтрШаблон("Метод %1 вернул ошибку %2 (%3): %4",
				ИмяМетода,
				Результат.КодСостояния,
				Результат.КодОшибки,
				Результат.ОписаниеОшибки));
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Преобразует значение 1С в строку JSON.
Функция ЗначениеВJSON(Значение) Экспорт
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Значение);
	
	Возврат ЗаписьJSON.Закрыть();
	
КонецФункции

// Преобразует строку JSON в значение 1С. Объекты читаются в соответствия.
Функция JSONВЗначение(ТекстJSON) Экспорт
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ТекстJSON);
	Значение = ПрочитатьJSON(ЧтениеJSON, Истина);
	ЧтениеJSON.Закрыть();
	
	Возврат Значение;
	
КонецФункции

// Приводит идентификатор из ответа к числу: разные методы возвращают его строкой или числом.
Функция ИдентификаторИзОтвета(Значение) Экспорт
	
	Если ТипЗнч(Значение) = Тип("Число") Тогда
		Возврат Значение;
	ИначеЕсли ТипЗнч(Значение) = Тип("Строка") И НЕ ПустаяСтрока(Значение) Тогда
		Возврат Число(Значение);
	КонецЕсли;
	
	Возврат 0;
	
КонецФункции

// Преобразует дату из ответа Битрикс24 в дату часового пояса информационной базы.
//
// Параметры:
//  ТекстДаты - Строка - дата в формате ISO 8601, например "2026-08-21T14:43:13+03:00"
//
// Возвращаемое значение:
//  Дата
//
Функция ДатаИзОтвета(ТекстДаты) Экспорт
	
	// Незаполненные даты приходят как null и читаются в Неопределено
	Если ТипЗнч(ТекстДаты) <> Тип("Строка") ИЛИ ПустаяСтрока(ТекстДаты) Тогда
		Возврат '00010101';
	КонецЕсли;
	
	ДатаПортала = Дата(
		Число(Сред(ТекстДаты, 1, 4)),
		Число(Сред(ТекстДаты, 6, 2)),
		Число(Сред(ТекстДаты, 9, 2)),
		Число(Сред(ТекстДаты, 12, 2)),
		Число(Сред(ТекстДаты, 15, 2)),
		Число(Сред(ТекстДаты, 18, 2)));
	
	ТекстСмещения = Сред(ТекстДаты, 20);
	
	Если ВРег(ТекстСмещения) = "Z" Тогда
		СмещениеПортала = 0;
	ИначеЕсли СтрДлина(ТекстСмещения) < 6 Тогда
		// Смещение не указано или указано не полностью — считаем дату местной
		Возврат ДатаПортала;
	Иначе
		СмещениеПортала = Число(Сред(ТекстСмещения, 2, 2)) * 3600 + Число(Сред(ТекстСмещения, 5, 2)) * 60;
		Если Лев(ТекстСмещения, 1) = "-" Тогда
			СмещениеПортала = -СмещениеПортала;
		КонецЕсли;
	КонецЕсли;
	
	Возврат МестноеВремя(ДатаПортала - СмещениеПортала);
	
КонецФункции

// Преобразует дату 1С в строку формата ISO 8601 со смещением часового пояса.
//
// Параметры:
//  ДатаЛокальная - Дата - дата в часовом поясе информационной базы
//
// Возвращаемое значение:
//  Строка - например "2026-08-21T14:43:13+03:00"
//
Функция ДатаВСтрокуISO(ДатаЛокальная) Экспорт
	
	СмещениеСекунд = ДатаЛокальная - УниверсальноеВремя(ДатаЛокальная);
	ЗнакСмещения = ?(СмещениеСекунд < 0, "-", "+");
	МодульСмещения = ?(СмещениеСекунд < 0, -СмещениеСекунд, СмещениеСекунд);
	
	СмещениеЧасы = Цел(МодульСмещения / 3600);
	СмещениеМинуты = Цел((МодульСмещения - СмещениеЧасы * 3600) / 60);
	
	Возврат Формат(ДатаЛокальная, "ДФ=yyyy-MM-dd")
		+ "T"
		+ Формат(ДатаЛокальная, "ДФ=HH:mm:ss")
		+ ЗнакСмещения
		+ Формат(СмещениеЧасы, "ЧЦ=2; ЧВН=; ЧГ=0; ЧН=00")
		+ ":"
		+ Формат(СмещениеМинуты, "ЧЦ=2; ЧВН=; ЧГ=0; ЧН=00");
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ВыполнитьЗапрос(ИмяМетода, Параметры)
	
	Результат = Новый Структура;
	Результат.Вставить("Успешно", Ложь);
	Результат.Вставить("Результат", Неопределено);
	Результат.Вставить("Ответ", Неопределено);
	Результат.Вставить("КодСостояния", 0);
	Результат.Вставить("КодОшибки", "");
	Результат.Вставить("ОписаниеОшибки", "");
	
	Настройки = НастройкиПодключения();
	
	Соединение = Новый HTTPСоединение(
		Настройки.Сервер,
		443,
		,
		,
		Настройки.Прокси,
		Настройки.Таймаут,
		Новый ЗащищенноеСоединениеOpenSSL);
	
	Запрос = Новый HTTPЗапрос(Настройки.ПутьВебхука + ИмяМетода);
	Запрос.Заголовки.Вставить("Content-Type", "application/json");
	Запрос.Заголовки.Вставить("Accept", "application/json");
	Запрос.Заголовки.Вставить("User-Agent", "1C-Enterprise/1.0");
	
	ТелоЗапроса = ЗначениеВJSON(?(Параметры = Неопределено, Новый Структура, Параметры));
	Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	Попытка
		Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	Исключение
		Результат.КодОшибки = "CONNECTION_ERROR";
		Результат.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		Возврат Результат;
	КонецПопытки;
	
	Результат.КодСостояния = Ответ.КодСостояния;
	ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
	
	Попытка
		ДанныеОтвета = JSONВЗначение(ТелоОтвета);
	Исключение
		Результат.КодОшибки = "INVALID_RESPONSE";
		Результат.ОписаниеОшибки = "Ответ не является корректным JSON: " + Лев(ТелоОтвета, 300);
		Возврат Результат;
	КонецПопытки;
	
	Результат.Ответ = ДанныеОтвета;
	
	ЭтоСоответствие = (ТипЗнч(ДанныеОтвета) = Тип("Соответствие"));
	ЕстьКлючОшибки = ЭтоСоответствие И ДанныеОтвета.Получить("error") <> Неопределено;
	
	Если Результат.КодСостояния <> 200 ИЛИ ЕстьКлючОшибки Тогда
		
		Если ЕстьКлючОшибки Тогда
			Результат.КодОшибки = Строка(ДанныеОтвета.Получить("error"));
			ОписаниеОшибки = ДанныеОтвета.Получить("error_description");
			Результат.ОписаниеОшибки = ?(ОписаниеОшибки = Неопределено, "", Строка(ОписаниеОшибки));
		Иначе
			Результат.КодОшибки = "HTTP_" + Формат(Результат.КодСостояния, "ЧГ=0; ЧН=0");
			Результат.ОписаниеОшибки = Лев(ТелоОтвета, 300);
		КонецЕсли;
		
		Возврат Результат;
		
	КонецЕсли;
	
	Результат.Успешно = Истина;
	Результат.Результат = ?(ЭтоСоответствие, ДанныеОтвета.Получить("result"), ДанныеОтвета);
	
	Возврат Результат;
	
КонецФункции

Функция ЭтоВременнаяОшибка(Результат)
	
	Возврат Результат.КодСостояния = 503
		ИЛИ Результат.КодСостояния = 429
		ИЛИ Результат.КодОшибки = "CONNECTION_ERROR";
	
КонецФункции

Функция НастройкиПодключения()
	
	АдресВебхука = СокрЛП(Константы.АдресВебхукаБитрикс24.Получить());
	
	Если ПустаяСтрока(АдресВебхука) Тогда
		ВызватьИсключение "Не заполнена константа «Адрес вебхука Битрикс24»";
	КонецЕсли;
	
	Если Прав(АдресВебхука, 1) <> "/" Тогда
		АдресВебхука = АдресВебхука + "/";
	КонецЕсли;
	
	АдресБезПротокола = СтрЗаменить(АдресВебхука, "https://", "");
	ПозицияПути = СтрНайти(АдресБезПротокола, "/");
	
	Настройки = Новый Структура;
	Настройки.Вставить("Сервер", Лев(АдресБезПротокола, ПозицияПути - 1));
	Настройки.Вставить("ПутьВебхука", Сред(АдресБезПротокола, ПозицияПути));
	Настройки.Вставить("Таймаут", 60);
	
	// Если запросы идут через прокси организации, создайте объект ИнтернетПрокси
	// и передайте его в конструктор HTTPСоединение.
	Настройки.Вставить("Прокси", Неопределено);
	
	Возврат Настройки;
	
КонецФункции

#КонецОбласти

6. Проверяем модуль

Создадим компанию и прочитаем идентификатор из ответа.

Поля = Новый Структура;
Поля.Вставить("TITLE", "ООО «Ромашка»");
Поля.Вставить("COMPANY_TYPE", "CUSTOMER");

Параметры = Новый Структура;
Параметры.Вставить("fields", Поля);

Ответ = ИнтеграцияБитрикс24.ВыполнитьМетод("crm.company.add", Параметры);

Если Ответ.Успешно Тогда
	ИдентификаторКомпании = ИнтеграцияБитрикс24.ИдентификаторИзОтвета(Ответ.Результат);
	Сообщить("Создана компания с идентификатором " + ИдентификаторКомпании);
Иначе
	Сообщить("Ошибка: " + Ответ.КодОшибки + " " + Ответ.ОписаниеОшибки);
КонецЕсли;

Метод crm.company.add возвращает идентификатор созданной компании:

{
    "result": 517,
    "time": {
        "start": 1787312593,
        "finish": 1787312593.450516,
        "duration": 0.4505159854888916,
        "processing": 0,
        "date_start": "2026-08-21T14:43:13+03:00",
        "date_finish": "2026-08-21T14:43:13+03:00",
        "operating_reset_at": 1787313092,
        "operating": 1.109975814819336
    }
}

Проверьте результат в Битрикс24: в разделе CRM > Клиенты > Компании появится новая компания.

Продолжите изучение