При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с необходимостью вывода графической информации, такой как штрихкоды или QR-коды. Одной из наиболее распространенных ошибок при выводе таких данных является исключение: «Поле объекта не обнаружено» (при обращении к рисунку на макете, например, к объекту qrcode). Кроме того, нередко возникают сопутствующие вопросы верстки макетов, когда требуется расположить текстовые параметры по разным сторонам одной строки.
В этой статье мы подробно разберем причины возникновения ошибки с поиском картинки QR-кода на макете, рассмотрим эффективные способы ее устранения, включая программное создание графических объектов, а также изучим лучшие практики позиционирования данных в ячейках табличного документа.
Проанализируем ситуацию, когда код генерации QR-кода успешно отрабатывает, двоичные данные картинки формируются, но при попытке присвоить картинку объекту макета система выдает ошибку. Типичный проблемный участок кода выглядит следующим образом:
ОбластьМакета.Рисунки.qrcode.Картинка = КартинкаQRКода;
Выясним причину, почему платформа 1С не может обнаружить элемент с именем qrcode в коллекции рисунков полученной области макета. Выделяют несколько основных факторов:
ПолучитьОбласть() границы этой области (красные пунктирные линии в конфигураторе) хотя бы частично не захватывают ячейки, на которых расположен рисунок, этот рисунок не попадет в коллекцию Рисунки текущего объекта области. Соответственно, попытка обратиться к нему по имени вызывает программный сбой.qrcode просто не существует.Картинка вызывает ошибку.Рассмотрим по шагам, как исправить положение рисунка на макете табличного документа:
qrcode.Чтобы полностью обезопасить себя от смещения границ областей в макете или случайного удаления графического объекта пользователями, мы рекомендуем использовать полностью программный метод добавления рисунка в табличный документ. При таком подходе на самом макете вообще не требуется заранее создавать объект картинки.
Разберем пример кода, который динамически создает рисунок, помещает в него сформированные двоичные данные QR-кода и позиционирует его в строго определенных ячейках выведенной области:
// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьДанныхQR");
// Формируем двоичные данные QR-кода через функции БСП
ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(СтрокаДанных, 0, 190);
Если ТипЗнч(ДанныеQRКода) = Тип("ДвоичныеДанные") Тогда
КартинкаQRКода = Новый Картинка(ДанныеQRКода);
// Создаем новый рисунок в коллекции рисунков полученной области
НовыйРисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Имя = "qrcode";
НовыйРисунок.Картинка = КартинкаQRКода;
// Настраиваем свойства отображения
НовыйРисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
// Отключаем отображение рамки вокруг штрихкода
НовыйРисунок.ГраницаСверху = Ложь;
НовыйРисунок.ГраницаСлева = Ложь;
НовыйРисунок.ГраницаСправа = Ложь;
НовыйРисунок.ГраницаСнизу = Ложь;
// Определяем координаты размещения (строки и колонки внутри области)
// Например, расположим картинку со 2-й по 5-ю строку и со 2-й по 4-ю колонку
ОбластьДляРазмещения = ОбластьМакета.Область("R2C2:R5C4");
НовыйРисунок.Расположить(ОбластьДляРазмещения);
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьМакета);
Использование метода Расположить() гарантирует, что рисунок будет строго вписан в указанные ячейки, не выйдет за их пределы и не сдвинет соседние элементы отчета.
Второй частый вопрос верстки макетов, который упоминали участники обсуждения — это необходимость вывести внутри одной строки наименование товара по левому краю, а его цену или сумму по правому краю (например: НаименованиеТовара.........................150.00).
Важно понимать ограничение платформы 1С: ячейка табличного документа не поддерживает одновременное применение разных типов выравнивания для отдельных частей своего текста или разных параметров. Если в свойствах ячейки-шаблона задано выравнивание по левому краю, то весь текст шаблона будет прижат к левой стороне.
Посмотрим на два основных способа решения этой задачи.
Самый простой, надежный и визуально красивый способ — это разделение одной широкой ячейки строки на две независимые колонки. Проанализируем этот процесс по шагам:
НаименованиеТовара) и выравнивание по горизонтали — Лево.СуммаПоТовару) и выравнивание по горизонтали — Право.При таком подходе текст и числа будут идеально выровнены по краям, независимо от длины наименования товара и разрядности цены.
Если по какой-то причине изменять структуру колонок макета категорически нельзя, задачу можно решить программным расчетом длины строки и заполнением свободного пространства символами-разделителями (например, точками или пробелами).
Важное ограничение: этот метод корректно работает исключительно при использовании моноширинных шрифтов (таких как Courier New), где каждый символ, включая пробел и точку, имеет одинаковую физическую ширину в пикселях. При использовании пропорциональных шрифтов (Arial, Calibri, Tahoma) правый край строки неизбежно будет «плыть».
Рассмотрим пример функции, формирующей такую строку:
Функция СформироватьСтрокуСВыравниванием(Знач Наименование, Знач Цена, Знач ПредельнаяШиринаЯчейки) Экспорт
// Переводим цену в строковый формат
СтрокаЦена = Формат(Цена, "ЧЦ=15; ЧДЦ=2; ЧГ=0");
// Вычисляем длину текста без разделителей
ДлинаТекста = СтрДлина(Наименование) + СтрДлина(СтрокаЦена);
// Рассчитываем необходимое количество заполняющих точек
КоличествоТочек = ПредельнаяШиринаЯчейки - ДлинаТекста;
Если КоличествоТочек > 0 Тогда
СтрокаТочек = "";
Для Счетчик = 1 По КоличествоТочек Цикл
СтрокаТочек = СтрокаТочек + ".";
КонецЦикла;
Возврат Наименование + СтрокаТочек + СтрокаЦена;
Иначе
// Если текст не влезает, обрезаем наименование под размер ячейки
ДоступнаяДлинаНаименования = ПредельнаяШиринаЯчейки - СтрДлина(СтрокаЦена) - 3;
СокращенноеНаименование = Лев(Наименование, ДоступнаяДлинаНаименования) + "...";
Возврат СокращенноеНаименование + СтрокаЦена;
КонецЕсли;
КонецФункции
В макете для ячейки вывода этой строки необходимо установить моноширинный шрифт и тип заполнения Параметр. В коде заполнения параметров печатной формы достаточно вызвать эту функцию:
ОбластьМакета.Параметры.СтрокаТовара = СформироватьСтрокуСВыравниванием(Выборка.Наименование, Выборка.Сумма, 45);
Мы подробно проанализировали причины сбоев при работе с рисунками в табличных документах 1С и изучили практические инструменты для создания красивых, адаптивных и безошибочно работающих печатных форм с поддержкой QR-кодов.