Разработка и Конфигурация · 10 мин
Как получить размер файла в 1С
Как получить размер файла в 1С: объект Файл, Размер(), НайтиФайлы, работа с двоичными данными и хранилищем. Примеры кода, ошибки, проверка результата.
Задача получить размер файла в 1С возникает при загрузке вложений, контроле объёма выгрузок, проверке присоединённых файлов и обмене данными. Встроенный язык платформы даёт несколько способов: объект Файл, метод НайтиФайлы(), работа с ДвоичныеДанные и прямой запрос к файловой системе через скрипты ОС. Выбор зависит от того, где лежит файл — на диске, во временном хранилище или в базе данных.
Главный нюанс: размер файла на диске и размер данных в памяти 1С могут отличаться из-за кодировки, сжатия или представления в Base64. Поэтому важно понимать, какой именно размер нужен — физический объём файла, объём двоичных данных после чтения или объём значения, хранящегося в реквизите справочника.
Ниже разобраны рабочие методы с готовыми фрагментами кода, ограничения каждого подхода, типичные ошибки и способы проверить, что размер получен корректно.
Получение размера файла через объект «Файл»
Самый прямой способ — создать объект Файл, указав полный путь, и прочитать свойство Размер(). Это метод, а не свойство-значение, поэтому скобки обязательны. Перед обращением к размеру рекомендуется проверить существование файла, иначе метод вернёт ошибку или некорректное значение.
ФайлНаДиске = Новый Файл("C:\Обмен\выгрузка.xml");
Если ФайлНаДиске.Существует() Тогда
РазмерВБайтах = ФайлНаДиске.Размер();
Сообщить("Размер файла: " + РазмерВБайтах + " байт");
Иначе
Сообщить("Файл не найден");
КонецЕсли;
Метод возвращает размер в байтах как число. Для каталога метод Размер() применять нельзя — объект Файл описывает и каталоги, но размер у каталога в этом контексте не определён. Если нужно суммарное значение по папке, перебирайте вложенные файлы через НайтиФайлы().
Учитывайте режим исполнения: на тонком клиенте код обращается к диску клиентской машины, на сервере — к диску сервера 1С. Путь, доступный разработчику локально, на сервере может не существовать. Для серверных процедур используйте каталоги, доступные учётной записи агента сервера 1С.
Размер файла через НайтиФайлы() и перебор каталога
Когда файл ищется по маске или нужно обработать несколько файлов, удобнее метод НайтиФайлы(). Он возвращает массив объектов Файл, у каждого из которых доступен тот же метод Размер(). Так можно одновременно получить имена, размеры и отфильтровать лишнее.
Найденные = НайтиФайлы("D:\Архив\", "*.zip", Истина);
ОбщийРазмер = 0;
Для Каждого ТекФайл Из Найденные Цикл
Если ТекФайл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ОбщийРазмер = ОбщийРазмер + ТекФайл.Размер();
КонецЦикла;
Сообщить("Суммарный размер: " + ОбщийРазмер + " байт");
Третий параметр Истина включает поиск во вложенных подкаталогах. Без него обрабатывается только указанная папка. Проверка ЭтоКаталог() защищает от попытки получить размер папки при рекурсивном обходе.
На больших каталогах с тысячами файлов перебор занимает заметное время. Если нужен только суммарный объём, а не список, для серверной части иногда быстрее выполнить команду ОС через ЗапуститьПриложение(), но это требует прав и усложняет поддержку кроссплатформенности.
- 1Вызовите НайтиФайлы() с путём и маской
- 2Проверьте, что массив не пуст
- 3Отфильтруйте каталоги через ЭтоКаталог()
- 4Просуммируйте Размер() по оставшимся файлам
- 5Проверьте итог, сравнив со свойствами папки в проводнике
Размер двоичных данных и файла во временном хранилище
Когда файл уже помещён во временное хранилище (например, после интерактивного выбора через НачатьПомещениеФайла()), путь к нему на диске может быть недоступен. В этом случае получают двоичные данные по адресу хранилища и вызывают их метод Размер():
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
РазмерФайла = ДвоичныеДанные.Размер();
КонецЕсли;
Размер двоичных данных совпадает с размером исходного файла, если данные помещены без промежуточных преобразований. Если файл был сериализован, сжат или закодирован в Base64, значения разойдутся: Base64 увеличивает объём примерно на треть. Для контроля целостности передачи сравнивайте именно размер двоичных данных на отправляющей и принимающей стороне.
Метод Размер() у двоичных данных не обращается к диску и работает быстро даже для крупных объектов, поскольку размер уже известен объекту. Это предпочтительный способ внутри обменов и веб-сервисов.
ДД = ПолучитьИзВременногоХранилища(Адрес);
РазмерКБ = Окр(ДД.Размер() / 1024, 2);
Сообщить("Размер: " + РазмерКБ + " КБ");Размер присоединённого файла в базе данных
В типовых конфигурациях на БСП файлы хранятся через подсистему «Присоединенные файлы». Сам файл лежит в информационной базе или в томах на диске, а его размер доступен в реквизите Размер справочника присоединённых файлов (например, НоменклатураПрисоединенныеФайлы). Запрос к реквизиту — самый быстрый способ, он не требует чтения самих данных.
Запрос = Новый Запрос(
"ВЫБРАТЬ Файлы.Размер КАК Размер
|ИЗ Справочник.НоменклатураПрисоединенныеФайлы КАК Файлы
|ГДЕ Файлы.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ФайлСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
РазмерФайла = Выборка.Размер;
КонецЕсли;
Если конфигурация самописная и файл хранится в реквизите типа ХранилищеЗначения, размер узнают, извлекая значение и проверяя его тип: для двоичных данных — метод Размер(). Учтите, что извлечение из хранилища значения загружает весь объект в память, что для больших файлов накладно.
Сравнение вариантов
Файл на диске, известен путь. Не работает для данных в памяти и требует доступа к ФС.
Данные уже в памяти или хранилище. Быстро, но требует сначала получить сами данные.
Типовые конфигурации с БСП. Самый быстрый, но зависит от структуры конкретной конфигурации.
Форматирование размера для вывода пользователю
Байты неудобны для восприятия, поэтому значение обычно переводят в килобайты или мегабайты. Простая универсальная функция подбирает единицу измерения по величине числа:
Функция ПредставлениеРазмера(РазмерБайт)
Если РазмерБайт >= 1048576 Тогда
Возврат Окр(РазмерБайт / 1048576, 2) + " МБ";
ИначеЕсли РазмерБайт >= 1024 Тогда
Возврат Окр(РазмерБайт / 1024, 1) + " КБ";
Иначе
Возврат РазмерБайт + " байт";
КонецЕсли;
КонецФункции;
Помните о двух традициях счёта: 1 КБ = 1024 байта (двоичная) и 1 КБ = 1000 байт (десятичная, используется производителями дисков). Проводник Windows и большинство утилит показывают двоичные значения, поэтому для сверки с проводником делите на 1024.
Типичные ошибки и ограничения
Частая ошибка — обращение к Размер() без проверки существования файла. Если файл удалён или путь неверен, поведение зависит от режима: возможен вызов исключения или возврат нуля. Всегда проверяйте Существует() заранее.
Вторая типичная проблема — клиент-серверная путаница. Код в серверной процедуре не видит диск пользователя, а код на клиенте не видит диск сервера. Передавайте файл через временное хранилище, а не пытайтесь читать чужой путь.
Третья ошибка — сравнение размера после преобразований. Запись текста в другой кодировке, сжатие ZIP, кодирование Base64 меняют объём. Если контрольная сверка не сходится, проверьте, не было ли промежуточной обработки данных.
Проверка корректности полученного размера
Убедиться в правильности помогает сверка с независимым источником. Для файла на диске откройте свойства в проводнике и сравните значение в байтах. Для данных из хранилища запишите двоичные данные во временный файл методом Записать() и проверьте размер записанного файла — он должен совпасть с ДвоичныеДанные.Размер().
Дополнительный признак корректности — ненулевое значение для заведомо непустого файла. Нулевой размер у только что выгруженного отчёта почти всегда означает ошибку записи, а не пустой результат.
Как проверить результат
Размер в байтах совпадает со свойствами файла
Значение отличается или равно нулю
Размер записанного файла равен ДД.Размер()
Файл меньше — данные обрезаны при передаче
Размер больше нуля
Ноль при ожидаемом содержимом — ошибка выгрузки
Что важно запомнить
Для файла на диске используйте Файл.Размер() после проверки Существует(), для данных в памяти — ДвоичныеДанные.Размер(), в типовых конфигурациях — реквизит Размер справочника присоединённых файлов. Все методы возвращают байты; учитывайте контекст клиент/сервер и преобразования данных.
Частые вопросы
В каких единицах возвращается размер файла в 1С?
Все штатные методы — Файл.Размер() и ДвоичныеДанные.Размер() — возвращают размер в байтах как число. Для отображения пользователю значение переводят в килобайты или мегабайты делением на 1024 или 1048576.
Как получить размер файла, если известен только адрес во временном хранилище?
Получите значение функцией ПолучитьИзВременногоХранилища(), проверьте, что тип результата — ДвоичныеДанные, и вызовите метод Размер(). Обращаться к диску при этом не требуется.
Почему Файл.Размер() выдаёт ошибку, хотя файл открывается в проводнике?
Чаще всего код выполняется на сервере, а файл лежит на машине пользователя — сервер не видит клиентский диск. Также проверьте права учётной записи агента сервера 1С на каталог и корректность пути, включая сетевые пути.
Можно ли узнать размер каталога целиком?
Штатного метода для размера каталога нет. Используйте НайтиФайлы() с рекурсивным поиском, отфильтруйте элементы с ЭтоКаталог() и просуммируйте Размер() по всем файлам.
Размер файла после передачи через веб-сервис не совпадает с исходным. Почему?
Проверьте промежуточные преобразования: кодирование Base64 увеличивает объём примерно на треть, сжатие уменьшает, смена кодировки текста меняет число байт. Сравнивать нужно размеры двоичных данных до и после передачи без преобразований.
Как быстро получить размер присоединённого файла в типовой конфигурации?
Выполните запрос к реквизиту Размер соответствующего справочника присоединённых файлов. Это не требует чтения самих данных и работает быстро даже для больших файлов.