Часто в процессе разработки на платформе 1С:Предприятие возникает задача узнать размер файла, расположенного на удаленном веб-сервере. Если файл имеет большой объем, его полная загрузка в память или во временное хранилище может привести к существенным задержкам и нерациональному использованию ресурсов системы. Разберем, как решить эту задачу эффективно, используя стандартные механизмы платформы.
Для решения поставленной задачи мы воспользуемся возможностями HTTP-протокола, а именно — методом HEAD. В отличие от привычного метода GET, который запрашивает весь контент ресурса, метод HEAD просит сервер прислать только заголовки ответа. Эти заголовки содержат метаинформацию о файле, включая его тип (Content-Type) и, что для нас особенно важно, его размер в байтах (Content-Length).
В платформе 1С:Предприятие 8.3 для работы с интернет-ресурсами используется объект HTTPСоединение. Ранее многие разработчики ошибочно использовали метод Получить(), который скачивает все тело файла. Чтобы получить только заголовки, необходимо воспользоваться методом ПолучитьЗаголовки().
Давайте рассмотрим, как правильно организовать такой запрос по шагам:
HTTPСоединение, указав адрес сервера и, при необходимости, параметры защищенного соединения (если работа ведется по протоколу HTTPS).HTTPЗапрос, передав в него путь к интересующему нас файлу на сервере.ПолучитьЗаголовки() у нашего объекта соединения, передавая в него созданный запрос.Заголовки полученного объекта HTTPОтвет.Посмотрим на конкретный пример реализации данной логики в модуле 1С:
// Инициализируем соединение
// Используем защищенное соединение для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("example.com", 443, , , , , ЗащищенноеСоединение);
// Формируем запрос к конкретному ресурсу
ПутьКФайлу = "/files/manual.pdf";
Запрос = Новый HTTPЗапрос(ПутьКФайлу);
// Получаем заголовки ответа, не скачивая сам файл
Ответ = Соединение.ПолучитьЗаголовки(Запрос);
// Проверяем, что запрос прошел успешно (код 200)
Если Ответ.КодСостояния = 200 Тогда
// Получаем значение заголовка Content-Length
РазмерСтрокой = Ответ.Заголовки["Content-Length"];
Если ЗначениеЗаполнено(РазмерСтрокой) Тогда
РазмерВБайтах = Число(РазмерСтрокой);
Сообщить("Размер файла составляет: " + Формат(РазмерВБайтах, "ЧГ=0") + " байт.");
Иначе
Сообщить("Сервер не передал информацию о размере файла.");
КонецЕсли;
Иначе
Сообщить("Ошибка доступа к файлу. Код состояния: " + Ответ.КодСостояния);
КонецЕсли;
При работе с данным методом необходимо учитывать несколько факторов, которые могут повлиять на корректность результата:
Content-Length.КодСостояния. Если оно равно 404, значит, файл по указанному пути отсутствует. Если код равен 200 — значит, метаданные получены успешно.HTTPСоединение, иначе вы получите ошибку доступа (обычно 401 или 403).Location и повторить запрос по новому адресу.Используя этот подход, вы сможете значительно оптимизировать работу вашей конфигурации, избегая лишнего сетевого трафика и экономя оперативную память сервера 1С.