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

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

Как получить размер картинки в 1С: программные способы

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

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

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

Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемыми и обычными формами. Приведённые примеры работают и на клиенте, и на сервере, но с учётом ограничений, которые описаны ниже.

Объект «Картинка»: основной способ узнать ширину и высоту

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

Минимальный пример чтения размера из файла на сервере:

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

Ширина = Картинка.Ширина();

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

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

Обратите внимание: Ширина и Высота — это методы, а не свойства-поля, поэтому вызываются со скобками. Вторая частая особенность — объект Картинка не поддерживает все мыслимые форматы. Если файл повреждён или формат не распознан, конструктор выбросит исключение, поэтому в прикладном коде загрузку стоит оборачивать в Попытка...Исключение.

bsl
Картинка = Новый Картинка("C:\Images\photo.jpg");
Сообщить(Картинка.Ширина());  // ширина в пикселях
Сообщить(Картинка.Высота());  // высота в пикселях
Сообщить(Картинка.Формат());  // формат изображения

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

На практике картинки редко лежат просто в файле на диске сервера. Чаще они хранятся в реквизитах типа ХранилищеЗначения (например, в справочнике «Номенклатура» или в присоединённых файлах БСП) либо приходят по HTTP из внешних сервисов. В обоих случаях сначала получают ДвоичныеДанные, а затем передают их в конструктор картинки.

Пример для реквизита с хранилищем значений:

ДвоичныеДанные = ТоварОбъект.ДанныеКартинки.Получить();

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

Возврат;

КонецЕсли;

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

РазмерСтрокой = Строка(Картинка.Ширина()) + "x" + Строка(Картинка.Высота());

Если нужен именно объём файла в байтах, а не геометрия, у двоичных данных есть метод Размер(). Это быстрее, чем создавать объект картинки, потому что изображение не декодируется. Такой подход подходит для контроля лимитов загрузки, например «не больше 5 МБ».

Размер картинки на клиенте: асинхронная модель

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

Типовая схема выглядит так:

&НаКлиенте

Процедура ВыбратьФайл(Команда)

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);

КонецПроцедуры

&НаСервере

Функция ПолучитьРазмерНаСервере(Адрес)

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

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

Возврат Новый Структура("Ширина,Высота", Картинка.Ширина(), Картинка.Высота());

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

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

Порядок действий для загрузки с клиента
  1. 1
    Вызовите НачатьПомещениеФайла с описанием оповещения
  2. 2
    Получите адрес во временном хранилище в обработчике
  3. 3
    Передайте адрес в серверную функцию
  4. 4
    На сервере извлеките двоичные данные и создайте объект Картинка
  5. 5
    Прочитайте Ширина() и Высота(), верните результат на клиент

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

Наиболее частая прикладная задача — валидация изображений при загрузке в справочник. Например, маркетплейс или сайт требует минимальную ширину фото, а выгрузка в XML должна отсекать неподходящие картинки. Универсальная функция проверки выглядит так:

Функция КартинкаПодходит(ДвоичныеДанные, МинШирина, МинВысота)

Попытка

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

Исключение

Возврат Ложь; // файл не является поддерживаемым изображением

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

Возврат Картинка.Ширина() >= МинШирина И Картинка.Высота() >= МинВысота;

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

Второй сценарий — вычисление пропорций для печатных форм и табличных документов. Зная ширину и высоту, можно рассчитать коэффициент масштабирования, чтобы картинка вписалась в область без искажения: делите целевую ширину области на исходную ширину изображения и применяете тот же коэффициент к высоте.

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

Маршрут решения

Как выбрать действие

Нужно узнать геометрию изображения (пиксели)Создайте объект Картинка и прочитайте Ширина()/Высота()
Нужен только объём файла для контроля лимитаИспользуйте ДвоичныеДанные.Размер() без декодирования
Файл выбирает пользователь в тонком или веб-клиентеПоместите файл во временное хранилище и обработайте на сервере
Картинка хранится в реквизите ХранилищеЗначенияВызовите Получить() у хранилища и передайте двоичные данные в конструктор

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

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

Ещё одно ограничение — недоступность файловой системы сервера с клиента и наоборот. Путь C:\Images\photo.jpg, корректный на машине разработчика, на сервере 1С укажет на диск сервера, а не пользователя. Это приводит к ошибке «файл не найден» в рабочей базе, хотя на тестовой всё работало.

Также помните, что конструктор картинки выбрасывает исключение при пустых или битых данных. В обменах, где файлы приходят извне, отсутствие обработки Попытка/Исключение — гарантированный источник падающих фоновых заданий.

Типичные ошибки
01
Чтение свойств без скобок: Картинка.Ширина вместо Картинка.Ширина() — синтаксическая ошибка или неожиданное поведение
02
Использование локального пути клиента в серверном коде — файл не находится, так как ищется на диске сервера
03
Отсутствие Попытка/Исключение при загрузке файлов из внешних источников — обмен падает на первом битом файле
04
Смешение размера в байтах и размера в пикселях — проверка «не больше 800» срабатывает не так, как задумано
05
Создание объекта Картинка в цикле по тысячам файлов, когда нужен только объём — лишняя нагрузка на сервер

Альтернативные способы и проверка результата

Если по какой-то причине объект Картинка не подходит — например, формат не поддерживается, а размер нужен — существует обходной путь: разбор заголовков файла вручную. У PNG ширина и высота хранятся в фиксированных байтах заголовка IHDR, у JPEG их можно извлечь из сегмента SOF. Это трудоёмко и требует аккуратной работы с буфером двоичных данных, поэтому применяется редко, но для узких интеграционных задач вариант рабочий.

Для файлов, лежащих на диске, объём в байтах можно получить и без чтения содержимого — через объект Файл:

Файл = Новый Файл("C:\Images\photo.jpg");

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

ОбъемБайт = Файл.Размер();

КонецЕсли;

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

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

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

Сравнение со свойствами файла
Норма

Ширина и высота в 1С совпадают со значениями в проводнике или просмотрщике

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

Значения отличаются — проверьте, тот ли файл или реквизит читается

Поведение на битом файле
Норма

Код возвращает Ложь или понятное сообщение об ошибке

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

Необработанное исключение прерывает обмен или фоновое задание

Работа в тонком/веб-клиенте
Норма

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

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

Ошибка доступа к файлу или пустой результат на клиенте

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

Как получить размер картинки в мегабайтах, а не в пикселях?

Возьмите двоичные данные файла и вызовите метод Размер() — он вернёт объём в байтах. Для перевода в мегабайты разделите результат на 1048576 и округлите до нужной точности. Объект Картинка для этого создавать не нужно.

Почему конструктор «Новый Картинка» выдаёт ошибку на файле?

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

Можно ли узнать размер картинки без загрузки файла на сервер?

Геометрию в пикселях — практически нет: её должен декодировать либо клиент, либо сервер. В тонком и веб-клиенте надёжный путь — поместить файл во временное хранилище и обработать на сервере. Объём в байтах на клиенте можно узнать через объект Файл при наличии расширения работы с файлами.

Как получить размер картинки из присоединённого файла БСП?

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

Работает ли объект Картинка с форматами WebP или HEIC?

Гарантированной поддержки таких форматов нет — поведение зависит от версии платформы и операционной системы. Если обмен предполагает нестандартные форматы, протестируйте реальные файлы на вашей версии или предварительно конвертируйте изображения в PNG/JPEG внешними средствами.

Итог

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

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