Работа в веб-клиенте 1С:Предприятие накладывает ряд специфических ограничений, с которыми разработчики не сталкиваются в тонком или толстом клиенте. Одной из самых сложных задач является прямое взаимодействие с веб-сервисами (особенно локальными) непосредственно из кода, исполняемого в браузере. В этой статье мы подробно разберем, почему стандартные подходы могут не работать, и как правильно реализовать HTTPСоединение в веб-интерфейсе.
Часто разработчики сталкиваются с ситуацией: код, который идеально работает в тонком клиенте, в веб-клиенте просто «замирает» или выдает ошибку по таймауту. Проанализируем причины этого поведения. Главное отличие заключается в том, что веб-клиент исполняется внутри «песочницы» браузера. Это означает, что на него распространяются все политики безопасности современных браузеров, такие как CORS (Cross-Origin Resource Sharing) и запрет на блокирующие (синхронные) операции.
Первое и самое важное правило: в веб-клиенте 1С использование синхронных вызовов для работы с сетью запрещено на уровне архитектуры браузера. Если вы попытаетесь использовать стандартный метод ВызватьHTTPМетод, система либо выдаст ошибку, либо интерфейс полностью заблокируется. Рассмотрим, как должен выглядеть правильный асинхронный вызов.
Вместо привычных методов мы должны использовать их асинхронные аналоги, которые возвращают объект Обещание (Promise). Выясним, как это реализовать на практике:
&НаКлиенте
Асинхр Процедура ВыполнитьЗапросНаСервис()
Соединение = Новый HTTPСоединение("localhost", 8080);
Запрос = Новый HTTPЗапрос("/api/data");
Попытка
// Используем Асинхр версию метода
Ответ = Ждать Соединение.ВызватьHTTPМетодАсинхрон("GET", Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Данные получены: " + Ответ.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Ошибка сервиса: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка связи: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Обратите внимание на ключевые слова Асинхр перед определением процедуры и Ждать перед вызовом метода. Это позволяет платформе не блокировать поток интерфейса, пока ожидается ответ от сервера.
Даже если ваш код написан идеально, браузер может заблокировать запрос по соображениям безопасности. Проанализируем ситуацию: ваш веб-клиент запущен по адресу https://1c-server.company.com, а запрос вы отправляете на http://localhost:8080. Для браузера это попытка кражи данных с другого домена.
Чтобы это заработало, целевой сервис (тот, к которому вы обращаетесь) должен явно разрешить запросы с вашего домена. Это делается через HTTP-заголовки ответа. Сторонний сервис должен возвращать следующие заголовки:
* (для разрешения всем, что менее безопасно).Важный нюанс: Перед основным запросом браузер часто отправляет «предварительный» запрос методом OPTIONS (Preflight request). Если ваш локальный сервис не умеет отвечать на OPTIONS статус-кодом 200, основной запрос даже не начнется.
Рассмотрим ситуацию, когда информационная база 1С опубликована через HTTPS. В этом случае браузеры блокируют любые запросы к HTTP ресурсам. Если ваш локальный сервис работает по обычному http://, запрос будет мгновенно отклонен.
Для решения этой проблемы есть три пути:
Установка расширения — это не просто формальность. Для веб-клиента оно служит мостом между изолированным миром браузера и ресурсами локального компьютера. Выясним, как проверить наличие расширения и предложить его установку пользователю:
&НаКлиенте
Процедура ПроверитьВозможностьРаботы()
#Если ВебКлиент Тогда
НачатьПодключениеРасширенияРаботыФайлов(Новый ОписаниеОповещения("ПослеПодключения", ЭтаФорма));
#КонецЕсли
КонецПроцедуры
Хотя напрямую HTTPСоединение может работать и без него, наличие расширения повышает стабильность взаимодействия с локальными портами и ресурсами ОС.
Если настроить CORS на стороннем сервисе невозможно (например, это закрытое стороннее API), мы можем применить архитектурный маневр — проксирование. Посмотрим на логику процесса:
HTTPСоединение к внешнему ресурсу.Важно: Этот метод работает только для внешних интернет-ресурсов. Если сервис «локальный» (стоит на компьютере пользователя), сервер 1С до него не «дотянется». В этом случае остается только вариант с правильной настройкой CORS и использованием асинхронных методов.
Если запрос не проходит, отладчик 1С в веб-клиенте часто бывает малоинформативен. Выясним причину с помощью инструментов разработчика браузера:
CORS error или Blocked by Client однозначно укажет на проблемы с политиками безопасности, а не на ошибку в коде 1С.Подводя итог, можно сказать, что «красивое» решение в веб-клиенте требует комплексного подхода: обязательного использования Асинхр/Ждать, корректной настройки заголовков безопасности на целевом сервисе и учета протоколов шифрования (SSL).