В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача отображения динамического набора данных. Одной из наиболее трудоемких задач является вывод изображений, количество которых заранее не определено в конфигураторе. Например, это может быть фотогалерея товаров в справочнике или скан-копии документов, прикрепленные к сделке. Разберем детально, как реализовать этот механизм программно, чтобы элементы формы корректно отображались именно как картинки, а не как поля ввода.
Разберем ситуацию, с которой сталкиваются многие разработчики: элементы создаются, но выглядят как обычные текстовые поля. Основная причина кроется в том, что недостаточно просто добавить элемент на форму. Проанализируем правильную последовательность действий. При использовании метода Элементы.Добавить() вторым параметром мы указываем Тип("ПолеФормы"). Однако «Поле формы» по умолчанию может быть полем ввода, полем флажка или полем картинки. Чтобы система поняла нашу задумку, мы должны явно установить свойство Вид.
Посмотрим на пример кода, который правильно инициализирует элемент:
// 1. Создаем реквизит формы для хранения ссылки на картинку
ИмяРеквизита = "ДинамическаяКартинка_" + Индекс;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка")));
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
// 2. Создаем элемент формы
НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), РодительскаяГруппа);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеКартинки; // Критически важная строка
НовыйЭлемент.ПутьКДанным = ИмяРеквизита;
НовыйЭлемент.Заголовок = ""; // Убираем заголовок для эстетики
Важно помнить, что реквизит формы в данном случае лучше определять как тип Строка, так как в управляемых формах для отображения картинки в поле чаще всего используется навигационная ссылка.
Выясним причину, почему картинка может не отображаться, даже если поле создано верно. Чтобы ПолеКартинки вывело изображение, в связанный с ним путь данных необходимо записать корректную ссылку. Если изображение хранится в реквизите справочника с типом ХранилищеЗначения, нам нужно получить его адрес.
Рассмотрим порядок действий для получения ссылки:
ПолучитьНавигационнуюСсылку(СсылкаНаОбъект, "ИмяРеквизитаХранилища").ПоместитьВоВременноеХранилище().Проанализируем пример загрузки из базы данных:
&НаСервере
Процедура ЗаполнитьКартинкиНаФорме()
Для Каждого СтрКартинка Из Объект.ТаблицаФайлов Цикл
ИмяРеквизита = "Картинка_" + СтрКартинка.НомерСтроки;
// Генерируем ссылку на данные в БД
ЭтаФорма[ИмяРеквизита] = ПолучитьНавигационнуюСсылку(СтрКартинка.СсылкаНаФайл, "ДанныеФайла");
КонецЦикла;
КонецПроцедуры
Чтобы наши картинки не выстраивались в один бесконечный вертикальный столбец, что крайне неудобно для пользователя, мы должны использовать возможности группировки элементов управляемой формы. Рекомендуем использовать ГруппаФормы с видом ГруппаКолонок или обычную группу с горизонтальной группировкой.
Рассмотрим, как создать эффект «плитки»:
ГруппаГалерея = Элементы.Добавить("ГруппаГалерея", Тип("ГруппаФормы"), ЭтаФорма);
ГруппаГалерея.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаГалерея.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ГруппаГалерея.ОтображатьЗаголовок = Ложь;
Используя свойство ГоризонтальнаяЕслиВозможно, мы добьемся того, что изображения будут автоматически переноситься на новую строку при изменении ширины окна формы, создавая адаптивный интерфейс.
Иногда создание десятков отдельных реквизитов формы может избыточно нагружать систему. Проанализируем более элегантный способ — использование таблицы значений. Мы можем добавить на форму таблицу, у которой будет всего одна колонка с видом ПолеКартинки.
Преимущества этого метода:
Чтобы картинки в таблице отображались корректно, убедитесь, что для колонки установлено свойство РазмерКартинки (например, Пропорционально или Авто).
Если вам нужно просто показать набор статичных изображений без возможности их редактирования или специфического взаимодействия, можно использовать Декорации. Декорация типа Картинка работает несколько иначе, чем поле формы.
Для вывода изображения в декорацию мы можем напрямую присвоить объект типа Картинка. Выясним, как это сделать программно:
НоваяДекорация = Элементы.Добавить("Декорация_" + Идентификатор, Тип("ДекорацияФормы"), Родитель);
НоваяДекорация.Вид = ВидДекорацииФормы.Картинка;
// Получаем двоичные данные из хранилища
ДвоичныеДанные = СтрКартинка.Хранилище.Получить();
Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
НоваяДекорация.Картинка = Новый Картинка(ДвоичныеДанные);
КонецЕсли;
Этот способ удобен тем, что нам не всегда нужно создавать строковые реквизиты для хранения путей к данным, мы работаем напрямую с объектом Картинка.
При выводе большого количества изображений (например, более 50) форма может начать открываться медленно. Проанализируем способы оптимизации:
ТабличногоДокумента с внедренными объектами-рисунками работает быстрее и позволяет пользователю легко масштабировать или распечатывать весь набор сразу.Таким образом, мы разобрали основные технические нюансы программного вывода изображений. Главное — правильно определить вид элемента формы и обеспечить корректную навигационную ссылку на данные. Комбинируя эти методы с правильной группировкой, вы сможете создавать удобные и функциональные интерфейсы для работы с медиа-данными в 1С.