В процессе автоматизации торговых процессов часто возникает задача сделать ценники или этикетки более информативными. Одним из самых востребованных запросов является вывод фотографии товара непосредственно на этикетку. Рассмотрим подробнее, почему стандартные средства не всегда позволяют сделать это «в один клик», и разберем по шагам технические способы реализации этой задачи.
Проанализируем типичную ситуацию: у нас есть справочник Номенклатура, и в нем присутствует реквизит, ссылающийся на хранилище с картинкой. Если база пуста, может потребоваться Загрузка изображений в номенклатуру из внешних каталогов, чтобы наполнить справочник КартинкиДляНоменклатуры с типом ХранилищеЗначений. При попытке редактировать шаблон этикетки в режиме 1С:Предприятие мы обнаруживаем, что наше поле с картинкой отсутствует в списке доступных для выбора.
Это происходит потому, что типовой редактор этикеток ожидает увидеть данные в формате, который он может интерпретировать как графический объект. Прямая ссылка на ХранилищеЗначений или на элемент справочника не дает системе понимания, что внутри находятся двоичные данные изображения. Для решения этой проблемы нам потребуется либо вмешательство в программный код, либо корректировка схемы компоновки данных (СКД).
Рассмотрим вариант, когда нам необходимо программно «подсунуть» картинку в макет. Этот метод наиболее гибкий, так как позволяет управлять процессом вывода в момент формирования печатной формы. Посмотрим на пример кода, который можно использовать в процедуре печати.
Сначала на макете этикетки необходимо разместить объект типа «Рисунок» и присвоить ему имя, например, ФотоТовара. Далее в коде формирования этикетки мы обращаемся к этому объекту:
// Получаем область макета
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Извлекаем двоичные данные из хранилища
ДанныеКартинки = СсылкаНаНоменклатуру.ОсновноеИзображение.Хранилище.Получить();
Если ТипЗнч(ДанныеКартинки) = Тип("ДвоичныеДанные") Тогда
// Создаем объект Картинка и помещаем его в именованный рисунок на макете
ОбластьМакета.Рисунки.ФотоТовара.Картинка = Новый Картинка(ДанныеКартинки);
КонецЕсли;
// Выводим область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
Данный подход эффективен, но требует понимания того, где именно в типовой конфигурации происходит цикл обхода этикеток. В типовых решениях (УТ 11, ERP, КА) печать этикеток реализована через обработку ПечатьЭтикетокИЦенников. Чтобы не менять типовой код, часто используют внешние обработки и расширения, такие как Печать этикеток и ценников с выбором из документов (ERP 2, КА 2, УТ 11), которые позволяют интегрировать этот процесс без снятия с поддержки.
Кроме того, нам придется найти место, где область макета заполняется данными из выборки.
Если мы хотим остаться в рамках типового функционала и позволить пользователю самостоятельно выбирать поле картинки в редакторе шаблонов, нам нужно «пробросить» это поле через систему компоновки данных. Рассмотрим, как это сделать с помощью расширения, чтобы не снимать основную конфигурацию с поддержки.
Пошаговый алгоритм настройки через СКД:
ПечатьЭтикетокИЦенников.ХранилищеЗначений, а преобразовать его в данные, которые СКД распознает как графические. В некоторых случаях достаточно вытянуть путь к файлу или поле типа ДвоичныеДанные.СформироватьСтруктуруДанных). Нам нужно явно указать, что наше новое поле имеет тип «Изображение».При использовании СКД важно помнить: если изображение хранится в стандартной подсистеме «Присоединенные файлы» (БСП), то в запросе следует обращаться к таблице присоединенных файлов и выбирать поле ФайлИнформационныйРесурс. Система 1С во многих типовых шаблонах уже умеет работать с этим полем автоматически.
Выясним, как упростить задачу, если в вашей конфигурации внедрена БСП. Вместо создания собственного справочника КартинкиДляНоменклатуры, мы рекомендуем использовать штатный механизм присоединенных файлов.
В современных версиях «1С:Управление торговлей» или «1С:Розница» уже реализован механизм вывода основного изображения. Если вы привяжете свои картинки к номенклатуре через стандартную кнопку «Файлы», то в редакторе этикеток поле «Изображение» должно появиться автоматически в списке доступных полей. Это происходит благодаря тому, что типовая СКД уже настроена на связь справочника Номенклатура с его присоединенными файлами.
Разберем ситуации, которые могут возникнуть при массовой печати ценников с картинками. Если вы печатаете 500-1000 этикеток за один раз, база данных и оперативная память компьютера могут испытывать серьезную нагрузку.
Проанализируем рекомендации по оптимизации:
ТабличныйДокумент желательно программно изменять разрешение изображения (делать resize). Нет смысла выводить картинку разрешением 4000x3000 пикселей в маленькое окошко 2x2 см на этикетке.JPG с умеренным сжатием. Если же на картинке есть текст или мелкие схемы, лучше подойдет PNG.В случаях, когда стандартный табличный документ 1С не обеспечивает нужного качества (например, картинки «мылятся» при печати на термопринтере), можно рассмотреть интеграцию с внешними редакторами, такими как BarTender. В этом сценарии 1С лишь подготавливает данные (включая пути к файлам картинок), а финальную отрисовку выполняет специализированный софт, использующий родные драйверы принтера этикеток.
Подводя итог, мы видим, что решение задачи вывода картинки зависит от архитектуры вашей базы. Для разовой задачи подойдет программная подмена рисунка в макете через ОбластьМакета.Рисунки, а для тиражируемого решения лучше использовать расширение и модификацию типовой СКД печати ценников.