При доработке стандартной обработки печати этикеток и ценников в конфигурации «1С:Управление торговлей 10.3» часто возникает необходимость добавить логотип компании или графический знак. На первый взгляд задача кажется простой — достаточно вставить объект в макет. Однако при формировании печатной формы изображение нередко пропадает, сжимается или смещается. Разберем по шагам причины такого поведения платформы и рассмотрим правильные способы размещения графических объектов на этикетке.
Проанализируем типовой механизм формирования этикетки в коде обработки. Для получения макета этикетки используется получение области по фиксированным координатам строк и колонок:
Макет = ПолучитьОбщийМакет("Этикетка");
ЭтикеткаОбласть = Макет.ПолучитьОбласть(1, 1, 4, 2);
В этом коде кроются две основные причины, из-за которых добавленный графический объект не выводится на печать:
ПолучитьОбласть(1, 1, 4, 2) извлекает строго прямоугольник с 1-й по 4-ю строку и с 1-й по 2-ю колонку. Если графический объект расположен на макете свободно и хотя бы на один пиксель выступает за пределы указанных координат (например, задевает 5-ю строку или 3-ю колонку), платформа полностью исключает его из результирующего табличного документа.ОбластьНоменклатура.ВысотаСтроки = ВысотаЭтикетки * 2.65 * 0.13). Если объект не привязан к конкретной ячейке, изменение высоты строк смещает или деформирует его.Если логотип является статичным и одинаков для всех товаров, модифицировать программный код модуля обработки необязательно. Разберем правильный порядок действий:
1, 1, 4, 2.При таком подходе объект автоматически попадает в результирующую область ЭтикеткаОбласть и выводится на печать без дополнительных правок в коде.
Если требуется динамически подставлять изображение (например, логотип конкретного бренда, знак соответствия или изображение из базы данных), воспользуемся программным управлением коллекцией Рисунки табличного документа.
Рассмотрим, как инициализировать объект, загрузить данные и спозиционировать его в именованной области макета:
// Получаем область этикетки
ЭтикеткаОбласть = Макет.ПолучитьОбласть(1, 1, 4, 2);
// Получаем именованную область ячеек, куда нужно поместить логотип
ОбластьДляКартинки = ЭтикеткаОбласть.Области.ОбластьЛоготип;
// Инициализируем картинку из нужного источника
КартинкаЛоготип = Новый Картинка("C:\Images\logo.png");
// Добавляем новый рисунок в область макета
РисунокЛого = ЭтикеткаОбласть.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокЛого.Картинка = КартинкаЛоготип;
// Привязываем рисунок к границам выбранной области
РисунокЛого.Расположить(ОбластьДляКартинки);
// Настраиваем режим отображения и отключаем рамку
РисунокЛого.РазмерКартинки = ИзменениеРазмераРисункаТабличногоДокумента.Пропорционально;
РисунокЛого.Линия = Новый Линия(ТипЛинииТабличногоДокумента.НетЛинии);
В зависимости от архитектуры решения картинка может загружаться из разных источников. Рассмотрим основные варианты:
КартинкаЛоготип = БиблиотекаКартинок.ЛоготипКомпании;
КартинкаЛоготип = Новый Картинка("C:\1C\logo.bmp");
ДвоичныеДанные = СтрокаИзСписка.Номенклатура.ОсновноеИзображение.Хранилище.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
КартинкаЛоготип = Новый Картинка(ДвоичныеДанные);
КонецЕсли;
При выводе графики на специализированные принтеры этикеток важно учитывать аппаратные ограничения оборудования:
Таб.ПолеСверху = 0;
Таб.ПолеСнизу = 0;
Таб.ПолеСлева = 0;
Таб.ПолеСправа = 0;
Картинка на каждой итерации цикла приводит к перерасходу оперативной памяти. Создавайте статичную картинку один раз перед началом цикла по товарам.