Сегодня мы рассмотрим решение интересной задачи – вывод картинок в отчет.
Для чего это может быть полезно?
Вот несколько примеров:
- Прайс-лист с картинками товаров и логотипом в шапке
- Анкеты сотрудников с фотографиями
- Сверка расчетов с печатью и подписью в подвале
- Отчеты/печатные формы со сканом печати
В видео мы также разбираем программное формирование отчета на СКД. Такой способ формирования отчетов используется в типовых конфигурациях – это еще одна причина посмотреть его внимательно : )
Предопределенные макеты в СКД
С помощью предопределенных макетов можно переопределять стандартное оформление отчета.
В этом уроке помимо постановки задачи рассмотрим:
- Хранение бинарных данных в модельной конфигурации
- Возможность использования макетов СКД для вывода изображений
Программное формирование отчета на СКД
Чтобы решить задачу вывода изображений в отчет на СКД, необходимо его сформировать программно.
Именно при программном формировании отчета возможно обратиться к бинарным данным.
В ходе этого урока выполним:
- Вывод результата компоновки в табличный документ
- Использование объекта ДанныеРасшифровки
- Получение бинарных данных из базы
- Программное создание рисунков в табличном документе
Отображение картинки в отчете СКД
В этом уроке выполняем финальные действия: полученные ранее бинарные данные выводим в отчет.
Для этого рисунок добавляется в табличный документ, после чего он выводится в отчет.
Универсальность алгоритма вывода картинок
Разработанный алгоритм вывода изображений является универсальным – при любом изменении структуры отчета алгоритм продолжает работать.
Собственно, это мы и докажем в данном уроке.
Кроме этого, рассмотрим особенность фонового формирования отчета на СКД (построение отчета с помощью регламентных заданий).
Вывод изображения в шапке отчета
Часто в шапке или подвале отчета нужно вывести статичную картинку.
Казалось бы, простая задача, но в случае с СКД нужно знать, как ее решить:
- Шаг 1. Программно формируем отчет
- Шаг 2. Создаем отдельный макет с нужной шапкой или подвалом
- Шаг 3. Перед заполнением отчета СКД выводим секцию с нужными данными.
В этом видео наглядно показано решение задачи.
Приятного просмотра! :)
Последние несколько дней мы публикуем материалы по СКД.
А что если программист/внедренец 1С не знает СКД? Может, это реально не так важно?
Ok, давайте рассмотрим, что будет ждать специалиста, который пишет отчеты «на коленке» (например, с помощью ручного вывода в табличный документ).
Не стреляйте в пианиста, он играет, как умеет.
Отчеты практически во всех типовых конфигурациях базируется на СКД.
Для специалиста без знаний СКД доработка типовых отчетов становится лотереей – почему и как в отчете выводится та или иная цифра, как добавить новые источники, где в коде править расчетные цифры…
СКД – стандарт отчетов в типовых конфигурациях, и 1С не пишет комментарии в расчете на тех, кто стандарты еще так и не изучил :)
Куча времени к черту…
Без СКД разработка отчетов выполняется во многом вручную.
Это, конечно, круто – выйти как рембо с отверткой в зубах и типа сделать всех :)
В результате – большие трудозатраты на разработку отчета и его отладку. И любого руководителя/ заказчика это будет как минимум настораживать: “странно, а он точно в этом разбирается??”
А если речь заходит о последующей доработке отчета, это часто становится головной болью (особенно, если это чужой отчет)…
Развивающие поездки к клиентам, чтобы поменять группировку в отчете
СКД позволяет получать качественные отчеты без программирования. Костяк делается за несколько минут, дальше – бантики.
А пользователи могут донастраивать такие отчеты без привлечения программиста, формировать несколько вариантов представления – диаграммы, графики, списки, таблицы.
Добиться такой универсальности в отчетах, построенных программно, невозможно в разумные сроки.
Поэтому – звонок, трамвай, поехали… Это такой профессиональный рост для 1С-ника…
“У вас нет такого же, но с перламутровыми пуговицами? – К сожалению – нет…” (с)
А если какие-то данные нужно получить из другой системы – из другой базы 1С или вообще не из 1С?
С помощью СКД можно создать отчет, который работает и с данными текущей ИБ и получает данные из другого источника – программирования для этого не потребуется.
Без СКД внешние данные будут получаться программно и не самым тривиальным способом.
Если Вы хотите профессионально освоить СКД и ежедневно применять в своей работе, записывайтесь на курс:
«Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)»
Поддержка – 2 месяца. Объем курса – 34 учебных часа.
Не откладывайте свое обучение!
А если я вывожу печатные формы с картинкой в шапке нескольких документов? Тогда как вставлять картинку, если это не отдельное поле и не шапка всего табличного документа?
Добрый день!
В таком случае предлагаю при помощи СКД только получать необходимые для формирования печатной формы данные, а выводить эти данные в табличный документ при помощи программного кода и заранее подготовленного макета. Тогда можно при выводе разместить картинку в произвольной ячейке.
А если в макет нужно встроить печать и подпись поверх текста, а не в ячейку, как это можно сделать? Можно ли вообще размещать объект “Рисунок” в своём макете на СКД (имею ввиду, чтобы он вывелся, размещать то можно) ?
Добрый день!
В процедуре ПриКомпоновкеРезультата можно отключить стандартную компоновку отчета, скомпоновать его самостоятельно и программно доработать получившийся табличный документ – разместить в нем рисунки с печатью и подписью.
Добрый вечер. Справилась с прайсом для Розницы, но отчет выводится дважды: первый раз с картинкой, как нужно, ниже на экране такой же отчет (включая информацию об отборе), но в таблице вместо картинки имя файла. Что то можете посоветовать?
Добрый день!
Предполагаю, что в процедуре ПриКомпоновкеРезультата в модуле объекта не указано
В таком случае сначала выводится отчет с Вашей программной обработкой, по Вашему алгоритму. А затем платформа выполняет стандартную компоновку этого же отчета, поскольку стандартная обработка не отключена. Получается, что фактически отчет выводится дважды.
В таком случае нужно в процедуру ПриКомпоновкеРезультата добавить строку кода:
Добрый день! Подскажите, не понял с 1 видео-уроком. Как картинка хранится в справочнике, в табличной части справочника, что за элемент? Или картинка по ссылке загружена с файла в базу и хранится в справочнике? Вообщем, непонятно. Помогите разобраться пожалуйста.
Добрый день!
В демо-конфигурации в справочнике Товары есть реквизит ФайлКартинки. Это ссылка на справочник ХранимыеФайлы. В этом справочнике есть реквизит ДанныеФайла (тип – ХранилищеЗначения). В этом реквизите и хранятся двоичные данные картинки.
Василий, добрый день! То, что Вы написали – это понятно, у меня так и было установлено, всё по аналогии с видео-уроком. Вопрос в другом: как программа понимает, какие именно картинки нужно отобразить, откуда загружаются картинки: с базы или с жёсткого диска компьютера? Потому что у меня в итоге, в отчете отобразилась пустая рамка в ячейке колонки “Картинка” без картинки.
Картинки загружаются из базы, из реквизита с типом ХранилищеЗначения.
Все действия выполняются в процедуре ПриКомпоновкеРезультата, где и размещаем картинку в ячейку табличного документа.
Значит с жёсткого диска картинка в базу загружается?. На видео я видел синюю ссылку “Загрузить файл с диска”. Я так понял, что при нажатии на эту ссылку, файл картинки загружается и сохраняется в базе?
Пользователь берет файл картинки с жесткого диска, загружает его в базу. Исходный файл можно после этого удалить. Для построения отчета используются двоичные данные картинки, которые хранятся в самой базе в реквизите с типом ХранилищеЗначения.
Доброго дня, понравился ваш урок. Подскажите, можно у вас приобрести данную обработку полностью (прайс-лист с картинками и шапкой) для ут11.3?
Добрый день!
В видеоуроке создается отчет для демо-конфигурации Управляемое приложение. Для УТ 11 он не подойдет, потому что структура данных в этих конфигурациях отличается.
Предоставление отчетов, которые использовались для записи видео, не предусмотрено.
Добрый день! Пытаюсь вашим способом вытащить картинки в отчет остатков на складах Розница 2,2, при отладке в поле Картинка в значении “Невозможно определить тип картинки”, и в отчете выходит просто имя файла картинки, я не могу понять в каком реквизите хранит файл Розница, нашел в справочнике НоменклатураПрикрепленныефайлы реквизит ФайлХранилище с типом ХранилищеЗначений, думал так сделать
Если ТипЗнч(ХранимыйФайл) = Тип(“СправочникСсылка.НоменклатураПрисоединенныеФайлы”) Тогда
Картинка = Новый Картинка(ХранимыйФайл.ФайлХранилище.Получить());
на что получаю так же имя файла в отчете
Добрый день!
Возможно, в Вашем случае картинки товаров хранятся не в самой базе, а как файлы на диске. А в базе только хранится путь к файлу.
В справочнике НоменклатураПрикрепленныефайлы анализируйте реквизиты ТипХраненияФайла (В томах на диске или В информационной базе), Том, ПутьКФайлу.
https://drive.google.com/file/d/1g6Q7fcfuavZ9c9IDRCb7v4RrRL5h0KK2/view?usp=sharing вот скрин Табло, Файлы хранятся в информационной базе
В таком случае нужно обратиться к регистру сведений ПрисоединенныеФайлы. В ресурсе ХранимыйФайл и будут записаны двоичные данные картинки.
Так в том то и дело, что такого регистра нет(
В УТ 11 сейчас смотрел – регистр именно так и называется.
Розницу 2.2 открыл (правда отраслевую), там тоже есть этот же регистр сведений ПрисоединенныеФайлы.
Значит, остается воспользоваться отладчиком – открываете карточку номенклатуры, присоединяете картинку, проходите по программному коду, смотрите, куда именно записываются данные.
Добрый день! Проблему решил, спасибо, но чуть по другому, в Рознице 2,2 есть регистр ДвоичныеДанныеФайлов вот в нем как раз то и храниться картинка.
Добрый день!
Отлично, что разобрались!
Здравствуйте, Василий. В третьем видео вы показываете, как можно сделать произвольную шапку в отчете на СКД. Если используется отчет с произвольным количеством колонок (например, отчет по продажам за каждый месяц), шапка, нарисованная в отдельном макете, начинает “съезжать” то вправо, то влево, в зависимости от количества этих самых колонок. Можно ли как-то побороть это?
Добрый день!
Можно попробовать применить метод, описанный на странице 17 вопросов и ответов по СКД, проектированию форм, навигации, панелям и т.п. (вопрос 7 по СКД). Используется макет заголовка, в ячейках указываются специальные “маркеры” — символы “??”, которые точно не встретятся нигде в отчете. После того, как весь табличный документ выведен, осуществляется поиск соседних ячеек с одинаковым текстом, начинающимся с “??”. Эти ячейки объединяются, получается общая шапка для колонок. В таком случае шапка не съедет, а одинаковые значения в заголовках будут объединены для более красивого внешнего вида отчета.
Полезный пример, жаль только, так и не понял зачем тогда в свойствах ячейки параметр “ПараметрКартинки”
Добрый день!
Этот параметр не используется системой компоновки. Если Вы укажете значение этого параметра, закроете конструктор схемы компоновки, а затем заново его откроете, то значение параметра будет пустое. Т.е. система не использует его для работы.
он не будет пустым, он сдвинется вниз на строку
Добрый день!
Не воспроизвелось такое поведение. На платформе 8.3.19 параметр отображается в списке параметров макета:
Раньше ПараметрКартинки не использовался конструктором схемы компоновки (проверил на 8.3.12).
Спасибо огромное.
С картинками все получилось.
Попыталась по аналогии сделать с диаграммой Ганта и как то не получилось (((
Может проведете мастер класс по выводу на печать диаграммы Ганта.
Добрый день!
В конфигурации УПП 1.3. есть отчет Занятость помещений. Можно в нем подсмотреть, как производится программная работа с диаграммой Ганта в модуле объекта.
Спасибо.
Где бы еще взять эту конфигурацию.
С уважением
Светлана
Любую конфигурацию можно взять только лицензионным способом.
Для начала попробуйте просто вывести диаграмму Ганта в табличный документ, пока не привязываясь к отчету, который нужно получить. На первом шаге нужно просто технически обеспечить вывод в табличный документ любой диаграммы Ганта:
//заполнение диаграммы
Затем в Ваш отчет добавляйте вывод такой диаграммы по данным из отчета. Можно при помощи компоновки выгружать данные в ТЗ, из нее и заполнять диаграмму.
Спасибо, очень помогло.
Вопрос, при коде:
“Картинка =Новый Картинка( ХранимыйФайл.Хранилище.Получить());” выдает ошибку: “Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика – ‘ПриКомпоновкеРезультата’
по причине:
{ВнешнийОтчет.ВнешнийОтчет1.МодульОбъекта(39)}: Ошибка при вызове конструктора (Картинка)
по причине:
Несоответствие типов (параметр номер ‘1’)”
Если просто: “Картинка = ХранимыйФайл.Хранилище.Получить();” тогда код отрабатывает нормально. С чем это может быть связано?
Спасибо за ответ.
Добрый день!
В таком случае в отладчике проверяйте типы данных, которые сохранены в хранилище.
В видео в хранилище находится тип ДвоичныеДанные, из которого формируется картинка.
Спасибо за ответ.
Добрый день.
Спасибо за пример.
Реализовали отчет на СКД с выводом картинок.
В итоге в веб-клиенте жуткие тормоза, подозрение на то, что табличный документ перегружен картинками.
Какие можете дать рекомендации по решению данной проблемы?
Добрый день!
Как вариант – попробуйте не выводить отчет со множеством картинок, а сохранить его в файл (например, XLS), пользователь пусть загружает его себе на компьютер. Тогда не нужно будет отображать всю эту информацию на экране.
Спасибо за пример!Но попробовал на Рознице 2.2.6.33 при получении двоичных данных из хранилища
Если ТипЗнч(ХранимыйФайл) = Тип(“СправочникСсылка.НоменклатураПрисоединенныеФайлы”) И ЗначениеЗаполнено(ХранимыйФайл) Тогда
Картинка = Новый Картинка(ХранимыйФайл.ФайлХранилище.Получить());
В картинке содержится, вместо ожидаемого,
Картинка : Вид – “Пустая” и НаборВариантов – “Невозможно определить тип картики”
И в ячейки пустая картинка
В чем может быть ошибка?
Добрый день!
Возможно файлы хранятся не в информационной базе, а в томах на диске:
В таком случае в самой базе в хранилище значения картинка не будет сохраняться.
Добрый день!
Возможно файлы хранятся не в информационной базе, а в томах на диске:
В таком случае в самой базе в хранилище значения картинка не будет сохраняться.
Василий, здравствуйте.
Делаю вывод картинки во внешней копии типового отчета Прайс-лист в УТ 11.3.4.21
платформа 8.3.10.2466.
Вот отчет: https://yadi.sk/d/ZemD6zue3Mfdk6
Имею ошибку в строке 65 модуля моего внешнего отчета.
Ошибка: https://www.screencast.com/t/fhuiwkot
В частности, вижу, что макет компоновки = Неопределено.
Не подскажите, в чем проблема.
По отладке вижу, что не формируется фоновое задание (не успех).
Добрый день!
По скриншоту видно, что проблема возникает из-за синтаксически некорректного текста запроса. Поэтому не происходит формирование отчета, завершается с ошибкой фоновое задание. А текст запроса схемы компоновки дорабатывается программно.
Рекомендую действовать следующим образом. Поскольку формирование отчетов происходит в фоновом задании, нужно включить автоматическое подключение фоновых заданий. Тогда можно будет отлаживать программный код. Интересует процедура в модуле объекта ПриКомпоновкеРезультата. Нужно установить точку останова на строке, где выполнены все подготовительные действия, программно доработан запрос схемы компоновки, начинается непосредственно компоновка. При помощи отладчика получить из схемы компоновки запрос, открыть его в конструкторе, локализовать синтаксически некорректный фрагмент. И самое главное – определить, какая из типовых процедур (или собственных доработок) искажает текст запроса.
Спасибо!
Спасибо за примеры.
Надо было решить подобную задачу. После просмотра видео уже стало многое понятно. А если прайс по шаблону: выводим 1-n строк из группы товаров и для них отдельная одна картинка. Можете вкратце совет дать?
Добрый день!
Я понял, что необходимо в отдельной колонке для нескольких строк вывести общую картинку. Тогда можно поступить следующим образом – выводим в табличный документ в отдельной колонке ссылку на справочник с хранилищем значения (т.е. с самой картинкой). У нас получится, что для нескольких соседних строк, которые относятся к одной группе товаров, будет одинаковое содержимое (или одинаковая ссылка в расшифровке ячейки). Затем в сформированном табличном документе проходим по нужной колонке, объединяем ячейки с одинаковым содержимым, выводим в объединенную ячейку общую картинку для группы.
Большое спасибо за пример. А можно получить конфигурацию с этим примером?
Доброго дня, Светлана!
Ссылки на типовые конфигурации фирмы «1С» на нашем сайте опубликовать не можем.
Пример действительно полезный, спасибо.
Хоть в данном решении предлагается постобработка скомпонованного результата, но решение получается в самом деле достаточно универсальным
Спасибо! Классный пример! Очень полезный!