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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача отображения динамического набора данных. Одной из наиболее трудоемких задач является вывод изображений, количество которых заранее не определено в конфигураторе. Например, это может быть фотогалерея товаров в справочнике или скан-копии документов, прикрепленные к сделке. Разберем детально, как реализовать этот механизм программно, чтобы элементы формы корректно отображались именно как картинки, а не как поля ввода.

Особенности программного создания Поля картинки

Разберем ситуацию, с которой сталкиваются многие разработчики: элементы создаются, но выглядят как обычные текстовые поля. Основная причина кроется в том, что недостаточно просто добавить элемент на форму. Проанализируем правильную последовательность действий. При использовании метода Элементы.Добавить() вторым параметром мы указываем Тип("ПолеФормы"). Однако «Поле формы» по умолчанию может быть полем ввода, полем флажка или полем картинки. Чтобы система поняла нашу задумку, мы должны явно установить свойство Вид.

Посмотрим на пример кода, который правильно инициализирует элемент:


// 1. Создаем реквизит формы для хранения ссылки на картинку
ИмяРеквизита = "ДинамическаяКартинка_" + Индекс;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка")));
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

// 2. Создаем элемент формы
НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), РодительскаяГруппа);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеКартинки; // Критически важная строка
НовыйЭлемент.ПутьКДанным = ИмяРеквизита;
НовыйЭлемент.Заголовок = ""; // Убираем заголовок для эстетики

Важно помнить, что реквизит формы в данном случае лучше определять как тип Строка, так как в управляемых формах для отображения картинки в поле чаще всего используется навигационная ссылка.

Работа с навигационными ссылками и данными базы

Выясним причину, почему картинка может не отображаться, даже если поле создано верно. Чтобы ПолеКартинки вывело изображение, в связанный с ним путь данных необходимо записать корректную ссылку. Если изображение хранится в реквизите справочника с типом ХранилищеЗначения, нам нужно получить его адрес.

Рассмотрим порядок действий для получения ссылки:

  1. Если объект уже записан в базе, используем функцию ПолучитьНавигационнуюСсылку(СсылкаНаОбъект, "ИмяРеквизитаХранилища").
  2. Если мы работаем с новыми файлами, которые пользователь только что выбрал, используем временное хранилище и адрес, возвращаемый методом ПоместитьВоВременноеХранилище().

Проанализируем пример загрузки из базы данных:


&НаСервере
Процедура ЗаполнитьКартинкиНаФорме()
    
    Для Каждого СтрКартинка Из Объект.ТаблицаФайлов Цикл
        ИмяРеквизита = "Картинка_" + СтрКартинка.НомерСтроки;
        // Генерируем ссылку на данные в БД
        ЭтаФорма[ИмяРеквизита] = ПолучитьНавигационнуюСсылку(СтрКартинка.СсылкаНаФайл, "ДанныеФайла");
    КонецЦикла;
    
КонецПроцедуры

Динамическое размещение элементов в группах

Чтобы наши картинки не выстраивались в один бесконечный вертикальный столбец, что крайне неудобно для пользователя, мы должны использовать возможности группировки элементов управляемой формы. Рекомендуем использовать ГруппаФормы с видом ГруппаКолонок или обычную группу с горизонтальной группировкой.

Рассмотрим, как создать эффект «плитки»:


ГруппаГалерея = Элементы.Добавить("ГруппаГалерея", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаГалерея.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаГалерея.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ГруппаГалерея.ОтображатьЗаголовок = Ложь;

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

Альтернативный метод: Использование Таблицы значений

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

Преимущества этого метода:

  1. Простота управления: Добавление новой картинки — это просто добавление строки в таблицу.
  2. События: Легко обрабатывать нажатие (выбор) конкретной картинки через стандартные события таблицы.
  3. Визуализация: У таблицы можно отключить отображение шапки и линий, превратив её в чистую сетку изображений.

Чтобы картинки в таблице отображались корректно, убедитесь, что для колонки установлено свойство РазмерКартинки (например, Пропорционально или Авто).

Отображение через Декорацию-Картинку

Если вам нужно просто показать набор статичных изображений без возможности их редактирования или специфического взаимодействия, можно использовать Декорации. Декорация типа Картинка работает несколько иначе, чем поле формы.

Для вывода изображения в декорацию мы можем напрямую присвоить объект типа Картинка. Выясним, как это сделать программно:


НоваяДекорация = Элементы.Добавить("Декорация_" + Идентификатор, Тип("ДекорацияФормы"), Родитель);
НоваяДекорация.Вид = ВидДекорацииФормы.Картинка;

// Получаем двоичные данные из хранилища
ДвоичныеДанные = СтрКартинка.Хранилище.Получить(); 
Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
    НоваяДекорация.Картинка = Новый Картинка(ДвоичныеДанные);
КонецЕсли;

Этот способ удобен тем, что нам не всегда нужно создавать строковые реквизиты для хранения путей к данным, мы работаем напрямую с объектом Картинка.

Оптимизация производительности при большом количестве файлов

При выводе большого количества изображений (например, более 50) форма может начать открываться медленно. Проанализируем способы оптимизации:

Таким образом, мы разобрали основные технические нюансы программного вывода изображений. Главное — правильно определить вид элемента формы и обеспечить корректную навигационную ссылку на данные. Комбинируя эти методы с правильной группировкой, вы сможете создавать удобные и функциональные интерфейсы для работы с медиа-данными в 1С.

← На главную