При разработке внешних обработок для интеграции 1С с внешними системами (например, Битрикс24) программисты часто сталкиваются с ошибкой «Несоответствие типов (параметр номер '1')». Эта ошибка может возникнуть в самый неожиданный момент, даже если на первый взгляд код кажется логичным. Давайте подробно разберем, почему это происходит, и научимся правильно настраивать обмен данными через HTTP.
Рассмотрим типичную ситуацию. Программист создает процедуру &НаСервере, в которой пытается инициализировать соединение и отправить запрос. Ошибка чаще всего возникает в следующей строке:
ЗапросHTTP = Новый HTTPЗапрос(HTTP, Заголовки);
Проанализируем, что здесь не так. В данном контексте переменная HTTP является объектом типа HTTPСоединение. Однако, согласно синтаксису платформы 1С:Предприятие 8.3, конструктор объекта HTTPЗапрос ожидает в качестве первого параметра строку, представляющую собой адрес ресурса на сервере (например, путь к методу API), а не сам объект соединения. Именно из-за передачи объекта вместо строки платформа выбрасывает исключение «Несоответствие типов».
Второй важный момент — правильное создание объекта HTTPСоединение. Часто разработчики допускают ошибку, указывая в адресе сервера протокол (http:// или https://) или полный путь к методу. Выясним, как делать правильно.
В конструкторе HTTPСоединение(Сервер, Порт, ...) первым параметром должен выступать только хост (имя сервера или его IP-адрес). Посмотрим на типичный пример ошибки и его исправление:
Неправильно:
АдресПортала = "https://my-bitrix.bitrix24.ru/rest/1/webhook/";
HTTP = Новый HTTPСоединение(АдресПортала, 443);
Правильно:
АдресСервера = "my-bitrix.bitrix24.ru"; // Только хост!
HTTP = Новый HTTPСоединение(АдресСервера, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Обратите внимание: если вы работаете с защищенным протоколом (HTTPS), что является обязательным для Битрикс24, необходимо обязательно передавать объект ЗащищенноеСоединениеOpenSSL в соответствующий параметр конструктора. Без этого 1С попытается установить обычное незащищенное соединение, которое будет отклонено сервером.
Теперь соберем все воедино и разберем по шагам, как должен выглядеть корректный код для выгрузки данных в Битрикс24 из модуля формы внешней обработки:
Новый ЗащищенноеСоединениеOpenSSL() для работы по HTTPS.Рассмотрим итоговый пример кода, который исключает возникновение ошибки «Несоответствие типов»:
&НаСервере
Процедура ОтправитьДанныеВБитрикс24()
// 1. Подготовка адресов
Сервер = "your-domain.bitrix24.ru";
Ресурс = "/rest/1/webhook_key/crm.item.add/";
// 2. Настройка заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
// 3. Создание соединения
Попытка
// Используем 443 порт и защищенное соединение для Битрикс24
Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);
Исключение
ТекстОшибки = ОписаниеОшибки();
Возврат;
КонецПопытки;
// 4. Создание запроса (ПЕРВЫЙ ПАРАМЕТР - СТРОКА РЕСУРСА)
ЗапросHTTP = Новый HTTPЗапрос(Ресурс, Заголовки);
// 5. Подготовка тела запроса
ДанныеJSON = "{""fields"": {""TITLE"": ""Тестовая заявка""}}";
ЗапросHTTP.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
ЗапросHTTP.Метод = "POST";
// 6. Отправка и получение ответа
Попытка
ОтветHTTP = HTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Сообщить("Данные успешно отправлены!");
Иначе
Сообщить("Ошибка сервера: " + ОтветHTTP.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Выясним, на что еще стоит обратить внимание, если вы работаете в конфигурации «Бухгалтерия предприятия 3.0» или любой другой на базе БСП:
Попытка...Исключение при создании соединения. Если соединение не создастся (например, из-за сетевых проблем), переменная HTTP может принять значение Неопределено, что приведет к ошибке в последующем коде.UTF-8 без метки BOM, иначе сервер может не распознать JSON-структуру.Таким образом, внимательное отношение к типам параметров в конструкторах 1С и понимание разницы между объектом соединения и строкой адреса ресурса позволяют избежать досадных ошибок и настроить стабильную интеграцию.