Почему не выводится QR-код на печатную форму в 1С и как правильно позиционировать элементы в ячейках макета?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с необходимостью вывода графической информации, такой как штрихкоды или QR-коды. Одной из наиболее распространенных ошибок при выводе таких данных является исключение: «Поле объекта не обнаружено» (при обращении к рисунку на макете, например, к объекту qrcode). Кроме того, нередко возникают сопутствующие вопросы верстки макетов, когда требуется расположить текстовые параметры по разным сторонам одной строки.

В этой статье мы подробно разберем причины возникновения ошибки с поиском картинки QR-кода на макете, рассмотрим эффективные способы ее устранения, включая программное создание графических объектов, а также изучим лучшие практики позиционирования данных в ячейках табличного документа.

Часть 1. Разбор ошибки «Поле объекта не обнаружено (qrcode)»

Проанализируем ситуацию, когда код генерации QR-кода успешно отрабатывает, двоичные данные картинки формируются, но при попытке присвоить картинку объекту макета система выдает ошибку. Типичный проблемный участок кода выглядит следующим образом:

ОбластьМакета.Рисунки.qrcode.Картинка = КартинкаQRКода;

Выясним причину, почему платформа 1С не может обнаружить элемент с именем qrcode в коллекции рисунков полученной области макета. Выделяют несколько основных факторов:

  1. Выход рисунка за границы выводимой области. Каждый рисунок (картинка) в макете жестко привязан к сетке строк и колонок. Если при получении области табличного документа с помощью метода ПолучитьОбласть() границы этой области (красные пунктирные линии в конфигураторе) хотя бы частично не захватывают ячейки, на которых расположен рисунок, этот рисунок не попадет в коллекцию Рисунки текущего объекта области. Соответственно, попытка обратиться к нему по имени вызывает программный сбой.
  2. Использование измененных пользовательских макетов. В современных конфигурациях 1С на базе БСП (Библиотеки Стандартных Подсистем) пользователи могут редактировать макеты печатных форм непосредственно в режиме «1С:Предприятие». Если для документа сохранен пользовательский макет, система проигнорирует ваши изменения в конфигураторе. В таком пользовательском макете объекта qrcode просто не существует.
  3. Некорректный тип графического объекта. Иногда разработчики вместо стандартного элемента «Картинка» добавляют на макет объект типа ActiveX, OLE-объект или элемент старой библиотеки «1С:Печать штрихкодов». У таких объектов совершенно другой набор свойств, и обращение к свойству Картинка вызывает ошибку.

Способ решения №1. Корректировка макета в конфигураторе

Рассмотрим по шагам, как исправить положение рисунка на макете табличного документа:

  1. Откройте макет печатной формы в конфигураторе.
  2. Убедитесь, что для вывода QR-кода используется объект типа «Картинка». Для этого перейдите в меню Таблица — Рисунки — Картинка. Добавьте пустой рисунок на макет, не выбирая файл изображения на диске.
  3. В свойствах добавленной картинки в поле Имя укажите точное наименование, например, qrcode.
  4. Внимательно проверьте границы области макета. Рисунок должен полностью находиться внутри ячеек, входящих в выводимую именованную область. Ни один край рамки рисунка не должен пересекать пунктирные линии границ строки или колонки области.
  5. В окне свойств рисунка установите свойство Размер картинки в значение Пропорционально. Это позволит избежать искажения геометрии QR-кода при изменении его размеров, что крайне важно для успешного считывания сканерами или смартфонами.

Способ решения №2. Универсальное программное добавление рисунка

Чтобы полностью обезопасить себя от смещения границ областей в макете или случайного удаления графического объекта пользователями, мы рекомендуем использовать полностью программный метод добавления рисунка в табличный документ. При таком подходе на самом макете вообще не требуется заранее создавать объект картинки.

Разберем пример кода, который динамически создает рисунок, помещает в него сформированные двоичные данные QR-кода и позиционирует его в строго определенных ячейках выведенной области:


// Получаем область из макета
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьДанныхQR");

// Формируем двоичные данные QR-кода через функции БСП
ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(СтрокаДанных, 0, 190);

Если ТипЗнч(ДанныеQRКода) = Тип("ДвоичныеДанные") Тогда
    
    КартинкаQRКода = Новый Картинка(ДанныеQRКода);
    
    // Создаем новый рисунок в коллекции рисунков полученной области
    НовыйРисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
    НовыйРисунок.Имя = "qrcode";
    НовыйРисунок.Картинка = КартинкаQRКода;
    
    // Настраиваем свойства отображения
    НовыйРисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
    
    // Отключаем отображение рамки вокруг штрихкода
    НовыйРисунок.ГраницаСверху = Ложь;
    НовыйРисунок.ГраницаСлева = Ложь;
    НовыйРисунок.ГраницаСправа = Ложь;
    НовыйРисунок.ГраницаСнизу = Ложь;
    
    // Определяем координаты размещения (строки и колонки внутри области)
    // Например, расположим картинку со 2-й по 5-ю строку и со 2-й по 4-ю колонку
    ОбластьДляРазмещения = ОбластьМакета.Область("R2C2:R5C4");
    НовыйРисунок.Расположить(ОбластьДляРазмещения);
    
