К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить размер файла в 1С

Как получить размер файла в 1С: объект Файл, Размер(), НайтиФайлы, работа с двоичными данными и хранилищем. Примеры кода, ошибки, проверка результата.

Задача получить размер файла в 1С возникает при загрузке вложений, контроле объёма выгрузок, проверке присоединённых файлов и обмене данными. Встроенный язык платформы даёт несколько способов: объект Файл, метод НайтиФайлы(), работа с ДвоичныеДанные и прямой запрос к файловой системе через скрипты ОС. Выбор зависит от того, где лежит файл — на диске, во временном хранилище или в базе данных.

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

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

Получение размера файла через объект «Файл»

Самый прямой способ — создать объект Файл, указав полный путь, и прочитать свойство Размер(). Это метод, а не свойство-значение, поэтому скобки обязательны. Перед обращением к размеру рекомендуется проверить существование файла, иначе метод вернёт ошибку или некорректное значение.

ФайлНаДиске = Новый Файл("C:\Обмен\выгрузка.xml");

Если ФайлНаДиске.Существует() Тогда

РазмерВБайтах = ФайлНаДиске.Размер();

Сообщить("Размер файла: " + РазмерВБайтах + " байт");

Иначе

Сообщить("Файл не найден");

КонецЕсли;

Метод возвращает размер в байтах как число. Для каталога метод Размер() применять нельзя — объект Файл описывает и каталоги, но размер у каталога в этом контексте не определён. Если нужно суммарное значение по папке, перебирайте вложенные файлы через НайтиФайлы().

Учитывайте режим исполнения: на тонком клиенте код обращается к диску клиентской машины, на сервере — к диску сервера 1С. Путь, доступный разработчику локально, на сервере может не существовать. Для серверных процедур используйте каталоги, доступные учётной записи агента сервера 1С.

Размер файла через НайтиФайлы() и перебор каталога

Когда файл ищется по маске или нужно обработать несколько файлов, удобнее метод НайтиФайлы(). Он возвращает массив объектов Файл, у каждого из которых доступен тот же метод Размер(). Так можно одновременно получить имена, размеры и отфильтровать лишнее.

Найденные = НайтиФайлы("D:\Архив\", "*.zip", Истина);

ОбщийРазмер = 0;

Для Каждого ТекФайл Из Найденные Цикл

Если ТекФайл.ЭтоКаталог() Тогда

Продолжить;

КонецЕсли;

ОбщийРазмер = ОбщийРазмер + ТекФайл.Размер();

КонецЦикла;

Сообщить("Суммарный размер: " + ОбщийРазмер + " байт");

Третий параметр Истина включает поиск во вложенных подкаталогах. Без него обрабатывается только указанная папка. Проверка ЭтоКаталог() защищает от попытки получить размер папки при рекурсивном обходе.

На больших каталогах с тысячами файлов перебор занимает заметное время. Если нужен только суммарный объём, а не список, для серверной части иногда быстрее выполнить команду ОС через ЗапуститьПриложение(), но это требует прав и усложняет поддержку кроссплатформенности.

Порядок действий для каталога
  1. 1
    Вызовите НайтиФайлы() с путём и маской
  2. 2
    Проверьте, что массив не пуст
  3. 3
    Отфильтруйте каталоги через ЭтоКаталог()
  4. 4
    Просуммируйте Размер() по оставшимся файлам
  5. 5
    Проверьте итог, сравнив со свойствами папки в проводнике

Размер двоичных данных и файла во временном хранилище

Когда файл уже помещён во временное хранилище (например, после интерактивного выбора через НачатьПомещениеФайла()), путь к нему на диске может быть недоступен. В этом случае получают двоичные данные по адресу хранилища и вызывают их метод Размер():

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);

Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда

РазмерФайла = ДвоичныеДанные.Размер();

КонецЕсли;

Размер двоичных данных совпадает с размером исходного файла, если данные помещены без промежуточных преобразований. Если файл был сериализован, сжат или закодирован в Base64, значения разойдутся: Base64 увеличивает объём примерно на треть. Для контроля целостности передачи сравнивайте именно размер двоичных данных на отправляющей и принимающей стороне.

Метод Размер() у двоичных данных не обращается к диску и работает быстро даже для крупных объектов, поскольку размер уже известен объекту. Это предпочтительный способ внутри обменов и веб-сервисов.

bsl
ДД = ПолучитьИзВременногоХранилища(Адрес);
РазмерКБ = Окр(ДД.Размер() / 1024, 2);
Сообщить("Размер: " + РазмерКБ + " КБ");

Размер присоединённого файла в базе данных

В типовых конфигурациях на БСП файлы хранятся через подсистему «Присоединенные файлы». Сам файл лежит в информационной базе или в томах на диске, а его размер доступен в реквизите Размер справочника присоединённых файлов (например, НоменклатураПрисоединенныеФайлы). Запрос к реквизиту — самый быстрый способ, он не требует чтения самих данных.

