При попытке выполнить GET-запрос к внешнему веб-серверу через 1С разработчики иногда сталкиваются с ситуацией, когда код выдает ошибку: «Не могу установить соединение». При этом ссылка прекрасно открывается через обычный браузер на том же рабочем месте. Разберем основные причины такого поведения и способы их устранения.
Рассмотрим стандартный пример получения файла или картинки по протоколу HTTP средствами платформы 1С:
Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 80);
// Формируем GET-запрос к конкретному ресурсу
Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/stock-photo-summer-holidays-background-sea-background-270790184.jpg");
// Отправляем запрос
Результат = Соединение.Получить(Запрос);
// Сохраняем полученные двоичные данные в файл
ДвоичныеДанные = Результат.ПолучитьТелоКакДвоичныеДанные();
ДвоичныеДанные.Записать("C:\TEMP\image.jpg");
В нормальных условиях этот код корректно возвращает ответ сервера. Если же на строчке с методом Получить() возникает сбой соединения, проанализируем возможные блокирующие факторы.
Самая распространенная причина, почему браузер работает, а 1С — нет, заключается в разнице сетевых контекстов:
HTTPСоединение параметры прокси необходимо передавать явно через объект ЗащищенноеСоединениеOpenSSL или специализированные параметры конструктора HTTPПрокси.USR1CV8). У этого пользователя могут отсутствовать права на выход в интернет через брандмауэр или корпоративный прокси. Выяснить это можно, проверив настройки прокси под соответствующей учетной записью или прописав их системно в файле конфигурации inetcfg.xml.1cv8.exe или 1cv8s.exe, пропуская при этом трафик браузера.Многие современные сторонние сервисы автоматически отклоняют или перенаправляют незащищенные HTTP-запросы (порт 80) на HTTPS (порт 443). Если веб-сервер требует защищенного протокола, инициализацию соединения следует изменить:
// Создаем объект защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Подключаемся по порту 443 с использованием защищенного соединения
Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 443, , , , , ЗащищенноеСоединение);
Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/stock-photo-summer-holidays-background-sea-background-270790184.jpg");
Результат = Соединение.Получить(Запрос);
Некоторые веб-серверы и сети доставки контента (CDN) блокируют запросы, если в заголовке User-Agent указана идентификация 1С. Чтобы сервер воспринимал запрос как стандартный браузерный, подставим соответствующий заголовок в HTTPЗапрос:
Запрос = Новый HTTPЗапрос("/path/to/resource");
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36");
Если настройки сети проверены, HTTPS настроен, но соединение по-прежнему сбрасывается, причина может заключаться в некорректной работе сетевого стека конкретного релиза платформы 1С. В разных версиях платформы используются разборки библиотек OpenSSL и систем взаимодействия с сетью. На практике встречаются ситуативные ошибки платформы, при которых один и тот же сетевой код не работает на определенных технологических релизах (например, 8.3.10.2561), но стабильно функционирует на соседних версиях (например, 8.3.9.2033 или более свежих сборках 8.3.2x).
В случае неподтверждаемых сетевых ошибок рекомендуется протестировать выполнение кода на альтернативном релизе платформы или обновить её до актуального технологического дистрибутива.