При разработке конфигураций на 1С часто возникает задача контроля параметров загружаемых изображений. Например, если необходимо проверить, чтобы логотип компании или фотография товара соответствовали определенным габаритам. Давайте разберем, как получить высоту и ширину картинки программными средствами, учитывая возможности разных версий платформы.
В современных версиях платформы 1С задача решается максимально просто. Если ваша конфигурация не ограничена жестким режимом совместимости с устаревшими версиями, разработчики платформы уже позаботились о вас. У объекта Картинка появились встроенные свойства Высота и Ширина.
Это самый предпочтительный способ, так как он не требует обращения к внешним библиотекам или анализа бинарной структуры файлов. Мы просто считываем свойства напрямую:
// Пример получения размеров для современной платформы
КартинкаОбъект = Новый Картинка("ПутьКФайлу.png");
Ширина = КартинкаОбъект.Ширина;
Высота = КартинкаОбъект.Высота;
Сообщить("Размеры: " + Ширина + " x " + Высота);
Если вам необходимо работать в среде Windows и требуется получить информацию о файле, хранящемся на диске, можно воспользоваться возможностями операционной системы через COM-объект. Это решение позволяет считать системные метаданные файла, включая его геометрические параметры.
Разберем, как это реализовать на практике:
Процедура ОпределитьРазмерКартинки(ПутьКФайлу)
// Разделяем путь на каталог и имя файла
ФайлКартинки = Новый Файл(ПутьКФайлу);
Каталог = ФайлКартинки.Путь;
Имя = ФайлКартинки.Имя;
objShellApp = Новый COMОбъект("Shell.Application");
objFolder = objShellApp.NameSpace(СокрЛП(Каталог));
objItem = objFolder.ParseName(СокрЛП(Имя));
// Индекс 31 соответствует свойству размеров в проводнике Windows
Размеры = objFolder.GetDetailsOf(objItem, 31);
Размеры = СтрЗаменить(Размеры, "?", "");
Сообщить("Размеры картинки: " + Размеры);
КонецПроцедуры
Обратите внимание: данный способ зависит от локальных настроек Windows и может работать медленнее, чем встроенные методы. Кроме того, этот подход не применим при работе сервера 1С под управлением ОС Linux.
Для версий 8.1 и 8.2, где встроенные методы получения размеров отсутствуют, применялся метод прямого анализа заголовка файла. Чтобы не писать парсеры для каждого типа расширений (JPG, BMP, TIF), мы приводим изображение к единому стандарту — PNG. У этого формата структура заголовка стабильна.
Разберем алгоритм решения этой задачи по шагам:
PNG методом Преобразовать.ДвоичныеДанные картинки и преобразуем их в строку.
Функция Hex2Dec(Стр1, Base = 16)
Рез = 0;
Стр = СтрЗаменить(Стр1, " ", "");
КК = СтрДлина(Стр);
Для К = 1 по КК Цикл
Рез = Рез * Base + Найти("0123456789ABCDEF", Сред(Стр, К, 1)) - 1;
КонецЦикла;
Возврат Рез;
КонецФункции
Процедура ПоказатьРазмер(Картинка)
КартинкаPNG = Картинка.Преобразовать(ФорматКартинки.PNG);
ДанныеСтрокой = "" + КартинкаPNG.ПолучитьДвоичныеДанные();
// Позиции байт в структуре PNG
Ширина = Hex2Dec(Сред(ДанныеСтрокой, 49, 11));
Высота = Hex2Dec(Сред(ДанныеСтрокой, 61, 11));
Сообщить("Размер: " + Формат(Ширина, "ЧГ=0") + "x" + Формат(Высота, "ЧГ=0"));
КонецПроцедуры
Мы проанализировали три способа решения поставленной задачи. При выборе метода всегда придерживайтесь правила: чем проще код, тем лучше. Сначала проверяйте наличие методов Ширина и Высота у объекта Картинка. Если же вы работаете в специфической среде или на очень старых версиях системы, используйте COM-объект для Windows-клиентов или анализ двоичных данных как универсальный, но более сложный способ. Надеемся, данное руководство поможет вам эффективно реализовать проверку изображений в ваших проектах.