В процессе разработки интеграций между различными информационными базами «1С:Предприятие» через HTTP-сервисы программисты часто сталкиваются с ситуацией, когда запрос из браузера отрабатывает корректно, а программный код возвращает ошибку 401 (Unauthorized) или пустое тело ответа. Рассмотрим подробнее, почему это происходит, разберем типичные ошибки новичков и выясним, как правильно настроить авторизацию и получение данных.
Проанализируем ситуацию: разработчик пытается подключиться ко второй базе, используя объект HTTPПрокси, передавая в него логин и пароль. Это одна из самых распространенных ошибок. Нужно четко понимать разницу между посредником (прокси) и конечным сервером.
Объект HTTPПрокси предназначен исключительно для случаев, когда ваш сервер не имеет прямого доступа к интернету или локальной сети и вынужден передавать трафик через специальный шлюз. Если вы указываете логин и пароль в объекте прокси, вы авторизуетесь именно на этом шлюзе. Конечный веб-сервер (где опубликована база 1С) об этой авторизации ничего не знает и закономерно возвращает код 401.
Рассмотрим, как правильно инициализировать HTTPСоединение для авторизации в базе-приемнике — для этих задач есть обмен данными между базами через HTTP. Данные пользователя должны передаваться непосредственно в конструктор соединения:
// Неправильно: использование прокси для авторизации в базе
Прокси = Новый HTTPПрокси;
Прокси.Пользователь = "Администратор";
Прокси.Пароль = "123";
Соединение = Новый HTTPСоединение("server.com", , , , Прокси);
// Правильно: передача учетных данных напрямую
Сервер = "192.168.1.10";
Порт = 80;
Логин = "RemoteUser";
Пароль = "StrongPassword";
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль);
Иногда после успешного прохождения авторизации (код 200) метод Получить() всё равно возвращает пустой результат. Вокруг GET-запросов существует миф, что они не могут содержать тело. Выясним причину: согласно спецификации протокола HTTP, GET-запрос может возвращать тело ответа, и в 1С это основной способ получения данных из сервиса.
Если тело пустое, проанализируем следующие факторы:
HTTPСервисОтвет. В методе обработчике (например, Поп_ДанныеGET) обязательно должны присутствовать строки типа Ответ.УстановитьТелоИзСтроки(ДанныеJSON).Заголовки полученного ответа. Если параметр Content-Length равен 0, значит, сервер действительно ничего не отправил.ЧтениеJSON, данные могут теряться или некорректно обрабатываться при попытке прочитать их как строку, если возникла ошибка внутри самого сервиса (при работе со сложными или сжатыми форматами обратите внимание на пример обработки сжатого в Zip http-ответа).Даже если код в 1С написан верно, ошибка 401 может быть вызвана настройками публикации базы. Посмотрим на важные аспекты настройки веб-серверов:
Для Microsoft IIS:
HTTPСоединение.Для Apache:
default.vrd. В нем должны быть корректно прописаны точки доступа к HTTP-сервисам и разрешен доступ для соответствующих пользователей.Не забудем про внутреннюю безопасность системы. У пользователя, под которым выполняется подключение, должны быть назначены соответствующие роли:
Если прав недостаточно, сервер может возвращать 401 (хотя чаще 403), что сбивает разработчика с толку, заставляя проверять пароль.
Если ваши серверы обмениваются данными через открытые сети, использование HTTPS становится обязательным. В этом случае конструктор соединения меняется. Разберем пример с использованием защищенного соединения:
// Создаем объект защищенного соединения
// Использование OpenSSL позволяет игнорировать проверку сертификатов, если они самоподписанные
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение(
"api.myserver.ru",
443,
"User",
"Pass",
,
60,
Защита
);
Важный момент: если сертификат на сервере-приемнике является самоподписанным (не выдан официальным центром сертификации), 1С может разорвать соединение без объяснения причин. В таких случаях использование ЗащищенноеСоединениеOpenSSL помогает обойти строгую проверку.
Чтобы понять, на какой стороне возникла проблема, выполним следующие шаги — в этом поможет пошаговая отладка кода 1С в режиме предприятия.
Шаг 1: Использование внешних утилит. Попробуйте отправить аналогичный запрос через Postman (или его удобный 1С-аналог Post1С) или Insomnia. Если запрос из сторонней утилиты возвращает данные, значит, проблема в параметрах объекта HTTPСоединение или HTTPЗапрос в коде 1С.
Шаг 2: Анализ Журнала регистрации. В базе-приемнике откройте Журнал регистрации. Ищите события, связанные с доступом к HTTP-сервису. Если там зафиксирована ошибка выполнения серверного кода, то проблема не в авторизации, а в логике формирования ответа.
Шаг 3: Замер производительности. Иногда сервис работает слишком долго. Если время выполнения превышает Таймаут, указанный в соединении, клиентская база получит ошибку или пустой результат. Попробуйте увеличить таймаут (по умолчанию он часто равен 30-60 секундам).
Рассмотрим итоговый пример правильного чтения данных из сервиса:
Сервер = "my-erp.local";
Ресурс = "/v1/exchange/get_data?param=all";
// Указываем логин/пароль прямо в соединении
Соединение = Новый HTTPСоединение(Сервер, , "ServiceUser", "Pass123");
Запрос = Новый HTTPЗапрос(Ресурс);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаРезультат = Ответ.ПолучитьТелоИзСтроки();
// Здесь выполняем десериализацию JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаРезультат);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Иначе
Сообщить("Ошибка запроса! Код: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Подведем итог: для успешного обмена данными между базами через HTTP-сервисы всегда указывайте авторизационные данные в HTTPСоединение, проверяйте настройки Basic-авторизации на веб-сервере и следите за тем, чтобы база-источник явно записывала данные в тело ответа.