Загрузка изображений в информационную базу — это одна из наиболее часто встречающихся задач при разработке в среде 1С. Будь то логотип компании, фотографии товаров для интернет-магазина или сканы документов, программисту необходимо понимать механизмы взаимодействия клиента и сервера, а также особенности работы с временными хранилищами. В рамках данной статьи мы подробно разберем, как реализовать импорт картинок, обсудим современные асинхронные методы и рассмотрим способы оптимизации хранения графических данных.
Рассмотрим стандартный алгоритм загрузки файла в управляемых формах. Основная идея заключается в том, что файл сначала выбирается на стороне клиента, помещается во временное хранилище, а затем на сервере извлекается из этого хранилища и записывается в реквизит объекта с типом ХранилищеЗначения.
Проанализируем программный код, который позволяет реализовать этот процесс. Сначала нам необходимо инициировать диалог выбора файла на клиенте:
&НаКлиенте
Процедура ВыбратьЛоготип(Команда)
// Создаем оповещение, которое сработает после выбора файла
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
// Открываем интерактивное окно для выбора файла
// Параметр УникальныйИдентификатор привязывает временное хранилище к форме
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
После того как пользователь выберет файл, управление передается в процедуру обработки. Здесь мы получаем адрес файла во временном хранилище и записываем его в реквизит формы (например, с именем Фото), который связан с элементом управления «Поле картинки».
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат; // Пользователь отменил выбор
КонецЕсли;
// Адрес ведет во временное хранилище на сервере
Фото = Адрес;
КонецПроцедуры
На заключительном этапе, при записи объекта, нам необходимо переместить данные из временного хранилища в базу данных. Разберем, как это происходит в обработчике ПередЗаписьюНаСервере:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(Фото) Тогда
// Получаем двоичные данные из хранилища и помещаем в реквизит объекта
ТекущийОбъект.Логотип = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Фото));
КонецЕсли;
КонецПроцедуры
Важно понимать, что платформа 1С постоянно развивается. Начиная с версии 8.3.15, привычный метод НачатьПомещениеФайла признан устаревшим. В новых релизах (особенно начиная с 8.3.16) рекомендуется использовать метод НачатьПомещениеФайлаНаСервер().
Выясним причину этих изменений. Старые методы использовали синхронные вызовы или менее эффективные механизмы передачи данных, что могло приводить к блокировкам интерфейса или нестабильной работе в веб-клиенте. Современный метод НачатьПомещениеФайлаНаСервер() более оптимизирован: он позволяет передать файл из локальной файловой системы во временное хранилище за один вызов, обеспечивая при этом полноценную асинхронность. В самых последних версиях 1С внедряется механизм обещаний (Promises), который позволяет писать код более линейно, избегая «леса» процедур-оповещений.
Иногда перед загрузкой картинки в базу требуется проверить её параметры: разрешение, расширение или размер. В старых решениях часто применялись COM-объекты, такие как WIA.ImageFile. Рассмотрим этот пример для понимания того, как это работало раньше:
ФайлКартинка = Новый COMОбъект("WIA.ImageFile");
ФайлКартинка.LoadFile(ПолеИмениФайла);
Сообщить("Расширение: " + ФайлКартинка.FileExtension);
Сообщить("Высота: " + ФайлКартинка.Height);
Сообщить("Ширина: " + ФайлКартинка.Width);
Однако использование COM-объектов в современном мире — плохая практика. Они не работают на Linux-серверах, в мобильных приложениях и веб-клиентах. Вместо этого проанализируем возможности встроенного объекта 1С Картинка. Он обладает всеми необходимыми методами для получения метаданных:
Высота() и Ширина() — получение размеров в пикселях.Формат() — определение типа файла (JPEG, PNG и т.д.).ПолучитьДвоичныеДанные() — извлечение содержимого файла для дальнейшей обработки.РазмерФайла() — проверка веса изображения.Если нам нужно не просто импортировать картинку, но и изменить её (например, уменьшить размер для создания миниатюры), на помощь приходит объект ОбработкаКартинок, появившийся в версии 8.3.13. Это мощный инструмент, который избавляет нас от необходимости использовать внешние утилиты.
Рассмотрим сценарий ресайза изображения перед сохранением:
Картинка из двоичных данных.ОбработкаКартинок.УстановитьРазмер.Это позволяет существенно экономить место в базе данных, так как фотографии с современных смартфонов весят по 5–10 Мб, что избыточно для карточки товара в 1С.
Традиционно картинки сохраняются в ХранилищеЗначения внутри SQL-базы. Однако при большом объеме данных это приводит к раздуванию базы (bloat), замедлению бэкапов и снижению производительности. Рассмотрим альтернативные варианты:
1. Тома хранения файлов. Это стандартный функционал Библиотеки Стандартных Подсистем (БСП). Файлы хранятся в обычных папках на сервере, а в базе остаются только ссылки. Это значительно упрощает обслуживание базы данных.
2. Облачные хранилища (S3). Современный подход для высоконагруженных систем. Через HTTP-запросы изображения отправляются в сервисы типа MinIO или Яндекс.Облако. Это позволяет разгрузить сервер 1С и обеспечить высокую доступность контента.
При разработке под мобильный клиент 1С импорт картинок имеет свои нюансы. Если мы хотим использовать камеру устройства, нам не нужно открывать диалог выбора файла. Разберем использование объекта СредстваМультимедиа:
&НаКлиенте
Процедура СделатьФото(Команда)
Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
Описание = Новый ОписаниеОповещения("ЗавершитьСъемку", ЭтотОбъект);
СредстваМультимедиа.СделатьФотоснимок(Описание);
КонецЕсли;
КонецПроцедуры
Это позволяет мгновенно получить снимок и передать его на сервер. Помните, что для мобильных приложений крайне важно сжимать изображения перед отправкой, чтобы экономить мобильный трафик пользователя и ускорять отклик интерфейса.
Подводя итог, можно сказать, что импорт картинок в 1С — это задача, требующая комплексного подхода. Во-первых, всегда используйте асинхронные методы (НачатьПомещениеФайлаНаСервер) для обеспечения совместимости с современными версиями платформы. Во-вторых, активно применяйте объект ОбработкаКартинок для оптимизации размеров и форматов (не забывайте про поддержку SVG для иконок и WebP для веба). В-третьих, при планировании архитектуры крупной системы заранее рассмотрите вынос файлов из базы данных на внешние тома или в облачные хранилища.