Как реализовать вывод произвольного списка картинок на форме документа в 1С?

Программист IT и автоматизация бизнеса
← На главную

При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача прикрепления файлов или изображений к объектам системы (документам, справочникам). Начинающие разработчики часто совершают архитектурную ошибку, пытаясь создать фиксированное количество реквизитов (например, Картинка1, Картинка2) в самом объекте. Рассмотрим, почему этот подход тупиковый и как правильно организовать хранение произвольного количества изображений.

Анализ проблемы: почему реквизиты объекта — это плохо

Проанализируем ситуацию: если мы создаем реквизиты в самом документе, мы жестко ограничиваем пользователя. Если завтра ему понадобится прикрепить не 3, а 10 фотографий, нам придется менять структуру метаданных, обновлять конфигурацию и перерисовывать форму. Кроме того, пустые реквизиты в базе данных — это нерациональное использование ресурсов. Выясним причину, по которой следует использовать связь «один ко многим».

Решение 1: Использование подчиненного справочника

Это классический и самый надежный способ организации хранения файлов. Разберем его по шагам:

  1. Создадим новый справочник, например, ПрисоединенныеФайлы.
  2. В качестве владельца этого справочника (вкладка «Владельцы») укажем наш документ (или несколько видов документов).
  3. Добавим реквизит ФайлХранилище с типом ХранилищеЗначения. Именно здесь будут физически храниться бинарные данные картинки.
  4. На форме документа разместим Динамический список, основной таблицей которого будет наш новый справочник, а в отборе укажем ссылку на текущий документ.

Такой подход позволяет пользователю добавлять неограниченное количество записей. Проанализируем пример кода для сохранения картинки в такой справочник:


// Пример добавления новой картинки
НоваяЗапись = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
НоваяЗапись.Владелец = Объект.Ссылка;
НоваяЗапись.Наименование = "Фото от " + ТекущаяДата();
НоваяЗапись.ФайлХранилище = Новый ХранилищеЗначения(ДанныеКартинки, Новый СжатиеДанных(9));
НоваяЗапись.Записать();

Решение 2: Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе современных типовых решений (УТ 11, ERP, БП 3.0), в ней уже присутствует подсистема «Присоединенные файлы». Разберем, почему это лучшее решение:

Для реализации достаточно включить ваш документ в состав определяемых типов ВладелецПрисоединенныхФайлов и выполнить несколько настроек в коде модуля менеджера.

Визуализация: как вывести картинки в ряд на форме

Пользователь хочет видеть именно «список картинок», а не просто таблицу с названиями файлов. Посмотрим, как реализовать «галерею». Для этого на управляемой форме можно использовать Поле HTML-документа. Мы можем программно сформировать HTML-верстку, которая будет отображать миниатюры картинок.

Рассмотрим алгоритм формирования такой галереи:

  1. При открытии формы или обновлении списка файлов перебираем все элементы подчиненного справочника.
  2. Для каждой картинки получаем навигационную ссылку во временное хранилище.
  3. Формируем строку HTML с тегами <img src='...'>.
  4. Присваиваем полученную строку реквизиту формы с типом Строка, который связан с полем HTML-документа.

Пример получения навигационной ссылки для отображения в списке:


&НаСервере
Функция ПолучитьСсылкуНаКартинку(СсылкаНаФайл)
    Данные = СсылкаНаФайл.ФайлХранилище.Получить();
    Адрес = ПоместитьВоВременноеХранилище(Данные, ЭтаФорма.УникальныйИдентификатор);
    Возврат Адрес;
КонецФункции

Оптимизация: миниатюры и производительность

Важно помнить о производительности. Если пользователь прикрепит 20 фотографий высокого разрешения по 10 Мб каждая, форма документа будет открываться крайне медленно, так как системе придется передавать сотни мегабайт с сервера на клиент.

Рассмотрим решение: при сохранении файла необходимо программно создавать «превью» (миниатюру) размером, например, 150x150 пикселей. В динамическом списке или в галерее на форме нужно отображать именно эти легкие миниатюры. Полноразмерное изображение должно подгружаться только в тот момент, когда пользователь кликает по картинке для ее открытия.

Интерактивность: открытие картинки

Для того чтобы картинки «открывались», как просил пользователь, мы можем использовать метод платформы ПолучитьФайл() или команду ЗапуститьПриложение(). Проанализируем ситуацию: если мы хотим использовать системный просмотрщик Windows, нам нужно извлечь двоичные данные из ХранилищеЗначения, записать их во временный файл на диске пользователя и передать путь к этому файлу операционной системе.


&НаКлиенте
Процедура СписокКартинокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Логика получения файла с сервера и открытие его внешним приложением
    ОткрытьФайлНаКлиенте(ВыбраннаяСтрока);
КонецПроцедуры

Подводя итог, отметим: реализация произвольного списка картинок — это работа с подчиненными структурами данных. Использование БСП сэкономит вам десятки часов разработки, предоставляя надежный и функциональный механизм «из коробки».

← На главную