При разработке механизмов автоматического обновления или интеграции с внешними сайтами программисты 1С часто сталкиваются с ситуацией, когда файл, скачиваемый через HTTPСоединение, оказывается поврежденным или имеет подозрительно маленький размер (например, несколько сотен байт вместо нескольких мегабайт). При этом сама платформа не выдает никаких ошибок в процессе выполнения кода. Рассмотрим подробнее, почему это происходит и как правильно организовать скачивание файлов.
Первым делом проанализируем ситуацию, когда файл «скачался», но не открывается. Если размер файла составляет около 200–300 байт, скорее всего, вместо целевых данных (например, внешней обработки .epf или архива) вы получили текстовый ответ от веб-сервера. Разберем по шагам, как это проверить:
302 Found или Document moved here, значит, ваш запрос был перенаправлен сервером.Важный технический момент: объект HTTPСоединение в 1С:Предприятие не является «умным» браузером. В отличие от Chrome или Firefox, он не умеет автоматически переходить по ссылкам перенаправления (коды состояния 301 и 302). Когда сервер отправляет редирект, 1С добросовестно записывает тело этого ответа (информационную страницу о переезде) в ваш файл.
Выясним, почему проблема может проявляться нестабильно: «то работает, то нет». Современные веб-серверы часто настраиваются на принудительное использование защищенного протокола. Рассмотрим типичный сценарий:
Вы обращаетесь к серверу по протоколу http://. Сервер видит запрос и, согласно своим правилам безопасности, отправляет ответ с кодом 302, указывая в заголовках новый адрес с использованием https://. Если в вашем коде 1С не предусмотрена работа с защищенным соединением (SSL), выполнение на этом прервется, и вы получите тот самый «маленький файл».
Проанализируем программный способ решения, предложенный в обсуждении. Суть заключается в том, чтобы заранее определить, какой протокол используется в ссылке, и в зависимости от этого инициализировать объект HTTPСоединение с использованием ЗащищенноеСоединениеOpenSSL или без него.
Рассмотрим пример кода, который позволяет избежать ошибок при работе с разными типами протоколов:
// Определяем параметры подключения
Домен = "yyy.yy";
АдресПути = "/myfile/myfile.txt";
ИмяФайлаНаДиске = "d:\myfile.txt";
// Переменная для хранения типа соединения
ИспользоватьSSL = Ложь;
Если СтрНайти(НРег(ПолныйАдрес), "https://") > 0 Тогда
ИспользоватьSSL = Истина;
КонецЕсли;
// Создаем соединение с учетом SSL
Если ИспользоватьSSL Тогда
Соединение = Новый HTTPСоединение(Домен, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
Иначе
Соединение = Новый HTTPСоединение(Домен);
КонецЕсли;
Запрос = Новый HTTPЗапрос(АдресПути);
Результат = Соединение.Получить(Запрос);
// Проверяем код состояния
Если Результат.КодСостояния = 200 Тогда
Результат.ПолучитьТелоКакДвоичныеДанные().Записать(ИмяФайлаНаДиске);
ИначеЕсли Результат.КодСостояния = 302 ИЛИ Результат.КодСостояния = 301 Тогда
Сообщить("Обнаружено перенаправление. Требуется обработка заголовка Location.");
КонецЕсли;
Чтобы сделать ваш скрипт по-настоящему универсальным, разберем, как программно следовать за перенаправлением. Если сервер вернул код 302, адрес нового местоположения файла всегда находится в заголовке ответа Location.
Посмотрим на алгоритм действий:
Location.В исходном примере используется конструкция Результат.ПолучитьТелоКакДвоичныеДанные().Записать(). Мы рекомендуем использовать более эффективный метод — запись напрямую в файл. Это особенно критично для внешних обработок и дистрибутивов, так как экономит оперативную память сервера или клиента.
Проанализируем правильный синтаксис метода Получить():
// Вместо загрузки в память:
// Результат = Соединение.Получить(Запрос);
// Результат.ПолучитьТелоКакДвоичныеДанные().Записать(Путь);
// Используйте прямую запись на диск:
Соединение.Получить(Запрос, ИмяФайлаНаДиске);
В этом случае платформа 1С будет записывать данные в файл порциями по мере их поступления из сети, что предотвращает падение системы при нехватке памяти.
Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), лучше не изобретать велосипед, а использовать готовый механизм. Модуль ПолучениеФайловИзИнтернета уже содержит в себе всю необходимую логику по обработке редиректов, настройке прокси-серверов и работе с SSL.
Подведем итоги: для стабильной работы загрузки всегда проверяйте код состояния (StatusCode). Если он отличается от 200, файл не будет содержать ожидаемых данных. Использование ЗащищенноеСоединениеOpenSSL() сегодня является стандартом де-факто, так как большинство ресурсов работает через HTTPS.