Разберем классическую проблему, с которой сталкиваются разработчики при переносе стандартного механизма обмена данными (например, по протоколу CommerceML) из типовых конфигураций 1С (таких как Комплексная автоматизация 2, ERP или Управление торговлей 11) в нетиповые или полностью самописные решения. Ситуация выглядит следующим образом: при выгрузке данных в файл и его ручной загрузке на сайт все проходит успешно, но при попытке запустить автоматический обмен непосредственно из 1С возникает ошибка "Ошибка работы с Интернет: ресурс не найден (404)".
В этой статье мы подробно проанализируем причины возникновения этой ошибки, разберем разницу между ключевыми параметрами HTTP-соединения в 1С, изучим правильную структуру кода и рассмотрим критические нюансы безопасности и настройки веб-серверов, без которых стабильный обмен невозможен.
Основная причина возникновения ошибки HTTP 404 при автоматическом обмене кроется в некорректном разделении параметров URL-адреса на этапе инициализации подключения и выполнения самого HTTP-запроса. Давайте проанализируем, как платформа 1С:Предприятие работает с веб-ресурсами через объект HTTPСоединение.
Для успешной отправки запроса к веб-серверу нам необходимо разделять адрес на две составляющие:
mysite.ru). Он передается исключительно в конструктор объекта HTTPСоединение в качестве первого параметра. В это поле категорически запрещено передавать префиксы протоколов (http:// или https://) и пути к файлам./bitrix/admin/1c_exchange.php или /api/import). Этот путь передается в методы Получить, ОтправитьДляОбработки или Записать.Если при переносе кода в самописную конфигурацию перепутать эти параметры и передать вместо относительного пути к скрипту базовый адрес сайта (или оставить это поле пустым), платформа 1С попытается обратиться к корню сайта. Веб-сервер не сможет сопоставить этот запрос с обработчиком обмена и вернет стандартную ошибку HTTP 404 (Запрашиваемый документ не найден).
Рассмотрим пример правильно написанной функции для установки HTTP-соединения, которая учитывает различные параметры (включая работу через прокси-сервер и защищенное SSL-соединение):
Функция HTTPУстановитьСоединение(СтруктураПараметровСайта) Экспорт
Соединение = НеОпределено;
ИнтернетПрокси = НеОпределено;
// Настройка прокси-сервера, если это необходимо
Если СтруктураПараметровСайта.ПроксиИспользование Тогда
ИнтернетПрокси = Новый ИнтернетПрокси;
ИнтернетПрокси.Пользователь = СтруктураПараметровСайта.ПроксиИмяПользователя;
ИнтернетПрокси.Пароль = СтруктураПараметровСайта.ПроксиПароль;
ПротоколПрокси = ?(СтруктураПараметровСайта.ЗащищенноеСоединение, "HTTPS", "HTTP");
Если СтруктураПараметровСайта.ПроксиПорт = 0 Тогда
ИнтернетПрокси.Установить(ПротоколПрокси, СтруктураПараметровСайта.ПроксиСервер);
Иначе
ИнтернетПрокси.Установить(ПротоколПрокси, СтруктураПараметровСайта.ПроксиСервер, СтруктураПараметровСайта.ПроксиПорт);
КонецЕсли;
КонецЕсли;
// Определение порта по умолчанию
Порт = ?(ЗначениеЗаполнено(СтруктураПараметровСайта.Порт),
СтруктураПараметровСайта.Порт,
?(СтруктураПараметровСайта.ЗащищенноеСоединение, 443, 80));
Попытка
Соединение = Новый HTTPСоединение(
СтруктураПараметровСайта.Сервер, // Передаем только хост (например, "mysite.ru")
Порт,
СтруктураПараметровСайта.ИмяПользователя,
СтруктураПараметровСайта.Пароль,
ИнтернетПрокси,
СтруктураПараметровСайта.ЗащищенноеСоединение
);
Исключение
ЗаписатьЛогОшибки("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
Соединение = НеОпределено;
КонецПопытки;
Возврат Соединение;
КонецФункции
Обратите внимание на параметр СтруктураПараметровСайта.Сервер. Здесь должен находиться чистый домен. Если в вашей самописке в это поле попадает строка вида "http://mysite.ru/bitrix/...", соединение либо выбросит исключение на этапе создания, либо отработает некорректно.
После успешной инициализации соединения нам необходимо отправить запрос на авторизацию или передачу файлов. Рассмотрим, как выглядит правильный вызов метода Получить:
Процедура ВыполнитьЗапросКСерверу(Соединение, СтруктураПараметровСайта)
ОтветСервера = Неопределено;
ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
// Формируем относительный путь запроса с параметрами
// Вместо АдресСайта мы должны использовать именно АдресСкрипта!
ПараметрыЗапроса = СтруктураПараметровСайта.АдресСкрипта + "?type=catalog&mode=checkauth";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "text/html, application/xhtml+xml, */*");
Попытка
Соединение.Получить(СокрЛП(ПараметрыЗапроса), ИмяФайлаОтвета, Заголовки);
// Обработка успешного ответа сервера
Исключение
СтрокаСообщенияПользователю = "Не удалось получить данные с сервера. Проверьте правильность адреса скрипта и параметры подключения."
+ Символы.ПС + ОписаниеОшибки();
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияПользователю);
КонецПопытки;
КонецПроцедуры
Решением проблемы в рассматриваемом случае стало именно исправление сопоставления полей конфигурации. При переносе кода в самописку разработчик ошибочно сопоставил параметр запроса с полем АдресСайта. Для исправления ситуации потребовалось принудительно переназначить значение в структуре параметров:
СтруктураПараметровСайта.Вставить("АдресСкрипта", СтруктураАдреса.HTTPАдресСкрипта);
Даже если вы правильно настроили разделение адреса на хост и скрипт, при работе в самописной конфигурации могут возникнуть другие неочевидные проблемы. Рассмотрим наиболее частые из них и разберем способы их устранения.
Если ваш сайт использует протокол HTTPS (порт 443), простого указания порта в параметрах HTTPСоединение недостаточно. Платформа 1С должна использовать специальный объект для валидации SSL-сертификатов.
Для решения этой проблемы при создании соединения необходимо передавать объект ЗащищенноеСоединениеOpenSSL:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(
СтруктураПараметровСайта.Сервер,
443,
СтруктураПараметровСайта.ИмяПользователя,
СтруктураПараметровСайта.Пароль,
ИнтернетПрокси,
ЗащищенноеСоединение
);
Если передать в параметре защищенного соединения значение Неопределено при обращении к HTTPS-ресурсу, операционная система может заблокировать запрос из соображений безопасности.
Часто на веб-серверах настраивают правила перенаправления (например, принудительный редирект с HTTP на HTTPS или добавление/удаление префикса www). Старые версии платформы 1С:Предприятие не умели автоматически следовать по редиректам, возвращая пустой результат или ошибку.
В современных версиях платформы 1С (начиная с 8.3.16) рекомендуется настраивать параметры соединения так, чтобы оно автоматически обрабатывало перенаправления веб-сервера. Если вы используете более ранние релизы платформы, вам придется вручную анализировать заголовки ответа (заголовок Location) и инициировать новое соединение по полученному адресу.
По умолчанию платформа 1С отправляет запросы со стандартным системным заголовком User-Agent (например, 1C+Enterprise/8.3). Системы защиты сайтов (такие как Cloudflare, DDoS-Guard или правила ModSecurity на хостинге) часто расценивают такие запросы как активность вредоносных ботов и мгновенно блокируют их, отдавая ошибку HTTP 403 (Forbidden) или даже HTTP 404.
Чтобы избежать подобных блокировок, принудительно подменяйте заголовок User-Agent в вашей самописной обработке обмена, маскируя запросы под обычный веб-браузер:
Заголовки = Новый Соответствие;
Заголовки.Вставить("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");
При ручном обмене файлы загружаются на сайт напрямую через административную панель CMS или FTP, где действуют другие лимиты. При автоматическом обмене файлы загружаются частями через POST-запросы к PHP-скрипту. Если размер выгружаемого zip-архива или XML-файла превышает лимиты веб-сервера, сервер вернет ошибку (например, 413 Payload Too Large или 404.13 в IIS).
Для исправления этой проблемы:
client_max_body_size.maxAllowedContentLength в файле конфигурации web.config.Если у вас возникли сложности при переносе обмена, выполните следующие действия по шагам:
Соединение.Получить().