В современной логистике и складском учете часто возникает потребность в быстрой и точной идентификации первичных документов. Традиционные линейные штрихкоды (например, Code128 или EAN128) отлично справляются с хранением коротких идентификаторов, таких как номера накладных. Однако, как только нам требуется добавить в штрихкод дополнительные данные — например, сумму документа для быстрой сверки в фармацевтике или дату отгрузки — линейный код становится слишком длинным и плохо читаемым обычными сканерами. В таких случаях мы переходим к использованию QR-кодов. Рассмотрим детально, как реализовать этот переход в 1С, какие компоненты использовать и как избежать проблем с кодировкой.
Разберем ситуацию, когда в накладную необходимо упаковать не только GUID объекта, но и его итоговую сумму. В линейном штрихкоде Code128 каждый дополнительный символ увеличивает физическую длину полоски. При достижении определенного порога плотность печати становится настолько высокой, что малейшее загрязнение листа или низкое разрешение принтера делает считывание невозможным. QR-код является двумерным (матричным), что позволяет упаковывать сотни символов в компактный квадрат с высокой избыточностью данных для восстановления при повреждении. Проанализируем способы реализации этой задачи.
Это классический метод, который часто встречается в старых конфигурациях или при доработке обычных форм. Компонента 1C:Печать штрихкодов позволяет программно управлять параметрами формирования изображения. Выясним, как правильно настроить свойства объекта в макете.
Для генерации QR-кода через эту компоненту необходимо установить свойство ТипКода в значение 16. Рассмотрим пример программной настройки рисунка в макете:
// Получаем область макета с рисунком штрихкода
ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
РисунокШК = ОбластьМакета.Рисунки.ШтрихкодРисунок;
// Устанавливаем тип QR-кода
РисунокШК.Объект.ТипКода = 16;
// Указываем сообщение для кодирования (например, GUID + сумма)
ДанныеДляКода = Строка(СсылкаНаОбъект.УникальныйИдентификатор()) + "|" + Формат(СуммаДокумента, "ЧЦ=15; ЧДЦ=2; ЧГ=0");
РисунокШК.Объект.Сообщение = ДанныеДляКода;
// Текст, который будет отображаться под кодом (обычно для QR отключают)
РисунокШК.Объект.ОтображатьТекст = Ложь;
Важно помнить, что при использовании 1c.Barcode автоматический выбор режима кодировки (цифровой, алфавитный или байтовый) происходит внутри компоненты. Однако, если вы планируете использовать кириллицу, вы можете столкнуться с тем, что сканеры неверно интерпретируют символы из-за кодировки Windows-1251. Для корректной работы рекомендуется предварительно преобразовывать строку в UTF-8.
Если ваша конфигурация построена на базе БСП (Библиотека стандартных подсистем), использование внешних ActiveX компонент считается устаревшим и не кроссплатформенным решением. Посмотрим, как реализовать генерацию через методы БПО, которые работают в тонком клиенте и под Linux.
В современных системах рекомендуется использовать метод МенеджерОборудованияВызовСервера.ПолучитьШтрихкодКартинкой(). Этот метод возвращает готовую картинку, которую можно просто поместить в рисунок табличного документа. Разберем шаги:
Преимущество этого метода: вам не нужно регистрировать .ocx библиотеки на каждом рабочем месте пользователя, так как генерация происходит нативно или через поставляемые с конфигурацией компоненты.
Мало кто знает, что платформа 1С начиная с версии 8.3.6 поддерживает генерацию штрихкодов без внешних библиотек вообще. Это самый надежный способ. Проанализируем, как это работает в коде:
// Создаем рисунок в табличном документе
ТабДок = Новый ТабличныйДокумент;
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Штрихкод);
// Настраиваем параметры QR-кода
Рисунок.Объект.ТипКода = ТипКодаШтрихкода.QR;
Рисунок.Объект.Сообщение = "Ваши данные для сверки";
Рисунок.Объект.УровеньКоррекцииОшипок = УровеньКоррекцииОшибокШтрихкода.Q; // Высокий уровень выживаемости кода
// Устанавливаем положение на листе
Рисунок.Верх = 10;
Рисунок.Лево = 10;
Рисунок.Ширина = 40;
Рисунок.Высота = 40;
Использование свойства УровеньКоррекцииОшибок позволяет сделать код читаемым даже при частичном повреждении бумаги, что критически важно для условий склада или транспортировки в фармацевтической отрасли.
При передаче данных в QR-код мы должны придерживаться определенных правил, чтобы автоматизированная сверка проходила успешно. Разберем основные моменты:
1. Структурирование данных: Вместо простой склейки строк лучше использовать разделители (например, символ |) или формат JSON. Это позволит при считывании кода обратно в 1С быстро разложить строку в массив или структуру с помощью метода СтрРазделить().
2. Проблема кириллицы: Если в QR-коде передаются наименования товаров или контрагентов на русском языке, платформа может передать их в системной кодировке. Чтобы внешние сканеры (включая смартфоны) понимали текст, необходимо использовать функции преобразования в UTF-8. В БСП для этого есть готовые методы в модуле РаботаСОбластямиДанных или ОбщегоНазначения.
3. Размер и печать: Убедитесь, что свойство рисунка в макете "Размер картинки" установлено в значение Пропорционально. Если картинка будет растянута по одной из осей, геометрия квадратов (модулей) нарушится, и сканер не сможет определить опорные точки (три больших квадрата по углам).
Выяснив все нюансы, мы можем сделать вывод: для простых задач в старых системах достаточно настройки ТипКода = 16 в 1c.Barcode, но для стабильной и современной работы следует переходить на нативные механизмы платформы или методы БПО, обеспечивая при этом корректную кодировку UTF-8 для кириллических данных. При необходимости использовать готовое прикладное решение для вывода матричного штрихкода в печатный документ подойдёт обработка для формирования счета с QR-кодом на оплату.