КонецЕсли;

ТабличныйДокумент.Вывести(ОбластьМакета);

Использование метода Расположить() гарантирует, что рисунок будет строго вписан в указанные ячейки, не выйдет за их пределы и не сдвинет соседние элементы отчета.

Часть 2. Выравнивание параметров по разным сторонам строки

Второй частый вопрос верстки макетов, который упоминали участники обсуждения — это необходимость вывести внутри одной строки наименование товара по левому краю, а его цену или сумму по правому краю (например: НаименованиеТовара.........................150.00).

Важно понимать ограничение платформы 1С: ячейка табличного документа не поддерживает одновременное применение разных типов выравнивания для отдельных частей своего текста или разных параметров. Если в свойствах ячейки-шаблона задано выравнивание по левому краю, то весь текст шаблона будет прижат к левой стороне.

Посмотрим на два основных способа решения этой задачи.

Метод №1. Разделение ячеек на уровне колонок табличного документа (Рекомендуемый)

Самый простой, надежный и визуально красивый способ — это разделение одной широкой ячейки строки на две независимые колонки. Проанализируем этот процесс по шагам:

  1. В макете разделите общую ширину строки на две колонки (например, Колонка 4 под наименование и Колонка 5 под сумму).
  2. Для левой ячейки (Колонка 4) установите тип заполнения Параметр (имя параметра НаименованиеТовара) и выравнивание по горизонтали — Лево.
  3. Для правой ячейки (Колонка 5) установите тип заполнения Параметр (имя параметра СуммаПоТовару) и выравнивание по горизонтали — Право.
  4. Чтобы структура вышележащих строк макета (например, шапки таблицы) не нарушилась, в этих строках просто выделите ячейки колонок 4 и 5 и объедините их с помощью кнопки Объединить на панели инструментов «Табличный документ».

При таком подходе текст и числа будут идеально выровнены по краям, независимо от длины наименования товара и разрядности цены.

Метод №2. Программное заполнение строки разделителями (Моноширинный хак)

Если по какой-то причине изменять структуру колонок макета категорически нельзя, задачу можно решить программным расчетом длины строки и заполнением свободного пространства символами-разделителями (например, точками или пробелами).

Важное ограничение: этот метод корректно работает исключительно при использовании моноширинных шрифтов (таких как Courier New), где каждый символ, включая пробел и точку, имеет одинаковую физическую ширину в пикселях. При использовании пропорциональных шрифтов (Arial, Calibri, Tahoma) правый край строки неизбежно будет «плыть».

Рассмотрим пример функции, формирующей такую строку:


Функция СформироватьСтрокуСВыравниванием(Знач Наименование, Знач Цена, Знач ПредельнаяШиринаЯчейки) Экспорт
    
    // Переводим цену в строковый формат
    СтрокаЦена = Формат(Цена, "ЧЦ=15; ЧДЦ=2; ЧГ=0");
    
    // Вычисляем длину текста без разделителей
    ДлинаТекста = СтрДлина(Наименование) + СтрДлина(СтрокаЦена);
    
    // Рассчитываем необходимое количество заполняющих точек
    КоличествоТочек = ПредельнаяШиринаЯчейки - ДлинаТекста;
    
    Если КоличествоТочек > 0 Тогда
        СтрокаТочек = "";
        Для Счетчик = 1 По КоличествоТочек Цикл
            СтрокаТочек = СтрокаТочек + ".";
        КонецЦикла;
        Возврат Наименование + СтрокаТочек + СтрокаЦена;
    Иначе
        // Если текст не влезает, обрезаем наименование под размер ячейки
        ДоступнаяДлинаНаименования = ПредельнаяШиринаЯчейки - СтрДлина(СтрокаЦена) - 3;
        СокращенноеНаименование = Лев(Наименование, ДоступнаяДлинаНаименования) + "...";
        Возврат СокращенноеНаименование + СтрокаЦена;
    КонецЕсли;
    
КонецФункции

В макете для ячейки вывода этой строки необходимо установить моноширинный шрифт и тип заполнения Параметр. В коде заполнения параметров печатной формы достаточно вызвать эту функцию:


ОбластьМакета.Параметры.СтрокаТовара = СформироватьСтрокуСВыравниванием(Выборка.Наименование, Выборка.Сумма, 45);

Мы подробно проанализировали причины сбоев при работе с рисунками в табличных документах 1С и изучили практические инструменты для создания красивых, адаптивных и безошибочно работающих печатных форм с поддержкой QR-кодов.

← На главную