Разработка и Конфигурация · 10 мин
Как получить размер картинки в 1С: программные способы
Как в 1С получить размер картинки программно: объект Картинка, свойства Ширина и Высота, чтение из файла, двоичных данных и хранилища значений. Примеры кода.
При разработке в 1С регулярно возникает задача узнать размер изображения: проверить, подходит ли картинка под ограничения каталога, вычислить пропорции перед вставкой в печатную форму или отсечь слишком большие файлы при загрузке. Встроенный язык 1С решает эту задачу без внешних компонентов — достаточно объекта Картинка и его свойств Ширина и Высота.
Важно различать два понятия: размер файла в байтах и размер изображения в пикселях. Первый получают через объект Файл (свойство Размер()) или через ДвоичныеДанные, второй — только загрузив картинку в специальный объект. В этой статье разобраны оба сценария с готовым кодом.
Материал ориентирован на платформу 1С:Предприятие 8.3 с управляемыми и обычными формами. Приведённые примеры работают и на клиенте, и на сервере, но с учётом ограничений, которые описаны ниже.
Объект «Картинка»: основной способ узнать ширину и высоту
Встроенный язык 1С предоставляет объект Картинка, который загружает изображение и открывает доступ к его характеристикам. Конструктор принимает путь к файлу, двоичные данные или поток. После создания объекта свойства Ширина и Высота возвращают размер в пикселях, а Формат() — тип изображения (PNG, JPEG и другие).
Минимальный пример чтения размера из файла на сервере:
Картинка = Новый Картинка("C:\Images\photo.jpg");
Ширина = Картинка.Ширина();
Высота = Картинка.Высота();
Сообщить("Размер: " + Ширина + "x" + Высота);
Обратите внимание: Ширина и Высота — это методы, а не свойства-поля, поэтому вызываются со скобками. Вторая частая особенность — объект Картинка не поддерживает все мыслимые форматы. Если файл повреждён или формат не распознан, конструктор выбросит исключение, поэтому в прикладном коде загрузку стоит оборачивать в Попытка...Исключение.
Картинка = Новый Картинка("C:\Images\photo.jpg");
Сообщить(Картинка.Ширина()); // ширина в пикселях
Сообщить(Картинка.Высота()); // высота в пикселях
Сообщить(Картинка.Формат()); // формат изображенияПолучение размера из двоичных данных и хранилища значений
На практике картинки редко лежат просто в файле на диске сервера. Чаще они хранятся в реквизитах типа ХранилищеЗначения (например, в справочнике «Номенклатура» или в присоединённых файлах БСП) либо приходят по HTTP из внешних сервисов. В обоих случаях сначала получают ДвоичныеДанные, а затем передают их в конструктор картинки.
Пример для реквизита с хранилищем значений:
ДвоичныеДанные = ТоварОбъект.ДанныеКартинки.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Картинка = Новый Картинка(ДвоичныеДанные);
РазмерСтрокой = Строка(Картинка.Ширина()) + "x" + Строка(Картинка.Высота());
Если нужен именно объём файла в байтах, а не геометрия, у двоичных данных есть метод Размер(). Это быстрее, чем создавать объект картинки, потому что изображение не декодируется. Такой подход подходит для контроля лимитов загрузки, например «не больше 5 МБ».
Размер картинки на клиенте: асинхронная модель
В тонком и веб-клиенте прямой доступ к файловой системе ограничен. Конструкция Новый Картинка(Путь) с локальным путём на клиенте работает только в толстом клиенте и при определённых настройках. Правильный подход — поместить файл во временное хранилище через НачатьПомещениеФайла, передать адрес на сервер и уже там создать объект картинки.
Типовая схема выглядит так:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаСервере
Функция ПолучитьРазмерНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Картинка = Новый Картинка(ДвоичныеДанные);
Возврат Новый Структура("Ширина,Высота", Картинка.Ширина(), Картинка.Высота());
КонецФункции
Такой вариант единообразно работает во всех клиентах и не требует расширения работы с файлами. Если же картинка уже доступна на клиенте как элемент формы (например, поле картинки с адресом во временном хранилище), размер всё равно надёжнее вычислять серверным вызовом — декодирование изображений на тонком клиенте имеет ограничения по форматам.
- 1Вызовите НачатьПомещениеФайла с описанием оповещения
- 2Получите адрес во временном хранилище в обработчике
- 3Передайте адрес в серверную функцию
- 4На сервере извлеките двоичные данные и создайте объект Картинка
- 5Прочитайте Ширина() и Высота(), верните результат на клиент
Проверка размера перед загрузкой: практические сценарии
Наиболее частая прикладная задача — валидация изображений при загрузке в справочник. Например, маркетплейс или сайт требует минимальную ширину фото, а выгрузка в XML должна отсекать неподходящие картинки. Универсальная функция проверки выглядит так:
Функция КартинкаПодходит(ДвоичныеДанные, МинШирина, МинВысота)
Попытка
Картинка = Новый Картинка(ДвоичныеДанные);
Исключение
Возврат Ложь; // файл не является поддерживаемым изображением
КонецПопытки;
Возврат Картинка.Ширина() >= МинШирина И Картинка.Высота() >= МинВысота;
КонецФункции
Второй сценарий — вычисление пропорций для печатных форм и табличных документов. Зная ширину и высоту, можно рассчитать коэффициент масштабирования, чтобы картинка вписалась в область без искажения: делите целевую ширину области на исходную ширину изображения и применяете тот же коэффициент к высоте.
Третий сценарий — пакетная обработка каталога фотографий. Здесь важно помнить о производительности: создание объекта Картинка декодирует изображение целиком, и на тысячах файлов это заметная нагрузка. Если нужен только объём в байтах, используйте ДвоичныеДанные.Размер() — это на порядки дешевле.
Как выбрать действие
Ограничения и типичные ошибки
Объект Картинка платформы поддерживает распространённые растровые форматы (PNG, JPEG, BMP, GIF и ряд других), но не гарантирует работу с экзотикой вроде WebP или HEIC — поведение зависит от версии платформы и операционной системы. Перед внедрением проверьте реальные форматы ваших файлов на тестовой базе.
Ещё одно ограничение — недоступность файловой системы сервера с клиента и наоборот. Путь C:\Images\photo.jpg, корректный на машине разработчика, на сервере 1С укажет на диск сервера, а не пользователя. Это приводит к ошибке «файл не найден» в рабочей базе, хотя на тестовой всё работало.
Также помните, что конструктор картинки выбрасывает исключение при пустых или битых данных. В обменах, где файлы приходят извне, отсутствие обработки Попытка/Исключение — гарантированный источник падающих фоновых заданий.
Альтернативные способы и проверка результата
Если по какой-то причине объект Картинка не подходит — например, формат не поддерживается, а размер нужен — существует обходной путь: разбор заголовков файла вручную. У PNG ширина и высота хранятся в фиксированных байтах заголовка IHDR, у JPEG их можно извлечь из сегмента SOF. Это трудоёмко и требует аккуратной работы с буфером двоичных данных, поэтому применяется редко, но для узких интеграционных задач вариант рабочий.
Для файлов, лежащих на диске, объём в байтах можно получить и без чтения содержимого — через объект Файл:
Файл = Новый Файл("C:\Images\photo.jpg");
Если Файл.Существует() Тогда
ОбъемБайт = Файл.Размер();
КонецЕсли;
Проверить корректность полученных размеров просто: откройте свойства файла в проводнике Windows или любом просмотрщике и сравните значения ширины и высоты с теми, что вернула 1С. Расхождение обычно означает, что читается не тот файл или данные в хранилище устарели.
Как проверить результат
Ширина и высота в 1С совпадают со значениями в проводнике или просмотрщике
Значения отличаются — проверьте, тот ли файл или реквизит читается
Код возвращает Ложь или понятное сообщение об ошибке
Необработанное исключение прерывает обмен или фоновое задание
Размер вычисляется через временное хранилище и серверный вызов
Ошибка доступа к файлу или пустой результат на клиенте
Частые вопросы
Как получить размер картинки в мегабайтах, а не в пикселях?
Возьмите двоичные данные файла и вызовите метод Размер() — он вернёт объём в байтах. Для перевода в мегабайты разделите результат на 1048576 и округлите до нужной точности. Объект Картинка для этого создавать не нужно.
Почему конструктор «Новый Картинка» выдаёт ошибку на файле?
Наиболее вероятные причины: файл не существует по указанному пути, формат не поддерживается платформой или файл повреждён. Проверьте существование через объект Файл и оберните создание картинки в Попытка/Исключение с записью текста ошибки в журнал регистрации.
Можно ли узнать размер картинки без загрузки файла на сервер?
Геометрию в пикселях — практически нет: её должен декодировать либо клиент, либо сервер. В тонком и веб-клиенте надёжный путь — поместить файл во временное хранилище и обработать на сервере. Объём в байтах на клиенте можно узнать через объект Файл при наличии расширения работы с файлами.
Как получить размер картинки из присоединённого файла БСП?
Используйте функцию РаботаСФайлами.ДвоичныеДанныеФайла (в типовых конфигурациях на БСП), передав ссылку на присоединённый файл. Полученные двоичные данные передайте в конструктор Картинка и прочитайте Ширина() и Высота().
Работает ли объект Картинка с форматами WebP или HEIC?
Гарантированной поддержки таких форматов нет — поведение зависит от версии платформы и операционной системы. Если обмен предполагает нестандартные форматы, протестируйте реальные файлы на вашей версии или предварительно конвертируйте изображения в PNG/JPEG внешними средствами.
Что важно запомнить
Размер картинки в пикселях в 1С получают через объект Картинка и методы Ширина()/Высота(), а объём файла в байтах — через ДвоичныеДанные.Размер(). Клиентские файлы обрабатывайте через временное хранилище и серверный вызов, а загрузку всегда оборачивайте в Попытка/Исключение.