1С отчет с картинками

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

В чем проблема?

Например, добавим в поле макета рисунок, как показано на следующем скриншоте:

Рисунок в собственном макете СКД

В теории, СКД должна вывести в данной ячейке добавленный рисунок, но этого не происходит:

Результат вывода картинки в собственном макете СКД

Как мы видим, создание собственного макета не является решением данной задачи. Использование собственного макета имеет весьма ограниченные возможности в сравнении с отчетами НЕ на СКД.

На просторах глобальной сети находил несколько вариантов решения по выводу изображений в подобных отчетах. В основном все они основывались на обработке табличного документа после вывода отчета, когда программным образом искалась колонка в табличном документе и обходилась в цикле для добавления в соответствующие ячейки рисунков. Однако после изменения настроек варианта отчета в пользовательском режиме подобные отчеты работали нестабильно. Представьте, что структура отчета вида "Список" была изменена на "Таблица". Тогда алгоритм сразу переставал работать, так как ориентироваться на колонку с изображениями уже было нельзя.

Рассмотрим универсальное решение данной задачи, работающее при любых настройках отчета и выполняемой достаточно оптимальным образом.

Универсальное решение

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

Читайте также:  Что такое default в компьютере
Схема хранения присоединенных файлов

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

Вывод присоединенного файла в отчете

Из рисунка выше мы видим, что в отчете ссылка на присоединенный файл (элемент справочника "НоменклатураПрисоединенныеФайлы") отображается в виде представления (реквизит "Наименование"). Чтобы вмешаться в процесс формирования отчета и отобразить изображение в табличном документе, нам необходимо изменить алгоритм компоновки отчета.

Для начала в обработчике "ПриКомпоновкеРезультата" модуля объекта отчета отключим стандартную обработку и сформируем отчет полностью программным образом.

Выполнение отчета программным образом

Действия в программном коде подробно описаны в комментариях. Отмечу лишь важные моменты:

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

Может возникнуть логичный вопрос: "Почему не получить двоичные данные для изображения в одном запросе?". Ответ прост. Если мы будем получать изображения из регистра присоединенных файлов в одном запросе, то очень велика вероятность получить ошибку "Недостаточно памяти", если размер выбираемых изображений будет очень большим.

Конечно, выполнять запрос в цикле тоже не правильно. Есть наиболее оптимальный способ получения изображений в нашем случае, но чтобы не усложнять пример оставим этот, относительно простой, способ получения картинок.

На этом реализация отчета закончена, посмотрим на его работу в режиме предприятия.

Что имеем

Сформируем отчет в виде простого списка номенклатуры. Результат будет следующим:

Читайте также:  Смешные заставки на телефон введите пароль войдите

Problem-solving in IT

Monday, July 21, 2014

Формирование отчета СКД с картинками в управляемых формах 1С УТ11

Натолкнулся на проблему, в нете все решения сделаны базово. Мне необходимо было сделать так что бы была возможность выводить несколько изображений и они не были привязаны к определенным колонкам.
Фактически необходимо показать изображение которое стоит основным в справочнике номенклатуры, а также все изображения из справочника "ПрисоединенныеФайлы". В этой обработке возможно будет ошибка, так как я не проверяю, это картинка или нет, необходимо доделывать проверку.

В итоге запрос из схемы компоновки данных:

ВЫБРАТЬ
НоменклатураПрисоединенныеФайлы.Ссылка КАК Файл,
НоменклатураПрисоединенныеФайлы.ВидФайла,
НоменклатураПрисоединенныеФайлы.ФайлХранилище,
НоменклатураПрисоединенныеФайлы.ВладелецФайла,
ПрисоединенныеФайлы.ХранимыйФайл КАК Картинка,
СпрНоменклатура.Ссылка КАК Номенклатура,
ПрисоединенныеФайлы.ХранимыйФайл КАК КоличествоФайлов,
СпрНоменклатура.Ссылка КАК КоличествоНоменклатуры,
НоменклатураПрисоединенныеФайлы.ВладелецФайла КАК КоличествоНоменклатурыСФайлами,
СпрНоменклатура.ФайлКартинки
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
ПО НоменклатураПрисоединенныеФайлы.Ссылка = ПрисоединенныеФайлы.ПрисоединенныйФайл
ПО СпрНоменклатура.Ссылка = НоменклатураПрисоединенныеФайлы.ВладелецФайла

Выводим только заполненные дополнительные строки

Вы здесь

Создадим новый отчет.

Набор данных типа запрос.

Сделаем настройки схемы компоновки.

Отчет будет выглядить вот так.

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

Процедура ПриКомпоновкеРезультата ( ДокументРезультат , ДанныеРасшифровки , СтандартнаяОбработка )

НастройкиКомпоновки = КомпоновщикНастроек . ПолучитьНастройки ();

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( СхемаКомпоновкиДанных , НастройкиКомпоновки , ДанныеРасшифровки );

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки , , ДанныеРасшифровки );

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

Для ТекущаяСтрока = 1 По ДокументРезультат . ВысотаТаблицы Цикл

Для ТекущаяКолонка = 1 По ДокументРезультат . ШиринаТаблицы Цикл

ТекущаяОбласть = ДокументРезультат . Область ( ТекущаяСтрока , ТекущаяКолонка );
ТекущаяРасшифровка = ТекущаяОбласть . Расшифровка ;

Если ТипЗнч ( ТекущаяРасшифровка ) = Тип ( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда

ПоляРасшифровки = ДанныеРасшифровки . Элементы . Получить ( ТекущаяРасшифровка ). ПолучитьПоля ();
ПолеКартинки = ПоляРасшифровки . Найти ( "Картинка" );

Читайте также:  Сталкер как сделать неубиваемую броню

Если ТипЗнч ( ПолеКартинки ) = Тип ( "ЗначениеПоляРасшифровкиКомпоновкиДанных" ) Тогда

ФайлКартинки = ПолеКартинки . Значение ;

Если ТипЗнч ( ФайлКартинки ) = Тип ( "ХранилищеЗначения" ) Тогда

КартинкаВДокументе = ДокументРезультат . Рисунки . Добавить ( ТипРисункаТабличногоДокумента . Картинка );
КартинкаВДокументе . Картинка = Новый Картинка ( ФайлКартинки . Получить ());
КартинкаВДокументе . РазмерКартинки = РазмерКартинки . Пропорционально ;
КартинкаВДокументе . Расположить ( ТекущаяОбласть );

Теперь отчет формируется вот так. Задача решена.

Оцените статью
Добавить комментарий

Adblock detector