Как определить размер файла по HTTP или HTTPS без его скачивания в 1С:Предприятии?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки на платформе 1С:Предприятие возникает задача узнать размер файла, расположенного на удаленном веб-сервере. Если файл имеет большой объем, его полная загрузка в память или во временное хранилище может привести к существенным задержкам и нерациональному использованию ресурсов системы. Разберем, как решить эту задачу эффективно, используя стандартные механизмы платформы.

Принцип работы протокола HTTP и метод HEAD

Для решения поставленной задачи мы воспользуемся возможностями HTTP-протокола, а именно — методом HEAD. В отличие от привычного метода GET, который запрашивает весь контент ресурса, метод HEAD просит сервер прислать только заголовки ответа. Эти заголовки содержат метаинформацию о файле, включая его тип (Content-Type) и, что для нас особенно важно, его размер в байтах (Content-Length).

Реализация с помощью объекта HTTPСоединение

В платформе 1С:Предприятие 8.3 для работы с интернет-ресурсами используется объект HTTPСоединение. Ранее многие разработчики ошибочно использовали метод Получить(), который скачивает все тело файла. Чтобы получить только заголовки, необходимо воспользоваться методом ПолучитьЗаголовки().

Давайте рассмотрим, как правильно организовать такой запрос по шагам:

  1. Инициализируем объект HTTPСоединение, указав адрес сервера и, при необходимости, параметры защищенного соединения (если работа ведется по протоколу HTTPS).
  2. Создаем объект HTTPЗапрос, передав в него путь к интересующему нас файлу на сервере.
  3. Выполняем метод ПолучитьЗаголовки() у нашего объекта соединения, передавая в него созданный запрос.
  4. Анализируем свойство Заголовки полученного объекта HTTPОтвет.

Пример программного кода

Посмотрим на конкретный пример реализации данной логики в модуле 1С:


// Инициализируем соединение
// Используем защищенное соединение для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("example.com", 443, , , , , ЗащищенноеСоединение);

// Формируем запрос к конкретному ресурсу
ПутьКФайлу = "/files/manual.pdf";
Запрос = Новый HTTPЗапрос(ПутьКФайлу);

// Получаем заголовки ответа, не скачивая сам файл
Ответ = Соединение.ПолучитьЗаголовки(Запрос);

// Проверяем, что запрос прошел успешно (код 200)
Если Ответ.КодСостояния = 200 Тогда
    // Получаем значение заголовка Content-Length
    РазмерСтрокой = Ответ.Заголовки["Content-Length"];
    
    Если ЗначениеЗаполнено(РазмерСтрокой) Тогда
        РазмерВБайтах = Число(РазмерСтрокой);
        Сообщить("Размер файла составляет: " + Формат(РазмерВБайтах, "ЧГ=0") + " байт.");
    Иначе
        Сообщить("Сервер не передал информацию о размере файла.");
    КонецЕсли;
Иначе
    Сообщить("Ошибка доступа к файлу. Код состояния: " + Ответ.КодСостояния);
КонецЕсли;

Важные технические нюансы

При работе с данным методом необходимо учитывать несколько факторов, которые могут повлиять на корректность результата:

Используя этот подход, вы сможете значительно оптимизировать работу вашей конфигурации, избегая лишнего сетевого трафика и экономя оперативную память сервера 1С.

← На главную