Вывод картинок в отчет 1с
В этой статье мы рассмотрим методику вывода картинок в отчетах на 1С СКД. Картинки в отчете могут понадобиться, например, для вывода прайса с изображениями номенклатуры или списка сотрудников с фотографиями (его мы и реализуем в рамках данной статьи).
Скажем сразу, что из-за некоторых ограничений 1С, данная задача не решается средствами конструктора СКД, через задание макета или как-то иначе. Решается она только программно, определением процедуры ПриКомпоновкеРезультата() в модуле отчета СКД. Но обо всем по порядку.
На первом этапе нам необходимо определить реквизит или ресурс где хранится ссылка на картинку (двоичные данные или файл, чтобы можно было впоследствии программно получить саму картинку) и создать обычный отчет на СКД с выводом этого реквизита/ресурса.
На втором этапе, в процедуре ПриКомпоновкеРезультата(), программно выводим наш отчет, пробегаемся по результирующему табличному документу и в полях, где содержится ссылка на картинку, получаем саму картинку и выводим ее.
В качестве примера создадим отчет «Список сотрудников с фотографиями» в конфигурации ЗУП 3.1.
Создаем отчет конструктором 1С СКД с выводом поля «Фотография», в котором будет ссылка на двоичные данные с картинкой. В ЗУП фотографии физических лиц хранятся в отдельном регистре сведений «ФотографииФизическихЛиц».
В настройках для простоты задачи добавим одну группировку «Детальные записи» с выводом всех полей.
- В процедуре ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) отменим стандартный вывод (СтандартнаяОбработка = Ложь) и выведем макет в табличный документ программно. Тут все стандартно:
Здесь нужно обратить внимание на параметр ДанныеРасшифровки, именно из него мы будем извлекать ссылки на картинки.
Далее просто в двух циклах (по строкам и по колонкам) пробегаемся по получившемуся табличному документу и в нужных полях (в нашем случае это поля с наименованием «Фотография»), если их расшифровка соответствует типу ссылки на картинку (в нашем случае это «ДвоичныеДанные»), добавляем картинки.
Картинка выводится непосредственно при формировании макета, на основании информации получаемой запросом СКД. Причем этой информацией являются только ссылки на элементы справочника, имеющего связь с изображением.
Итоговая задача: построить прайс-лист с изображениями номенклатур для УТ (т.е. в прайсе предполагается выводить изображения, которые показываются в карточке номенклатуры)
После недолгих поисков выяснилось, что информация которую можно сконвертировать в изображение находится в справочнике НоменклатураПрисоединенныеФайлы, на элементы которого может ссылаться реквизит номенклатуры ФайлКартинки. Сама бинарная информация, которую можно сконвертировать в картинку, может находится либо в регистре сведений ПрисоединенныеФайлы, либо на внешнем по отношению к базе носителе (папка на диске сервера).
Будем дорабатывать стандартный отчет УТ 11.0.9.15 Прайс-лист, для удобства сохраним его в качестве внешнего.
Порядок действий для вывода картинок в печатной форме СКД:
1. К запросу СКД добавляем поле со ссылкой на справочник НоменклатураПрисоединенныеФайлы, соответствущей элементу номенклатуры.
2. При выводе соответствующего элемента макета читаем информацию о картинке и выводим её в соответствующей ячейке:
2.1. Получаем ячейку табличного документа, в которой предполагается вывести кртинку.
2.2. Преобразуем бинарную информацию по ссылке, полученной в п.1. в картинку и выводим её в ячейке, полученной в п.2.1.
2.3. Производим дополнительное оформление ячейки и картинки (меняем размер, цвет линии и тд.)
Итак по вышеописанному плану:
Добавим в запрос СКД новое поле Изображение:
ЦеныНоменклатурыСрезПоследних.Номенклатура.ФайлКартинки КАК Изображение
Видоизменим варианты настроек (добавим группировку по Изображению):
Добавим новый параметр ШиринаКолонкиИзображения, через который будем регулировать размер изображения:
Нам потребуется вмешиваться в процесс формирования отчета, поэтому добавим в конец процедуры модуля объекта ПриКомпоновкеРезультата, следующий код:
СтандартнаяОбработка = Ложь;
ИмяКолонкиИзображения = "Изображение" ;
ДокументРезультат . Очистить ();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
//Получаем параметр отчета ШиринаКолонкиИзображения, и устанавливаем ширину колонки, в которой предполагаем выводить изображение
ШиринаКолонкиИзображения = ВернутьЗначениеПараметраНастройкиСКД ( КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы , "ШиринаКолонкиИзображения" , 20 ); //В средних символах
ПолеИзображения = СхемаКомпоновкиДанных . НаборыДанных . ПрайсЛист . Поля . Найти ( ИмяКолонкиИзображения );
Если Не ПолеИзображения = Неопределено Тогда
ОформлениеМинимальнойШириныКолонки = СхемаКомпоновкиДанных . НаборыДанных . ПрайсЛист . Поля . Найти ( ИмяКолонкиИзображения ). Оформление . Элементы . Найти ( "МинимальнаяШирина" );
ОформлениеМинимальнойШириныКолонки.Использование = Истина;
ОформлениеМинимальнойШириныКолонки.Значение = ШиринаКолонкиИзображения ;
КонецЕсли;
//Выводим макет, здесь все почти стандартно.
Макет = КомпоновщикМакета.Выполнить ( СхемаКомпоновкиДанных , КомпоновщикНастроек . ПолучитьНастройки (), ДанныеРасшифровки );
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( Макет , , ДанныеРасшифровки );
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент ;
ПроцессорВывода . УстановитьДокумент ( ДокументРезультат );
ПроцессорВывода . НачатьВывод ();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки . Следующий ();
Если ЭлементРезультата = Неопределено Тогда Прервать;КонецЕсли;
ПроцессорВывода . ВывестиЭлемент ( ЭлементРезультата );
Если ЭлементРезультата . ЗначенияПараметров . Количество () = 0 Тогда Продолжить; КонецЕсли;
Для Каждого ЭлементПараметра Из ЭлементРезультата . ЗначенияПараметров Цикл
Если ТипЗнч ( ЭлементПараметра . Значение ) = Тип ( "ИдентификаторРасшифровкиКомпоновкиДанных " ) Тогда
Поля = ДанныеРасшифровки . Элементы [ ЭлементПараметра.Значение ]. ПолучитьПоля ();
Для Каждого Поле Из Поля Цикл
Если ТипЗнч ( Поле . Значение ) = Тип ( "СправочникСсылка.НоменклатураПрисоединенныеФайлы" ) Тогда
Если Поле . Значение . Пустая () Тогда Продолжить; КонецЕсли;
//Поиск номера колонки, с нужным именем ИмяКолонкиИзображения, для таки вывода изображения
Для НомерКолонки = 1 По ДокументРезультат . ШиринаТаблицы Цикл
Расшифровка = ДокументРезультат . Область ( ДокументРезультат . ВысотаТаблицы , НомерКолонки , ДокументРезультат . ВысотаТаблицы , НомерКолонки ). Расшифровка ;
Если Расшифровка = Неопределено Тогда Продолжить; КонецЕсли;
Поля = ДанныеРасшифровки . Элементы . Получить ( Расшифровка ). ПолучитьПоля ();
Если Поля . Найти ( ИмяКолонкиИзображения ) = Неопределено Тогда Продолжить; КонецЕсли;
ОбластьИзображения = ДокументРезультат . Область ( ДокументРезультат . ВысотаТаблицы , НомерКолонки );
ВывестиИзображениеЭлементаНоменклатуры ( ДокументРезультат , Поле . Значение , ОбластьИзображения , ШиринаКолонкиИзображения );
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПроцессорВывода . ЗакончитьВывод ();
Для удобства процедура вывода изображения выделена в отдельную, эта процедура просто получает данные для вывода рисунка, выводит его (используя функцию), настраивает его оформление.
Процедура ВывестиИзображениеЭлементаНоменклатуры ( ТД , ЭлементСправочника , Область , ШиринаКолонкиИзображения )
Если ЭлементСправочника . ТипХраненияФайла = Перечисления . ТипыХраненияФайлов . ВИнформационнойБазе Тогда
СтуктураРег = РегистрыСведений . ПрисоединенныеФайлы . Получить (Новый Структура ("ПрисоединенныйФайл" , ЭлементСправочника ));
ДанныеКартинки = СтуктураРег . ХранимыйФайл . Получить ();
Иначе
ДанныеКартинки = ?( ЗначениеЗаполнено ( ЭлементСправочника . Том . ПолныйПутьWindows ), ЭлементСправочника . Том . ПолныйПутьWindows , ЭлементСправочника . Том . ПолныйПутьLinux )
+ ЭлементСправочника . ПутьКФайлу ;
КонецЕсли;
Рисунок = ВывестиИзображениеВОбластиТД ( ДанныеКартинки , ТД , Область );
Область . АвтоВысотаСтроки = Ложь;
Область . ВысотаСтроки = ШиринаКолонкиИзображения * 1.31 / 0.3759 ; // Среднее значение пункта 1 пункт = 0.3759 мм (по Wiki)
Область . Расшифровка = ЭлементСправочника ;
Рисунок . ЦветЛинии = Область.ЦветРамки ;
КонецПроцедуры
Из предыдущей процедуры вызывается функция, которая непосредственно выводит изображение в заданной области табличного документа
Функция ВывестиИзображениеВОбластиТД ( ДанныеКартинки , ТД , Область )
Изображение = ТД . Рисунки . Добавить ( ТипРисункаТабличногоДокумента . Картинка );
Изображение . РазмерКартинки = РазмерКартинки . АвтоРазмер ;
Индекс = ТД . Рисунки . Индекс ( Изображение );
ТД . Рисунки [ Индекс ]. Картинка = Новый Картинка ( ДанныеКартинки , Истина );
ТД . Рисунки [ Индекс ]. Расположить ( Область );
Возврат ТД . Рисунки [ Индекс ];
КонецФункции
Кроме того при компоновке используется процедура извлечения параметра из СКД:
Функция ВернутьЗначениеПараметраНастройкиСКД ( КоллекцияЭлементовНастройки , ИмяНастройки , ЗначениеПоУмолчанию = Неопределено)
Настройка = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( ИмяНастройки );
Если Настройка = Неопределено Тогда Возврат ЗначениеПоУмолчанию ; КонецЕсли;
НастрокаПоИД = КомпоновщикНастроек . ПользовательскиеНастройки . Элементы . Найти ( Настройка . ИдентификаторПользовательскойНастройки );
Если Не ЗначениеЗаполнено ( НастрокаПоИД . Значение ) Тогда
Если Не ЗначениеПоУмолчанию = Неопределено Тогда
НастрокаПоИД.Значение = ЗначениеПоУмолчанию;
КонецЕсли;
КонецЕсли;
Возврат ?( НастрокаПоИД.Использование , НастрокаПоИД.Значение , ЗначениеПоУмолчанию );
КонецФункции
В этой статье я расскажу, что такое постобработка в 1С СКД, какие методы постобработки существуют. Вы узнаете, как программно сформировать отчет в СКД, а также я приведу несколько практических примеров постобработки в СКД.
Итак, что же понимается под постобработкой в СКД. Обычно (если не всегда) такое словосочетание применяется для отчетов, построенных на СКД. В результате выполнения отчета пользователем мы имеем какой-то табличный документ. Не всегда с помощью функционала СКД удается получить необходимую форму табличного документа. Поэтому после (пост) выполнения отчета, с помощью методов объекта ТабличныйДокумент выполняется некоторая доработка результата до приемлемого вида (формы).
Чтобы вклиниться в процесс формирования отчета вам необходимо программно получить результат отчета. Поэтому постобработка ВСЕГДА связана с программным формированием отчета. Можно конечно на форме сделать специальную кнопку, чтобы пользователь нажимал ее после формирования отчета, но это будет выглядеть нелепо. Поэтому будем считать, что для постработки отчет на 1С СКД формируется программно всегда.
Есть два способа как можно программно выполнить отчет на СКД:
- Простой. Из формы отчета (нужно чтобы у отчета была форма) вызвать метод СкомпоноватьРезультат. Вы заменяете стандартную кнопку Сформировать собственной командой. В этой команде вызываете указанный выше метод, передав (в случае управляемой формы) режим компоновки – Непосредственно. Затем выполняете постобработку над полученным табличным документом (обычно это реквизит «Результат»). Метод неудобен тем, что нужно добавлять форму (если ее нет), нужно формировать отчет непосредственно, плюс довольно часто для доработки табличного документа нужно переходить на сервер (что не есть хорошо)
- Чуть сложнее. В модуле отчета в предопределенной процедуре «ПриКомпоновкеРезультата» программно формируете отчет. Стандартный шаблон (код) для этого приведен ниже. После получения табличного документа вы выполняете свой код постобработки. Для этого подхода существует еще один вариант реализации, когда обработка выполняется не после формирования табличного документа, а в процессе. Делается это с помощью поэлементного вывода в табличный документ с помощью методов процессора компоновки данных – НачатьВывод, Следующий, ВывестиЭлемент.
С помощью этого шаблона вы можете программно формировать отчет на СКД:
Теперь рассмотрим конкретные примеры, когда вам может понадобиться постобработка. В этих примерах я не всегда буду приводить полный код решения. Где-то будет достаточно идеи, а где-то ссылки на уже готовый отчет.
Вывод картинок
До недавнего времени только с помощью постобработки в отчетах на СКД можно было вывести картинки в отчете. Начиная с релиза платформы 8.3.14 в СКД 1С:Предприятие 8 появилась возможность вывода картинок без постобработки.
Вот такой кусок кода в ПриКомпоновкеРезультата выводить после программного формирования картинку в колонке прайса:
Отчет прайс лист мы разбирали в нашем курсе по СКД
Нумерация колонок отчета
Здесь мы рассмотрим вариант постобработки из формы отчета
Повторение шапки отчета и вывод колонтитулов
В этой статье на Инфостарте разбирается, как с помощью поэлементного вывода можно повторить шапку отчета на каждой странице и как вывести колонтитулы.
Повторение шапки реализуется кодом:
Вывод колонтитулов реализуется через свойство ВерхнийКолонтитул табличного документа:
«Красивые» заголовки для группировок колонок таблицы
Вот так заголовки выводятся совсем некрасиво:
Вот так чуть лучше:
Настройка для такого варианта (для второй и третей группировок колонок):
И только постобработкой (хотя может быть есть какой-то другой секретный способ) можно сделать так:
Вставить разрыв страницы для группировки
В этой статье на Инфостарте рассматривается способ как с помощью поэлементного вывода отчета можно добавить разрыв страницы для группировки в СКД
К сожалению, не всегда удается реализовать отчет на базе Системы компоновки данных (СКД). Иногда СКД настройка отчета подразумевает необходимость разрабатывать сложные алгоритмы сбора и подготовки данных. Но есть способ воспользоваться функциональностью СКД, если предварительно подготовить произвольные таблицы вне СКД.
Для разработки отчета на СКД из произвольных данных, нужно сделать следующее:
1. Создать отчет на СКД, в котором нужно добавить набор данных с типом «объект»;
2. Вывод результата СКД в форму программным способом;
3. В момент инициализации во внешние наборы данных должна быть передана подготовленная произвольная таблица.
СКД форма отчета - создаем отчет с набором «объект»
Лучше в качестве заготовки взять один из отчетов текущей системы 1С или сделать новый.
Добавляем новый набор данных, тип набора - «объект». Добавляем и настраиваем поля. У полей указываем тип и роль при необходимости.
Рис. 1. Набор данных с типом «объект»
1. Как вывести отчет СКД программно
В модуле отчета СКД заполняем предопределенную процедуру «ПриКомпоновкеРезультата». В процедуре стоит отказаться от стандартной обработки и реализовать программную обработку вывода СКД. Чтобы сформировать внешний отчет СКД, нужно выполнить последовательно компоновку макета, формирование внешних наборов данных, инициализацию процесса компоновки данных и вывод результата компоновки данных.
Рис. 2. Процедура «ПриКомпоновкеРезультата»
2. СКД: форма отчета через внешний набор данных перед выводом
В процедуру инициализации процессора компоновки данных нужно передать структуру «внешний набор данных», в которой добавить все внешние наборы отчета. Также можно передать в процедуру сбора данных необходимые отборы из настроек СКД.
В моем случае для примера использован простой запрос к регистру бухгалтерии. В реальной задаче это может быть сбор данных из нескольких сложно структурированных источников данных с предварительной обработкой или получение данных из других систем (например, через веб-сервис).
Рис. 3. Формирование произвольной таблицы
Таким способом можно упростить разработку отчетов, в которых нет возможности использовать СКД.
Теперь с помощью СКД можно производить гибкую настройку отчета. Например, добавлять нужные отборы, менять структуру, добавлять и убирать поля (и прочее) в форме отчета в пользовательском режиме. В случае программной реализации для этого потребовалось бы дорабатывать форму, обрабатывать запросы и менять макет вывода.
На рисунке ниже я добавил отбор по организации и вывел дополнительно единицу изменения номенклатуры в пользовательском режиме.
Рис. 4. Гибкая настройка в СКД
Руководитель отдела внедрения ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Как же теперь вывести картинки? Алгоритм примерно следующий. Перехватим обработчки ПриКомпоновкеРезультата(), последовательно пробежимся по всем ячейкам табличного документа и выведем вместо ХранилицеЗначения соответствующую картинку.
Процедура ПриКомпоновкеРезультата ( ДокументРезультат , ДанныеРасшифровки , СтандартнаяОбработка )
НастройкиКомпоновки = КомпоновщикНастроек . ПолучитьНастройки ();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( СхемаКомпоновкиДанных , НастройкиКомпоновки , ДанныеРасшифровки );
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки , , ДанныеРасшифровки );
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент ;
ПроцессорВывода . УстановитьДокумент ( ДокументРезультат );
ПроцессорВывода . Вывести ( ПроцессорКомпоновки );
Для ТекущаяСтрока = 1 По ДокументРезультат . ВысотаТаблицы Цикл
Для ТекущаяКолонка = 1 По ДокументРезультат . ШиринаТаблицы Цикл
ТекущаяОбласть = ДокументРезультат . Область ( ТекущаяСтрока , ТекущаяКолонка );
ТекущаяРасшифровка = ТекущаяОбласть . Расшифровка ;
Если ТипЗнч ( ТекущаяРасшифровка ) = Тип ( "ИдентификаторРасшифровкиКомпоновкиДанных" ) Тогда
ПоляРасшифровки = ДанныеРасшифровки . Элементы . Получить ( ТекущаяРасшифровка ). ПолучитьПоля ();
ПолеКартинки = ПоляРасшифровки . Найти ( "Картинка" );
Если ТипЗнч ( ПолеКартинки ) = Тип ( "ЗначениеПоляРасшифровкиКомпоновкиДанных" ) Тогда
ФайлКартинки = ПолеКартинки . Значение ;
Если ТипЗнч ( ФайлКартинки ) = Тип ( "ХранилищеЗначения" ) Тогда
КартинкаВДокументе = ДокументРезультат . Рисунки . Добавить ( ТипРисункаТабличногоДокумента . Картинка );
КартинкаВДокументе . Картинка = Новый Картинка ( ФайлКартинки . Получить ());
КартинкаВДокументе . РазмерКартинки = РазмерКартинки . Пропорционально ;
КартинкаВДокументе . Расположить ( ТекущаяОбласть );
Читайте также: