Опять баян
Тема с добавлением картинок в отчеты на СКД появляется периодически на просторах сообщества и вне его. Самыми популярными задачами являются добавление логотипа компании в шапку отчета и отображение картинок товаров.
Почти всегда эти требования появляются для прайс-листов, но бывают и исключения.
Сегодня рассмотрим решения обоих кейсов, а также новые возможности платформы для вывода картинок.
Кейс №1: Логотип в шапке отчета
Начнем с простой задачи - вывод логотипа в шапку отчета на СКД.
Хочу логотип
И так, у нас есть простой внешний отчет "Прайс-лист", в котором для номенклатуры выводятся цены в разрезе их типов. Отчет создан для типовой конфигурации "Управление торговлей" версии 11. На следующем скриншоте представлен вывод для стандартных настроек отчета.
Наша задача заключается в добавлении в шапку табличного документа отчета логотипа компании. Для этого нам необходимо программно сформировать отчет и вставить изображение логотипа. Теперь подробнее.
Подготовка
Для начала нам необходимо подготовить изображение для логотипа. Во внешний отчет добавим макет табличного документа "Логотип", в который вставим объект "Картинка" с необходимым изображением.
Не забудьте создать область табличного документа для ячеек, где находится изображение логотипа. В текущем примере область названа "Логотип". Также нужно создать область "СвернутьЛоготип", которая будет использоваться для сворачивания/разворачивания логотипа в сформированном отчете.
Теперь нам необходимо вмешаться в процесс компоновки отчета программным образом. Для этого в модуле объекта отчета в процедуре-обработчике "ПриКомпоновкеРезультата" напишем алгоритм формирования отчета. На первом этапе сформируем отчет таким, какой он был без логотипа. Алгоритм процедуры будет следующим:
Алгоритм программного исполнения отчета не имеет ничего особенного, все стандартно. Перейдем непосредственно к решению поставленной задачи. Выводить логотип из дополнительного макета будем перед выполнением процессора вывода компоновки, но после очистки табличного документа. Итоговый программный код вывода логотипа в шапке отчета приведен на следующем листинге:
На этом процесс модификации отчета закончен. Посмотрим результат работы в режиме предприятия.
В режиме предприятия
Запустим созданный отчет в режиме предприятия. Мы увидим следующую картину:
Как мы видим, в шапке табличного документа появился логотип, изображение которого мы добавили в дополнительный макет отчета. Благодаря группировке строк имеется возможность свернуть логотип.
Разумеется, предложенный способ не самый универсальный, так как при изменении логотипа компании будет необходимо изменять макет отчета в режиме конфигуратора. Более правильно было бы получить изображение из информационной базы, например из элемента справочника "Организации". К тому же в текущей реализации отчета пользователь не сможет отключить вывод логотипа, только свернуть его. Все эти недостатки решаются, но не в рамках данной статьи. Таким образом, мы получили отчет "Прайс-лист" с выводом логотипа компании.
Кейс №2: Вывод изображений номенклатуры
Теперь задача посложнее - нужно выводить изображения номенклатуры. Рассмотрим вариант решения по шагам.
Предисловие
Приходилось ли Вам решать задачу по выводу изображений в отчете, построенном на системе компоновки данных (СКД)? Если да, то наверняка возникали сложности с добавлением рисунка в результирующий табличный документ и стабильной работой отчета при изменении настроек вывода. В любом случае статья Вам будет полезна на будущее, потому что подобная задача может встретиться каждому разработчику.
Сегодня в статье рассмотрим возникающие проблемы при решении подобной задачи, а также реализацию универсального способа отображения картинок в отчете на СКД, работающего стабильно при любых изменениях варианта отчета пользователем.
В чем проблема?
Проблема с выводом картинок в отчете на СКД заключается в том, что механизм не поддерживает данную возможность сам по себе. Не смотря на то, что в конструкторе системы компоновки мы можем создавать собственные макеты, использовать их для вывода изображений не получится. При добавлении в макет объекта "Рисунок", в дальнейшем это изменение игнорируется компоновщиком.
Например, добавим в поле макета рисунок, как показано на следующем изображении:
В теории, СКД должна вывести в данной ячейке добавленный рисунок, но этого не происходит:
Как мы видим, создание собственного макета не является решением данной задачи. Использование собственного макета имеет весьма ограниченные возможности в сравнении с отчетами НЕ на СКД.
На просторах глобальной сети находил несколько вариантов решения по выводу изображений в подобных отчетах. В основном все они основывались на обработке табличного документа после вывода отчета, когда программным образом искалась колонка в табличном документе и обходилась в цикле для добавления в соответствующие ячейки рисунков. Однако после изменения настроек варианта отчета в пользовательском режиме подобные отчеты работали нестабильно. Представьте, что структура отчета вида "Список" была изменена на "Таблица". Тогда алгоритм сразу переставал работать, так как ориентироваться на колонку с изображениями уже было нельзя.
Рассмотрим универсальное решение данной задачи, работающее при любых настройках отчета и выполняемой достаточно оптимальным образом.
Универсальное решение
Так какое же решение использовать, чтобы сохранить все возможности СКД по настройке отчета и скорость его работы была на оптимальном уровне? Такое решение есть, давайте рассмотрим его подробно.
Начнем с того, что нам придется изменить макет СКД в конструкторе, но не для добавления туда картинки, а для изменения вывода ячейки, в которой будет отображаться картинка. Пример такого отчета будет делать для типовой конфигурации "Управление торговлей" версии 11. В соответствии с текущими настройками конфигурации, файлы картинок, как и все прикрепленные файлы, хранятся в регистре сведений "ДвоичныеДанныеФайлов" в ресурсе "ХранимыйФайл" (тип "ХранилищеЗначений"), при этом связь элемента справочника "Номенклатура" и значения в регистре сведений осуществляется через справочник "НоменклатураПрисоединенныеФайлы", в элементах которого хранится информация о загруженных файлах. В самой номенклатуре в реквизите "ФайлКартинки" выбирается основное изображение из справочника "НоменклатураПрисоединенныеФайлы".
Запрос отчета на СКД выбирает в запросе номенклатуру и ссылку на файл основного изображения. Если мы выведем отчет на такой стадии, то он будет выглядеть следующим образом:
Из рисунка выше мы видим, что в отчете ссылка на присоединенный файл (элемент справочника "НоменклатураПрисоединенныеФайлы") отображается в виде представления (реквизит "Наименование"). Чтобы вмешаться в процесс формирования отчета и отобразить изображение в табличном документе, нам необходимо изменить алгоритм компоновки отчета.
Для начала в обработчике "ПриКомпоновкеРезультата" модуля объекта отчета отключим стандартную обработку и сформируем отчет полностью программным образом.
Действия в программном коде подробно описаны в комментариях. Отмечу лишь важные моменты:
- В начале процедуры "ПриКомпоновкеРезультата" проводим инициализацию настроек.
- Далее по обычному алгоритму формируем отчет.
- Обязательно необходимо заполнить данные расшифровки, чтобы мы могли получать ссылки на данные, хранящиеся в ячейках табличного документа.
В результате выполнения отчета с внесенными изменениями, он выполнится точно таким же образом, как если бы мы никаких изменений не вносили.
Теперь самый важный момент: после вывода отчета в табличный документ (метод "Выполнить" процессора вывода) нам необходимо обойти ВСЕ ячейки табличного документа, и если в ячейке содержится поле расшифровки значения с типом "СправочникСсылка.НоменклатураПрисоединенныеФайлы", необходимо добавить в эту ячейку объект "Рисунок" и заполнить его изображением, хранящемся в регистре сведений (схему хранения изображений для справочника "Номенклатура" смотри выше). На следующем скриншоте приведен программный код для выполнения описанных действий:
Код имеет подробные комментарии. В общих чертах алгоритм проверяет все ячейки табличного документа на значение расшифровки "СправочникСсылка.НоменклатураПрисоединенныеФайлы". Если ячейка имеет поле расшифровки с соответствующим типом данных, то выполняется функция "ПолучитьИзображение", в качестве параметра которому передается значение расшифровки:
Может возникнуть логичный вопрос: "Почему не получить двоичные данные для изображений в одном запросе?". Ответ прост. Если мы будем получать изображения из регистра двоичных данных файлов в одном запросе, то очень велика вероятность получить ошибку "Недостаточно памяти", если размер выбираемых изображений будет очень большим.
Конечно, выполнять запрос в цикле тоже не правильно. Есть наиболее оптимальный способ получения изображений в нашем случае, но чтобы не усложнять пример оставим этот, относительно простой, способ получения картинок.
На этом реализация отчета закончена, посмотрим на его работу в режиме предприятия.
Что имеем
Сформируем отчет в виде простого списка номенклатуры. Результат будет следующим:
Теперь изменим настройки отчета. Вместо списка отчет будет иметь структуру таблицы, где строки - это ссылка на номенклатуру, а колонки - изображения.
Выше было упомянуто, что большинство решений по выводу картинок в отчетах на системе компоновки данных не работают стабильно для сложных вариантов настроек отчета пользователем.
Предложный подход позволяет вывести картинки для любой, даже самой сложной, структуры отчета и настроек отдельных полей. Давайте посмотрим на результат формирования отчета для новой настройки:
Таким образом, мы сделали отчет, в котором выводятся настройки практически для любой структуры вывода в настройках. Производительность отчета на приемлемом уровне: время выполнения отчета с картинками и без для 500 позиций номенклатуры изменилась незначительно (тест проводился на файловой базе). Подобный отчет будет работать в любом режиме запуска приложения (тонкий, толстый или веб-клиент). Разумеется, есть способы совершенствования предложенного способа вывода картинок в отчеты на СКД, но они выходят за рамки статьи. Думаю, что после экспериментов Вы все сделайте самостоятельно.
Платформенный путь
Хорошие новости! Платформа 1С начиная с версии 8.3.14 (причем режим совместимости тоже должен быть 8.3.14 и выше) позволяет штатными средствами выводить картинки в отчетах на СКД. Вот официальная информация. Использовать новый функционал проще простого! Нужно сделать следующие шаги:
- Убедиться, что у вас режим совместимости 8.3.14 и выше, иначе функционал не будет доступен.
- В запросе получить двоичные данные картинок в отдельном поле.
- Добавить это поле в выбранные поля.
- Добавить условное оформление для этого поля, указав отображение картинки, положение и размер. Последние две настройки по необходимости.
Конечно, есть и некоторые ограничения. Например, картинку в шапку Вы так не выведите, но для решения большинства задач работает отлично.
Спасибо за внимание
Благодарю за интерес к статье! Это не первая, и, я надеюсь, не последняя статья про вывод изображений в отчетах на СКД на Инфостарте. Ждем появления информации об опыте наших коллег. В будущем подходы к решению подобных задач могут измениться. Будем следить за событиями.
А пока всем удачи, здоровья, успехов! Подписывайтесь на канал, оставляйте комментарии. :)
Другие ссылки
-
Картинка в таблице СКД (управляемое приложение) на примере УТ11, простое решение "в лоб" или легкая модификация стандартного отчета Прайс-Лист
- Изменение в платформе 8.3.14 в части вывода изображений в СКД
- Програмное использование отбора в СКД. Картинки с СКД (1С Предприятие 8.2)
- Продажи и остатки в картинках. УТ 11