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

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

Как в 1С узнать размер картинки: пиксели и вес файла

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

При работе с изображениями в 1С под «размером картинки» обычно понимают две разные вещи: геометрические размеры (ширину и высоту в пикселях) и вес файла в байтах или килобайтах. Встроенный язык платформы позволяет получить оба значения, но делается это разными способами и с разными ограничениями.

Геометрические размеры доступны через объект Картинка и его свойства Ширина() и Высота() — точнее, методы Ширина() и Высота(). Вес файла определяется через объект Файл и его метод Размер() либо через длину двоичных данных. Выбор подхода зависит от того, где хранится изображение: на диске, в хранилище значений базы или в реквизите формы.

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

Получение ширины и высоты картинки из файла

Если изображение лежит на диске, самый простой путь — создать объект Картинка из файла и прочитать его размеры. Платформа сама разберёт формат (JPEG, PNG, BMP, GIF и другие поддерживаемые) и вернёт ширину и высоту в пикселях.

КартинкаИзФайла = Новый Картинка("C:\Images\photo.jpg");

Ширина = КартинкаИзФайла.Ширина();

Высота = КартинкаИзФайла.Высота();

Сообщить("Размер: " + Ширина + "x" + Высота + " пикселей");

Если файл не существует, повреждён или имеет неподдерживаемый формат, конструктор выбросит исключение. Поэтому в прикладном коде вызов стоит оборачивать в попытку:

Попытка

КартинкаИзФайла = Новый Картинка(ПутьКФайлу);

Ширина = КартинкаИзФайла.Ширина();

Высота = КартинкаИзФайла.Высота();

Исключение

Сообщить("Не удалось прочитать картинку: " + ОписаниеОшибки());

КонецПопытки;

Обратите внимание: Ширина() и Высота() — это методы, а не свойства. Обращение без скобок (Картинка.Ширина) — частая причина ошибки «Значение не является значением объектного типа» или возврата не того, что ожидалось.

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

В типовых конфигурациях изображения чаще хранятся не файлами, а в реквизитах типа «Хранилище значения» — например, фото товара в справочнике номенклатуры. В этом случае сначала извлекают двоичные данные, а из них уже создают объект картинки.

ДвоичныеДанные = ТоварСсылка.ФотоТовара.Получить();

Если ДвоичныеДанные = Неопределено Тогда

Возврат; // картинки нет

КонецЕсли;

КартинкаОбъект = Новый Картинка(ДвоичныеДанные);

Ширина = КартинкаОбъект.Ширина();

Высота = КартинкаОбъект.Высота();

Вес такой картинки определяется ещё проще — методом Размер() у двоичных данных, без создания объекта картинки:

РазмерВБайтах = ДвоичныеДанные.Размер();

РазмерВКБ = Окр(РазмерВБайтах / 1024, 1);

Как узнать вес файла картинки на диске

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

ФайлКартинки = Новый Файл("C:\Images\photo.jpg");

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

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

КонецЕсли;

Для удобного отображения пользователю байты принято переводить в килобайты или мегабайты с округлением. Универсальная функция форматирования:

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

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

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

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

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

Иначе

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

КонецЕсли;

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

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

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

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

// Проверка веса — не более 5 МБ

Если ДвоичныеДанные.Размер() > 5 1024 1024 Тогда

Сообщить("Файл слишком большой, максимум 5 МБ");

Возврат;

КонецЕсли;

// Проверка разрешения — не меньше 300x300

КартинкаОбъект = Новый Картинка(ДвоичныеДанные);

Если КартинкаОбъект.Ширина() < 300 Или КартинкаОбъект.Высота() < 300 Тогда

Сообщить("Разрешение картинки меньше 300x300 пикселей");

Возврат;

КонецЕсли;

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

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

Типичные ошибки и их причины

Большинство проблем при получении размера картинки в 1С сводится к нескольким повторяющимся ситуациям. Зная их, диагностика занимает минуты.

Типичные ошибки
01
Обращение к Ширина без скобок — это метод, нужен вызов Ширина()
02
Создание Картинка из Неопределено — хранилище пустое, сначала проверьте результат Получить()
03
Чтение локального файла на сервере — сервер не видит диск клиента, передавайте данные через временное хранилище
04
Отсутствие Попытки/Исключения — повреждённый или неподдерживаемый файл роняет весь код
05
Путаница байт и килобайт — Размер() всегда возвращает байты, для сравнения с лимитом в МБ умножайте лимит на 1024*1024

Отдельно стоит упомянуть ситуацию, когда Ширина() и Высота() возвращают 0. Такое бывает для картинок, созданных программно без загрузки данных (пустая картинка), либо для некоторых векторных форматов, у которых нет фиксированного растрового размера. Нулевые значения — признак того, что размер объекту просто не задан.

Альтернативные способы и их границы

Если штатного объекта Картинка недостаточно — например, нужно получить DPI, цветовой профиль или обработать формат, который платформа не поддерживает, — применяют внешние средства: COM-объекты, внешние компоненты или вызов утилит командной строки на сервере. Это усложняет решение и привязывает его к операционной системе сервера.

Сравнение способов

Объект Картинка

Штатный способ для ширины и высоты. Работает везде, но поддерживает ограниченный набор форматов и не даёт метаданных вроде DPI

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

Самый быстрый способ узнать вес файла. Не даёт геометрических размеров

Объект Файл

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

Внешние утилиты и COM

Расширенные метаданные и редкие форматы. Требуют установки на сервер и зависят от ОС

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

Итог

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

Ширина и высота картинки в 1С — методы Ширина() и Высота() объекта Картинка, вес — Размер() у двоичных данных или объекта Файл. Картинку из хранилища значений создают через Новый Картинка(ДвоичныеДанные), обязательно с проверкой на Неопределено и обработкой исключений. На сервере нельзя читать локальные файлы клиента — используйте временное хранилище.

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

Почему Ширина() возвращает 0, хотя картинка открывается в программе просмотра?

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

Как узнать размер картинки в реквизите формы типа «Картинка»?

Реквизит формы с отображаемой картинкой обычно содержит адрес временного хранилища или сам объект. Если это адрес — получите данные через ПолучитьИзВременногоХранилища на сервере и дальше работайте стандартно: Новый Картинка(Данные) для пикселей, Данные.Размер() для веса.

Можно ли узнать размер картинки без загрузки её целиком в память?

Штатными средствами платформы — нет: объект Картинка создаётся из полного набора двоичных данных. Если это критично для очень больших файлов, сначала ограничьте вес через Размер() двоичных данных и отклоняйте слишком большие файлы до создания объекта.

Какие форматы изображений поддерживает объект Картинка?

Платформа работает с распространёнными растровыми форматами — JPEG, PNG, BMP, GIF, TIFF и некоторыми другими. Точный перечень зависит от версии платформы, поэтому для нестандартных форматов стоит проверить поведение на тестовом файле и обработать исключение.

Как получить размеры всех картинок в справочнике пакетно?

Сделайте запрос к реквизиту с хранилищем значений, затем в цикле по выборке извлекайте данные через Получить() и создавайте объект Картинка. Для больших объёмов обрабатывайте записи порциями и выполняйте код в фоновом задании, чтобы не блокировать пользователей.

Чем отличается Размер() у объекта Файл от Размер() у двоичных данных?

Оба возвращают вес в байтах, но Файл работает с файлом на диске и не требует загрузки содержимого в память, а двоичные данные уже находятся в памяти. Для картинок из базы доступен только второй вариант, для файлов на диске удобнее первый.