Добавление QR-кода в печатные формы документов — одна из наиболее частых задач при автоматизации бизнес-процессов. Это необходимо для быстрой оплаты счетов по государственным стандартам, маркировки товаров, мгновенного перехода по ссылкам или верификации документов. В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), для этого предусмотрен удобный встроенный функционал. Для быстрого проектирования собственных печатных форм можно использовать шаблон внешней подключаемой печатной формы для БСП.
Однако в процессе разработки специалисты часто сталкиваются с неочевидными техническими трудностями: от ошибок адресации графических объектов в макете до искажения кодировки русских символов. В этой статье мы подробно разберем, как реализовать этот механизм без ошибок, обеспечив совместимость с различными версиями БСП и корректную работу пользовательских макетов.
Перед тем как писать программный код, нам необходимо подготовить сам макет. Вывод графической информации в табличный документ 1С реализуется через коллекцию рисунков. Разберем этот процесс по шагам.
Откроем нужный макет печатной формы в Конфигураторе. Нам нужно добавить специальную область (строку или группу ячеек), где будет располагаться наш графический элемент. Назовем эту область, например, "Картинка2".
Теперь добавим сам графический объект в эту область:
Картинка1. Это критически важно, так как именно по этому имени мы будем обращаться к объекту из программного кода.Посмотрим на частую ошибку начинающих разработчиков. Попытка напрямую присвоить картинку области макета через конструкцию вида ОбластьКартинка.Рисунки.Картинка = КартинкаQRКода вызовет системную ошибку. Выясним причину: свойство Рисунки — это коллекция всех графических объектов в области макета. Чтобы изменить конкретное изображение, мы должны сначала обратиться к конкретному рисунку по его имени, а уже затем — к его свойству Картинка.
Для генерации изображения QR-кода мы воспользуемся стандартным методом общего модуля БСП УправлениеПечатью. Этот метод обращается к native-компоненте генерации штрихкодов, поставляемой вместе с платформой 1С:Предприятие.
Проанализируем базовый алгоритм генерации. Сначала мы подготавливаем текстовую строку, которую необходимо закодировать. Затем вызываем функцию генерации, получаем двоичные данные картинки, преобразуем их в объект типа Картинка и помещаем в наш макет.
Рассмотрим пример кода, реализующий этот алгоритм:
// 1. Получаем область макета, где расположен наш рисунок-заглушка
ОбластьКартинка = Макет.ПолучитьОбласть("Картинка2");
// 2. Формируем строку для кодирования (текст ссылки, реквизиты или служебные данные)
QRСтрока = "https://example.com/document/verification";
// 3. Генерируем двоичные данные QR-кода через функции БСП
// Параметры метода: Строка, УровеньКоррекцииОшибка, РазмерИзображения
ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 0, 150);
Если ЗначениеЗаполнено(ДанныеQRКода) Тогда
// 4. Создаем объект Картинка на основе полученных двоичных данных
КартинкаQRКода = Новый Картинка(ДанныеQRКода);
// 5. Заменяем изображение в конкретном рисунке макета
ОбластьКартинка.Рисунки.Картинка1.Картинка = КартинкаQRКода;
// 6. Выводим сформированную область в итоговый табличный документ
ДокументРезультат.Вывести(ОбластьКартинка);
КонецЕсли;
Иногда при переносе кода между разными базами данных (например, из ЗУП в КА или ERP) возникает ошибка времени выполнения: "Слишком много фактических параметров". Проанализируем причину этой проблемы. Если доработка печатных форм ведется в рамках миграции учёта в отдельную систему, можно изучить раздел с готовыми решениями для переноса данных ЗУП.
В более старых версиях Библиотеки стандартных подсистем функция ДанныеQRКода принимала ровно 3 параметра:
Строка — кодируемый текст.УровеньКоррекции — число от 0 до 3, определяющее избыточность информации для восстановления при повреждении кода.Размер — ширина и высота картинки в пикселях.В современных редакциях БСП у этой функции появился необязательный 4-й параметр — ТекстОшибки, в который функция может записывать подробности сбоя при генерации кода. Если ваша конфигурация использует старую версию БСП, передача четвертого параметра приведет к аварийному завершению работы программы.
Чтобы написать универсальный и безопасный код, мы рекомендуем отказаться от передачи четвертого параметра и вместо этого выполнять валидацию результата через проверку типа данных. Посмотрим, как это выглядит на практике:
// Вызываем функцию строго с тремя параметрами
ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 1, 190);
// Безопасная проверка результата генерации
Если ТипЗнч(ДанныеQRКода) = Тип("ДвоичныеДанные") Тогда
КартинкаQRКода = Новый Картинка(ДанныеQRКода);
// Используем защищенный блок на случай отсутствия рисунка в макете
Попытка
ОбластьКартинка.Рисунки.Картинка1.Картинка = КартинкаQRКода;
ДокументРезультат.Вывести(ОбластьКартинка);
Исключение
ЗаписьЖурналаРегистрации("ПечатьQRКода", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось найти графический объект Картинка1 в макете!");
КонецПопытки;
Иначе
ОбщегоНазначения.СообщитьПользователю("Не удалось сгенерировать QR-код. Возможно, превышена максимальная длина строки.");
КонецЕсли;
Часто в практической работе возникает ситуация: разработчик добавил область и рисунок в макет в Конфигураторе, протестировал — всё работает отлично. Однако у конечных пользователей QR-код в печатной форме не отображается. Для регулярного обслуживания и автоматического тестирования баз после внесения подобных изменений можно использовать инструмент для автоматического тестирования и обновления баз.
Разберем, почему так происходит. В БСП встроен механизм пользовательской настройки печатных форм. Если пользователь хотя бы один раз отредактировал макет в режиме «1С:Предприятие» (например, изменил шрифт, добавил логотип или логотип компании), система сохраняет этот измененный вариант макета непосредственно в базу данных. При формировании документа программа берет именно этот пользовательский макет, полностью игнорируя макет из конфигуратора.
Так как пользователь отредактировал форму до того, как вы добавили туда рисунок Картинка1, в его индивидуальном макете этого графического объекта просто не существует. Программа пытается обратиться к нему в коде, не находит его и «молча» или с ошибкой пропускает вывод.
Выясним, как решить эту проблему:
Картинка1.Ещё одна распространенная проблема — когда латинские символы в QR-коде считываются без проблем, а вместо русских букв сканер смартфона выдает строку из знаков вопроса (????????). Проанализируем возможные причины и пути их устранения.
Стандартная компонента генерации QR-кодов в 1С кодирует текст в формате UTF-8. Это общепринятый стандарт, однако некоторые приложения-сканеры на смартфонах некорректно распознают кодировку UTF-8, если в самом коде отсутствует специальный маркер кодировки (ECI-код). Они пытаются интерпретировать двоичный код в локальной однобайтовой кодировке (например, ISO-8859-1 или Windows-1252), что приводит к потере кириллических символов.
Решить эту проблему можно следующими способами:
А. Смена приложения для сканирования. Попробуйте отсканировать полученный код специализированным банковским приложением (например, СберБанк Онлайн) или продвинутым сканером штрихкодов. Банковские приложения жестко ориентированы на обработку кириллицы и без труда распознают кодировку UTF-8.
Б. Форматирование строки под стандарты ГОСТ. Если вы формируете QR-код для оплаты услуг или товаров физлицами (ГОСТ Р 56042-2014), убедитесь, что структура вашей строки строго соответствует спецификации. Например, заголовок строки должен иметь следующий вид:
// Пример формирования строки по ГОСТ в кодировке UTF-8
QRСтрока = "ST00012|Name=Получатель платежа|PersonalAcc=40702810000000000000|...|FormatVersion=UTF-8";
Наличие в строке явного указания FormatVersion=UTF-8 помогает принимающему терминалу или мобильному приложению банка безошибочно выбрать нужную кодовую страницу для декодирования кириллицы.
В. Настройка региональных стандартов сервера 1С. В редких случаях сама операционная система сервера 1С:Предприятие может некорректно преобразовывать строки из UTF-16 (внутренний стандарт 1С) в UTF-8 при передаче данных в native-компоненту печати штрихкодов. Это происходит, если системная локаль сервера (System Locale) установлена отличной от русской. Убедитесь, что в региональных настройках операционной системы сервера выбран русский язык.
Мы детально рассмотрели процесс интеграции QR-кодов в печатные формы 1С. Соблюдение этих правил и использование защищенных методов обращения к коллекциям макета позволит вам создавать надежные и отказоустойчивые решения для любого прикладного решения на платформе 1С:Предприятие 8.