Разработка и Конфигурация · 11 мин
Как создать штрихкод в 1С программно
Как создать штрихкод в 1С программно: генерация EAN-13, вывод на форму и в макет, проверка контрольной цифры, типовые ошибки и примеры кода на встроенном языке.
Программное создание штрихкода в 1С сводится к двум задачам: сформировать строку кода (например, EAN-13 с корректной контрольной цифрой) и отобразить его графически — на форме, в табличном документе или на этикетке. В типовых конфигурациях для этого служит компонента печати штрихкодов и подсистема работы с оборудованием, а в самописных решениях часто используют шрифт со штрихкодом или внешнюю компоненту.
Важно разделять понятия: штрихкод как последовательность цифр — это просто строка, которую можно сгенерировать любым алгоритмом. А штрихкод как изображение — это графическое представление по стандарту (EAN-13, Code 39, QR и другие), которое формирует специальная компонента или шрифт. Ошибка на любом из двух этапов приводит к тому, что сканер код не читает.
Ниже разобраны рабочие способы: генерация EAN-13 с расчётом контрольной цифры, вывод через компоненту «1С:Печать штрихкодов», использование шрифта, запись штрихкода в регистр сведений и проверка результата сканером.
Как устроен штрихкод EAN-13 и зачем нужна контрольная цифра
EAN-13 — самый распространённый формат в розничной торговле. Он состоит из 13 цифр: префикс (обычно 2–3 цифры страны или диапазон внутреннего использования), код организации и товара, а последняя, тринадцатая цифра — контрольная. Она не выбирается произвольно, а рассчитывается по алгоритму: цифры на нечётных позициях суммируются как есть, на чётных — с весом 3, затем сумма дополняется до ближайшего десятка.
Если контрольная цифра неверна, сканер либо не считает код вовсе, либо кассовая программа отклонит его при проверке. Поэтому генерировать «случайные» 13 цифр нельзя — последнюю нужно всегда вычислять. Для внутреннего учёта принято использовать префиксы из диапазона 200–299: они зарезервированы для применения внутри предприятия и не конфликтуют с кодами производителей.
Генерация кода EAN-13 на встроенном языке
Функция расчёта контрольной цифры занимает несколько строк. На вход подаётся строка из 12 цифр, на выходе — полный тринадцатизначный код:
Функция КонтрольнаяЦифраEAN13(Код12)
Сумма = 0;
Для Поз = 1 По 12 Цикл
Цифра = Число(Сред(Код12, Поз, 1));
Если Поз % 2 = 0 Тогда
Сумма = Сумма + Цифра * 3;
Иначе
Сумма = Сумма + Цифра;
КонецЕсли;
КонецЦикла;
Возврат (10 - Сумма % 10) % 10;
КонецФункции
Дальше остаётся собрать базовую часть кода. Практичный вариант — префикс внутреннего диапазона плюс порядковый номер из нумератора или кода номенклатуры, дополненный нулями слева до нужной длины:
Функция СформироватьШтрихкод(ПорядковыйНомер)
База = "200" + Формат(ПорядковыйНомер, "ЧЦ=9; ЧВН=; ЧГ=");
Возврат База + КонтрольнаяЦифраEAN13(База);
КонецФункции
Обратите внимание: порядковый номер должен быть уникальным в пределах базы. Если брать код элемента справочника, учитывайте, что при перенумерации или обмене между базами коды могут совпасть. Надёжнее хранить отдельный счётчик в константе или использовать нумератор с контролем уникальности.
Вывод штрихкода в макет через компоненту печати
В типовых конфигурациях (УТ, КА, ERP, Розница) изображение штрихкода строится компонентой «1С:Печать штрихкодов», которая поставляется вместе с платформой и подключается как внешняя компонента. Картинка вставляется в табличный документ как объект рисунка.
Типовой фрагмент кода выглядит так: создаётся область макета, в неё помещается рисунок, а для рисунка вызывается метод формирования изображения штрихкода с параметрами — тип кода, строка кода, ширина и высота:
// Подключение компоненты (в типовых — через БСП)
Компонента = ОбщегоНазначения.ПодключитьКомпонентуИзМакета(
"ПечатьШтрихкодов", "ОбщийМакет.КомпонентаПечатиШтрихкодов");
ПараметрыКода = Новый Структура;
ПараметрыКода.Вставить("ТипКода", 1); // EAN-13
ПараметрыКода.Вставить("Штрихкод", "2000000001237");
ПараметрыКода.Вставить("Ширина", 200);
ПараметрыКода.Вставить("Высота", 100);
Картинка = Компонента.СформироватьШтрихкод(ПараметрыКода);
Рисунок = ТабДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Картинка;
Точные имена методов зависят от версии библиотеки стандартных подсистем и конфигурации. В УТ 11 и Рознице есть готовые процедуры подсистемы печати этикеток и ценников — чаще всего достаточно вызвать их, передав таблицу товаров, а не работать с компонентой напрямую.
Альтернатива: шрифт со штрихкодом и QR-коды
Шрифтовой способ
Если внешнюю компоненту подключить нельзя (например, ограничения безопасности на сервере), используют шрифты вроде EanGnivc или Code39. Принцип: в макет выводится обычный текст, но ячейке назначается специальный шрифт, который отображает символы как штрихи. Для EAN-13 текст перед выводом нужно преобразовать по правилам шрифта — просто подставить цифры недостаточно.
Минус способа — шрифт должен быть установлен на каждом компьютере, где печатают этикетки. При отсутствии шрифта вместо штрихкода напечатается обычный текст, и заметить это можно только визуально.
QR-коды
Для QR-кодов в платформе есть встроенные средства отображения в табличном документе без внешних компонент — через свойство рисунка с типом QR. Это удобно для платёжных кодов, ссылок и маркировки. QR не требует контрольной цифры и вмещает произвольный текст, но для товарного учёта на кассе стандартом остаётся линейный EAN-13.
Сравнение способов вывода
Стандартный путь в типовых конфигурациях, поддерживает много форматов. Требует подключения компоненты на рабочем месте.
Работает без компонент, но шрифт нужен на каждом ПК, а строку нужно кодировать по правилам шрифта.
Не требует ничего внешнего, но подходит только для QR, не для товарного EAN-13.
Хранение штрихкодов и привязка к номенклатуре
Сгенерированный код нужно где-то хранить. В типовых конфигурациях для этого существует регистр сведений «Штрихкоды номенклатуры» (в разных конфигурациях название может отличаться): измерения — номенклатура, характеристика, упаковка; ресурс — строка штрихкода. Запись выполняется через менеджер записи:
Запись = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
Запись.Номенклатура = ТоварСсылка;
Запись.Штрихкод = НовыйШтрихкод;
Запись.Записать();
Перед записью обязательно проверяйте уникальность: один и тот же штрихкод не должен быть привязан к двум разным товарам, иначе сканер на кассе будет находить непредсказуемую позицию. В типовых конфигурациях такая проверка встроена в модуль набора записей, при самописном решении её нужно реализовать запросом.
Массовая генерация для справочника
Типовая задача — присвоить штрихкоды всей номенклатуре, у которой их нет. Алгоритм: запросом выбрать товары без записи в регистре, в цикле сформировать код от текущего значения счётчика, записать, увеличить счётчик. Выполняйте такую обработку в транзакции с разумными порциями (например, по 1000 записей), чтобы не блокировать таблицу надолго в рабочей базе.
- 1Определите префикс внутреннего диапазона (200–299) и источник уникального номера
- 2Сформируйте 12-значную базу кода и рассчитайте контрольную цифру
- 3Проверьте запросом, что такой код ещё не используется в регистре штрихкодов
- 4Запишите код в регистр сведений с привязкой к номенклатуре
- 5Выведите этикетку в макет и проверьте чтение сканером
Проверка результата и типичные ошибки
Финальная проверка — только сканером или хотя бы мобильным приложением чтения штрихкодов. Визуально корректная картинка может не читаться из-за слишком маленького размера, недостаточного контраста или обрезанных краевых зон (quiet zones) — пустых полей слева и справа от штрихов, без которых сканер не распознаёт код.
При печати на термопринтере этикеток проверьте, что ширина штрихкода в макете не меньше рекомендуемой для разрешения принтера: при сжатии узкие штрихи сливаются. Также не масштабируйте рисунок непропорционально — изменение соотношения ширины штрихов нарушает стандарт.
Как проверить результат
Сканер считывает код с первого раза, в 1С находится нужный товар
Код не читается или находится другая позиция
Пересчёт по формуле даёт 13-ю цифру кода
Расчёт не совпадает — код сгенерирован с ошибкой
Штрихи чёткие, по краям есть пустые поля
Штрихи размыты, код вплотную к краю или тексту
Запрос по коду возвращает ровно одну запись
Код привязан к двум и более товарам
Ещё одна частая проблема — попытка формировать изображение штрихкода в фоновом задании на сервере, где компонента не установлена. Компоненту нужно устанавливать и на сервер 1С, либо переносить формирование картинки на клиентское место печати.
FAQ
Можно ли использовать готовые штрихкоды производителя вместо генерации своих?
Да, и это предпочтительный вариант для маркированных производителем товаров: код считывается с упаковки сканером и записывается в регистр при оприходовании. Собственную генерацию применяют для товаров без заводского кода — весовых, штучных изделий собственного производства, комплектов.
Какой формат выбрать, если 13 цифр EAN-13 не хватает для кодирования данных?
Для внутреннего учёта с произвольными данными подойдёт Code 128 — он кодирует буквы и цифры переменной длины и поддерживается компонентой печати штрихкодов. Для объёмных данных (ссылки, составы, JSON) используйте QR-код. Но помните: кассовое оборудование и товароучётные схемы чаще всего рассчитаны именно на EAN-13.
Нужно ли регистрировать свои штрихкоды в GS1?
Для кодов внутреннего диапазона 200–299 регистрация не требуется — они действуют только внутри вашей организации. Регистрация в GS1 нужна, если вы производитель и ваши товары со штрихкодом уходят во внешнюю торговую сеть, где код должен быть глобально уникальным.
Почему штрихкод формируется на экране, но не печатается на принтере этикеток?
Чаще всего причина в том, что компонента печати штрихкодов установлена не на том рабочем месте, с которого идёт печать, либо макет этикетки рассчитан под другое разрешение принтера. Проверьте также, не обрезает ли драйвер принтера края области печати — штрихкоду нужны пустые поля по бокам.
Как сгенерировать штрихкоды для большого справочника, не останавливая работу пользователей?
Выполняйте обработку порциями в транзакциях ограниченного размера, в нерабочее время или с минимальным приоритетом. Предварительно отберите запросом только позиции без штрихкодов, чтобы не перечитывать весь справочник, и ведите счётчик так, чтобы при повторном запуске генерация продолжилась с нужного номера.
Что важно запомнить
Программный штрихкод в 1С — это рассчитанная по формуле строка (для EAN-13 обязательна контрольная цифра) плюс её графический вывод через компоненту печати или шрифт. Храните коды в регистре сведений с контролем уникальности, используйте внутренний диапазон 200–299 и всегда проверяйте итоговую этикетку сканером.