Как вывести изображение в отчет СКД и настроить его открытие по двойному клику

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает необходимость визуализировать информацию: вывести фотографии сотрудников, изображения товаров или сканы документов. Однако простое отображение картинки — это только половина задачи. Пользователю часто требуется рассмотреть изображение поближе, кликнув по нему. В этой статье мы разберем, как правильно настроить вывод картинок и реализовать интерактивное взаимодействие с ними в разных режимах работы платформы 1С.

Метод 1: Использование нативной поддержки в современных версиях платформы (8.3.14+)

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

Рассмотрим пошагово этот процесс:

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

Важный нюанс: Чтобы картинка не искажалась при выводе в ячейку, в свойствах оформления можно задать размер. Однако для полноценного управления интерактивностью нам все же потребуется программный код, который мы разберем ниже.

Метод 2: Программная настройка расшифровки изображения

Одной из главных проблем, с которой сталкиваются разработчики (как отмечено в сообщении 6), является неверная привязка расшифровки. Если вы установите расшифровку для всей ячейки, то клик по самой картинке может не сработать так, как ожидается. Картинка в табличном документе является объектом типа Рисунок, и у него есть собственное свойство Расшифровка.

Проанализируем ситуацию: когда СКД выводит отчет, она создает объекты-рисунки внутри области. Чтобы по двойному клику открывалось нужное нам значение, мы должны перехватить процесс вывода. Разберем пример кода для управления этим процессом:


// В модуле объекта отчета или в форме при формировании
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;

    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);

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

Метод 3: Интерактивное открытие во внешнем «вьюере»

Когда расшифровка заполнена ссылкой на справочник или файл, нам нужно обработать двойной клик. В управляемых формах для этого используется событие РезультатОбработкаРасшифровки табличного документа. Выясним, как сделать просмотр максимально удобным.

Вместо стандартного открытия элемента справочника, мы можем вызвать специализированное окно просмотра 1С. Для этого воспользуемся методом ПоказатьЗначение(). Это даст пользователю стандартные инструменты: масштаб, поворот и сохранение изображения.


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

КонецПроцедуры

Метод 4: Особенности реализации для платформы 8.1 и обычных форм

Как упоминалось в обсуждении, для старых версий (например, ЗУП 2.5 на платформе 8.1), автоматизация СКД сильно ограничена. Здесь нам придется вручную создавать объекты Рисунок и помещать их в ячейки табличного документа. Посмотрим на пример реализации такого алгоритма:

  1. При обходе процессора компоновки определяем ячейку, куда должна попасть картинка.
  2. Извлекаем данные из ХранилищеЗначения.
  3. Создаем рисунок: Картинка = ДокументРезультат.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);.
  4. Устанавливаем границы рисунка равными границам ячейки: Картинка.Расположить(Ячейка);.
  5. Важный момент: Чтобы фото не растягивалось, устанавливаем Картинка.РазмерКартинки = РазмерКартинки.Пропорционально;.

Метод 5: Использование временных хранилищ для оптимизации

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

Вместо того чтобы помещать в результат компоновки само ХранилищеЗначения, мы можем поместить туда строку — адрес во временном хранилище. Современная платформа 1С умеет отображать картинку, если в качестве данных ей передана навигационная ссылка вида e1cib/tempstorage/....

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

Рекомендации по улучшению интерфейса

Если стандартное окно просмотра вас не устраивает (например, нужно добавить специфические кнопки или метаданные рядом с фото), разберем совет из сообщения 7: создание собственной общей формы просмотра. В этой форме вы можете разместить поле картинки и установить для него режим ВариантМасштабирования.АвтоКоэффициент или реализовать «резиновое» поле, размер которого пользователь меняет вручную.

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

← На главную