При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача прикрепления файлов или изображений к объектам системы (документам, справочникам). Начинающие разработчики часто совершают архитектурную ошибку, пытаясь создать фиксированное количество реквизитов (например, Картинка1, Картинка2) в самом объекте. Рассмотрим, почему этот подход тупиковый и как правильно организовать хранение произвольного количества изображений.
Проанализируем ситуацию: если мы создаем реквизиты в самом документе, мы жестко ограничиваем пользователя. Если завтра ему понадобится прикрепить не 3, а 10 фотографий, нам придется менять структуру метаданных, обновлять конфигурацию и перерисовывать форму. Кроме того, пустые реквизиты в базе данных — это нерациональное использование ресурсов. Выясним причину, по которой следует использовать связь «один ко многим».
Это классический и самый надежный способ организации хранения файлов. Разберем его по шагам:
ПрисоединенныеФайлы.ФайлХранилище с типом ХранилищеЗначения. Именно здесь будут физически храниться бинарные данные картинки.Такой подход позволяет пользователю добавлять неограниченное количество записей. Проанализируем пример кода для сохранения картинки в такой справочник:
// Пример добавления новой картинки
НоваяЗапись = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
НоваяЗапись.Владелец = Объект.Ссылка;
НоваяЗапись.Наименование = "Фото от " + ТекущаяДата();
НоваяЗапись.ФайлХранилище = Новый ХранилищеЗначения(ДанныеКартинки, Новый СжатиеДанных(9));
НоваяЗапись.Записать();
Если ваша конфигурация построена на базе современных типовых решений (УТ 11, ERP, БП 3.0), в ней уже присутствует подсистема «Присоединенные файлы». Разберем, почему это лучшее решение:
Для реализации достаточно включить ваш документ в состав определяемых типов ВладелецПрисоединенныхФайлов и выполнить несколько настроек в коде модуля менеджера.
Пользователь хочет видеть именно «список картинок», а не просто таблицу с названиями файлов. Посмотрим, как реализовать «галерею». Для этого на управляемой форме можно использовать Поле HTML-документа. Мы можем программно сформировать HTML-верстку, которая будет отображать миниатюры картинок.
Рассмотрим алгоритм формирования такой галереи:
<img src='...'>.Пример получения навигационной ссылки для отображения в списке:
&НаСервере
Функция ПолучитьСсылкуНаКартинку(СсылкаНаФайл)
Данные = СсылкаНаФайл.ФайлХранилище.Получить();
Адрес = ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес;
КонецФункции
Важно помнить о производительности. Если пользователь прикрепит 20 фотографий высокого разрешения по 10 Мб каждая, форма документа будет открываться крайне медленно, так как системе придется передавать сотни мегабайт с сервера на клиент.
Рассмотрим решение: при сохранении файла необходимо программно создавать «превью» (миниатюру) размером, например, 150x150 пикселей. В динамическом списке или в галерее на форме нужно отображать именно эти легкие миниатюры. Полноразмерное изображение должно подгружаться только в тот момент, когда пользователь кликает по картинке для ее открытия.
Для того чтобы картинки «открывались», как просил пользователь, мы можем использовать метод платформы ПолучитьФайл() или команду ЗапуститьПриложение(). Проанализируем ситуацию: если мы хотим использовать системный просмотрщик Windows, нам нужно извлечь двоичные данные из ХранилищеЗначения, записать их во временный файл на диске пользователя и передать путь к этому файлу операционной системе.
&НаКлиенте
Процедура СписокКартинокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Логика получения файла с сервера и открытие его внешним приложением
ОткрытьФайлНаКлиенте(ВыбраннаяСтрока);
КонецПроцедуры
Подводя итог, отметим: реализация произвольного списка картинок — это работа с подчиненными структурами данных. Использование БСП сэкономит вам десятки часов разработки, предоставляя надежный и функциональный механизм «из коробки».