Запрос = Новый Запрос(

"ВЫБРАТЬ Файлы.Размер КАК Размер

|ИЗ Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы

|ГДЕ Файлы.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", ФайлСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

РазмерФайла = Выборка.Размер;

КонецЕсли;

Если конфигурация самописная и файл хранится в реквизите типа ХранилищеЗначения, размер узнают, извлекая значение и проверяя его тип: для двоичных данных — метод Размер(). Учтите, что извлечение из хранилища значения загружает весь объект в память, что для больших файлов накладно.

Сравнение вариантов

Файл.Размер()

Файл на диске, известен путь. Не работает для данных в памяти и требует доступа к ФС.

ДвоичныеДанные.Размер()

Данные уже в памяти или хранилище. Быстро, но требует сначала получить сами данные.

Реквизит справочника файлов

Типовые конфигурации с БСП. Самый быстрый, но зависит от структуры конкретной конфигурации.

Форматирование размера для вывода пользователю

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

Функция ПредставлениеРазмера(РазмерБайт)

Если РазмерБайт >= 1048576 Тогда

Возврат Окр(РазмерБайт / 1048576, 2) + " МБ";

ИначеЕсли РазмерБайт >= 1024 Тогда

Возврат Окр(РазмерБайт / 1024, 1) + " КБ";

Иначе

Возврат РазмерБайт + " байт";

КонецЕсли;

КонецФункции;

Помните о двух традициях счёта: 1 КБ = 1024 байта (двоичная) и 1 КБ = 1000 байт (десятичная, используется производителями дисков). Проводник Windows и большинство утилит показывают двоичные значения, поэтому для сверки с проводником делите на 1024.

Типичные ошибки и ограничения

Частая ошибка — обращение к Размер() без проверки существования файла. Если файл удалён или путь неверен, поведение зависит от режима: возможен вызов исключения или возврат нуля. Всегда проверяйте Существует() заранее.

Вторая типичная проблема — клиент-серверная путаница. Код в серверной процедуре не видит диск пользователя, а код на клиенте не видит диск сервера. Передавайте файл через временное хранилище, а не пытайтесь читать чужой путь.

Третья ошибка — сравнение размера после преобразований. Запись текста в другой кодировке, сжатие ZIP, кодирование Base64 меняют объём. Если контрольная сверка не сходится, проверьте, не было ли промежуточной обработки данных.

Типичные ошибки
01
Вызов Размер() без проверки Существует() — исключение при отсутствующем файле
02
Чтение пути клиента в серверной процедуре — файл не найден, хотя он есть у пользователя
03
Ожидание размера каталога от Файл.Размер() — метод предназначен только для файлов
04
Сравнение размера после Base64 с исходным — значения различаются примерно на треть

Проверка корректности полученного размера

Убедиться в правильности помогает сверка с независимым источником. Для файла на диске откройте свойства в проводнике и сравните значение в байтах. Для данных из хранилища запишите двоичные данные во временный файл методом Записать() и проверьте размер записанного файла — он должен совпасть с ДвоичныеДанные.Размер().

Дополнительный признак корректности — ненулевое значение для заведомо непустого файла. Нулевой размер у только что выгруженного отчёта почти всегда означает ошибку записи, а не пустой результат.

Контрольные точки

Как проверить результат

Сверка с проводником
Норма

Размер в байтах совпадает со свойствами файла

Тревожный признак

Значение отличается или равно нулю

Запись ДвоичныеДанные во временный файл
Норма

Размер записанного файла равен ДД.Размер()

Тревожный признак

Файл меньше — данные обрезаны при передаче

Непустой файл
Норма

Размер больше нуля

Тревожный признак

Ноль при ожидаемом содержимом — ошибка выгрузки

Итог

Что важно запомнить

Для файла на диске используйте Файл.Размер() после проверки Существует(), для данных в памяти — ДвоичныеДанные.Размер(), в типовых конфигурациях — реквизит Размер справочника присоединённых файлов. Все методы возвращают байты; учитывайте контекст клиент/сервер и преобразования данных.

Частые вопросы

В каких единицах возвращается размер файла в 1С?

Все штатные методы — Файл.Размер() и ДвоичныеДанные.Размер() — возвращают размер в байтах как число. Для отображения пользователю значение переводят в килобайты или мегабайты делением на 1024 или 1048576.

Как получить размер файла, если известен только адрес во временном хранилище?

Получите значение функцией ПолучитьИзВременногоХранилища(), проверьте, что тип результата — ДвоичныеДанные, и вызовите метод Размер(). Обращаться к диску при этом не требуется.

Почему Файл.Размер() выдаёт ошибку, хотя файл открывается в проводнике?

Чаще всего код выполняется на сервере, а файл лежит на машине пользователя — сервер не видит клиентский диск. Также проверьте права учётной записи агента сервера 1С на каталог и корректность пути, включая сетевые пути.

Можно ли узнать размер каталога целиком?

Штатного метода для размера каталога нет. Используйте НайтиФайлы() с рекурсивным поиском, отфильтруйте элементы с ЭтоКаталог() и просуммируйте Размер() по всем файлам.

Размер файла после передачи через веб-сервис не совпадает с исходным. Почему?

Проверьте промежуточные преобразования: кодирование Base64 увеличивает объём примерно на треть, сжатие уменьшает, смена кодировки текста меняет число байт. Сравнивать нужно размеры двоичных данных до и после передачи без преобразований.

Как быстро получить размер присоединённого файла в типовой конфигурации?

Выполните запрос к реквизиту Размер соответствующего справочника присоединённых файлов. Это не требует чтения самих данных и работает быстро даже для больших файлов.