Рисуем штрих-код без компонент и картинкомагии в векторном SVG

01.06.26

Разработка - Работа с интерфейсом

Сборка штрих-кода в SVG текстом.

Зачем SVG?

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

SVG (Scalable Vector Graphics) здесь — идеальный инструмент:

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

  • Никаких зависимостей — не нужны ни BarCodes (которые есть не во всех конфигурациях), ни сторонние библиотеки, ни COM-объекты.

  • Кроссплатформенность — SVG-код работает везде, где работает 1С: на Windows, Linux (сервер 1С под Astra Linux, RedOS), в веб-клиенте и мобильной платформе.

  • Лёгкое преобразование — при желании SVG можно конвертировать в PNG, PDF (прямо штатными методами Картинка и ЗаписьТекста) или встроить в HTML-макет.

В этой статье реализована полноценная генерация штрихкода Code 128 (подмножество B) — самого распространённого формата для логистики, накладных и маркировки. Алгоритм самостоятельный: расчёт контрольной суммы, построение бинарной последовательности полос, отрисовка через XML-теги SVG.

 

 

Функция СгенерироватьШтрихкодSVG(ЗначениеШтрихкода, ВысотаКартинки = 50, ШиринаМодуля = 2)
	
	МассивПаттернов = СимволыШК();

	// --- АЛГОРИТМ ---
	// Используем Code 128 Subset B (позволяет кодировать ASCII 32-127)
	
	// 1. Старт
	ИндексСтарт = 104; // Start B
	БинарнаяСтрока = МассивПаттернов[ИндексСтарт];
	СуммаКонтрольная = ИндексСтарт;
	
	// 2. Тело
	ДлинаСтроки = СтрДлина(ЗначениеШтрихкода);
	Для Сч = 1 По ДлинаСтроки Цикл
		Символ = Сред(ЗначениеШтрихкода, Сч, 1);
		КодСимвола = КодСимвола(Символ);
		
		// Смещение для ASCII в Subset B: Пробел (32) = Индекс 0
		ИндексВТаблице = КодСимвола - 32;
		
		Если ИндексВТаблице < 0 ИЛИ ИндексВТаблице > 95 Тогда
			// Символ не поддерживается, заменяем на пробел или пропускаем
			ИндексВТаблице = 0; 
		КонецЕсли;
		
		БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[ИндексВТаблице];
		
		// Расчет контрольной суммы: (Старт + (Значение * Позиция)) % 103
		СуммаКонтрольная = СуммаКонтрольная + (ИндексВТаблице * Сч);
	КонецЦикла;
	
	// 3. Контрольная цифра (Checksum)
	ИндексЧексуммы = СуммаКонтрольная % 103;
	БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[ИндексЧексуммы];
	
	// 4. Стоп
	БинарнаяСтрока = БинарнаяСтрока + МассивПаттернов[106];
	
	// --- ГЕНЕРАЦИЯ SVG ---
	ОбщаяДлинаМодулей = СтрДлина(БинарнаяСтрока);
	ШиринаИтоговая = ОбщаяДлинаМодулей * ШиринаМодуля;
	
	// Начинаем SVG. Добавляем "тихие зоны" (quiet zones) по бокам, например по 10 модулей
	ОтступСлева = 10 * ШиринаМодуля;
	ШиринаХолста = ШиринаИтоговая + (ОтступСлева * 2);
	
	ТекстSVG = "<svg version=""1.1"" xmlns=""http://www.w3.org/2000/svg"" "
		+ "width=""" + Формат(ШиринаХолста, "ЧГ=") + """ height=""" + Формат(ВысотаКартинки, "ЧГ=") + """>"
		+ "<rect width=""100%"" height=""100%"" fill=""white""/>";
	
	// Рисуем полоски
	ТекущийX = ОтступСлева;
	
	Для Сч = 1 По ОбщаяДлинаМодулей Цикл
		Бит = Сред(БинарнаяСтрока, Сч, 1);
		Если Бит = "1" Тогда
			// Рисуем черный прямоугольник
			ТекстSVG = ТекстSVG + "<rect x=""" + Формат(ТекущийX, "ЧГ=") + """ y=""0"" "
				+ "width=""" + Формат(ШиринаМодуля, "ЧГ=") + """ height=""100%"" fill=""black""/>";
		КонецЕсли;
		ТекущийX = ТекущийX + ШиринаМодуля;
	КонецЦикла;
	
	ТекстSVG = ТекстSVG + "</svg>";
	
	// --- СОХРАНЕНИЕ ---
	ИмяВремSVG = ПолучитьИмяВременногоФайла("svg");
	ИмяВремPNG = ПолучитьИмяВременногоФайла("png");
	
	ЗаписьТекста = Новый ЗаписьТекста(ИмяВремSVG, "UTF-8");
	ЗаписьТекста.Записать(ТекстSVG);
	ЗаписьТекста.Закрыть();
	
	Двоичные = Неопределено;
	
	Попытка
		КартинкаSVG = Новый Картинка(ИмяВремSVG);
		КартинкаPNG = КартинкаSVG.Преобразовать(ФорматКартинки.PNG);
		КартинкаPNG.Записать(ИмяВремPNG);
		Двоичные = Новый ДвоичныеДанные(ИмяВремPNG);
	Исключение
		ЗаписьЖурналаРегистрации("BarcodeSVG_Error", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
	КонецПопытки;
	
	УдалитьФайлы(ИмяВремSVG);
	УдалитьФайлы(ИмяВремPNG);
	
	Возврат Двоичные;

КонецФункции
Функция СимволыШК()
	
	// Таблица символов Code128 (B). 
	// Каждый символ кодируется последовательностью толщин штрихов и пробелов.
	// 1 - штрих, 0 - пробел. Всего 11 модулей на символ.
	// Для экономии места закодируем их строкой, где индекс массива = значению символа.
	// Это стандартная таблица Code128.
	
	МассивПаттернов = Новый Массив;
	// 0-9 (Sp, !, ", #, $, %, &, ', (, ))
	МассивПаттернов.Добавить("11011001100"); // 0: Space
	МассивПаттернов.Добавить("11001101100"); // 1: !
	МассивПаттернов.Добавить("11001100110"); // 2: "
	МассивПаттернов.Добавить("10010011000"); // 3: #
	МассивПаттернов.Добавить("10010001100"); // 4: $
	МассивПаттернов.Добавить("10001001100"); // 5: %
	МассивПаттернов.Добавить("10011001000"); // 6: &
	МассивПаттернов.Добавить("10011000100"); // 7: '
	МассивПаттернов.Добавить("10001100100"); // 8: (
	МассивПаттернов.Добавить("11001001000"); // 9: )
	// 10-19 (*, +, ,, -, ., /, 0, 1, 2, 3)
	МассивПаттернов.Добавить("11001000100"); // 10: *
	МассивПаттернов.Добавить("11000100100"); // 11: +
	МассивПаттернов.Добавить("10110011100"); // 12: ,
	МассивПаттернов.Добавить("10011011100"); // 13: -
	МассивПаттернов.Добавить("10011001110"); // 14: .
	МассивПаттернов.Добавить("10111001100"); // 15: /
	МассивПаттернов.Добавить("10011101100"); // 16: 0
	МассивПаттернов.Добавить("10011100110"); // 17: 1
	МассивПаттернов.Добавить("11001110010"); // 18: 2
	МассивПаттернов.Добавить("11001011100"); // 19: 3
	// 20-29 (4, 5, 6, 7, 8, 9, :, ;, <, =)
	МассивПаттернов.Добавить("11001001110"); // 20: 4
	МассивПаттернов.Добавить("11011100100"); // 21: 5
	МассивПаттернов.Добавить("11001110100"); // 22: 6
	МассивПаттернов.Добавить("11101101110"); // 23: 7
	МассивПаттернов.Добавить("11101001100"); // 24: 8
	МассивПаттернов.Добавить("11100101100"); // 25: 9
	МассивПаттернов.Добавить("11100100110"); // 26: :
	МассивПаттернов.Добавить("11101100100"); // 27: ;
	МассивПаттернов.Добавить("11100110100"); // 28: <
	МассивПаттернов.Добавить("11100110010"); // 29: =
	// 30-39 (>, ?, @, A, B, C, D, E, F, G)
	МассивПаттернов.Добавить("11011011000"); // 30: >
	МассивПаттернов.Добавить("11011000110"); // 31: ?
	МассивПаттернов.Добавить("11000110110"); // 32: @
	МассивПаттернов.Добавить("10100011000"); // 33: A
	МассивПаттернов.Добавить("10001011000"); // 34: B
	МассивПаттернов.Добавить("10001000110"); // 35: C
	МассивПаттернов.Добавить("10110001000"); // 36: D
	МассивПаттернов.Добавить("10001100010"); // 37: E
	МассивПаттернов.Добавить("11010001000"); // 38: F
	МассивПаттернов.Добавить("11000101000"); // 39: G
	// 40-49 (H, I, J, K, L, M, N, O, P, Q)
	МассивПаттернов.Добавить("11000100010"); // 40: H
	МассивПаттернов.Добавить("10110111000"); // 41: I
	МассивПаттернов.Добавить("10110001110"); // 42: J
	МассивПаттернов.Добавить("10001101110"); // 43: K
	МассивПаттернов.Добавить("10111011000"); // 44: L
	МассивПаттернов.Добавить("10111000110"); // 45: M
	МассивПаттернов.Добавить("10001110110"); // 46: N
	МассивПаттернов.Добавить("11101110110"); // 47: O
	МассивПаттернов.Добавить("11010001110"); // 48: P
	МассивПаттернов.Добавить("11000101110"); // 49: Q
	// 50-59 (R, S, T, U, V, W, X, Y, Z, [)
	МассивПаттернов.Добавить("11011101000"); // 50: R
	МассивПаттернов.Добавить("11011100010"); // 51: S
	МассивПаттернов.Добавить("11011101110"); // 52: T
	МассивПаттернов.Добавить("11101011000"); // 53: U
	МассивПаттернов.Добавить("11101000110"); // 54: V
	МассивПаттернов.Добавить("11100010110"); // 55: W
	МассивПаттернов.Добавить("11101101000"); // 56: X
	МассивПаттернов.Добавить("11101100010"); // 57: Y
	МассивПаттернов.Добавить("11100011010"); // 58: Z
	МассивПаттернов.Добавить("11101111010"); // 59: [
	// 60-69 (\, ], ^, _, `, a, b, c, d, e)
	МассивПаттернов.Добавить("11001000010"); // 60: \
	МассивПаттернов.Добавить("11110001010"); // 61: ]
	МассивПаттернов.Добавить("10100110000"); // 62: ^
	МассивПаттернов.Добавить("10100001100"); // 63: _
	МассивПаттернов.Добавить("10010110000"); // 64: `
	МассивПаттернов.Добавить("10010000110"); // 65: a
	МассивПаттернов.Добавить("10000101100"); // 66: b
	МассивПаттернов.Добавить("10000100110"); // 67: c
	МассивПаттернов.Добавить("10110010000"); // 68: d
	МассивПаттернов.Добавить("10110000100"); // 69: e
	// 70-79 (f, g, h, i, j, k, l, m, n, o)
	МассивПаттернов.Добавить("10011010000"); // 70: f
	МассивПаттернов.Добавить("10011000010"); // 71: g
	МассивПаттернов.Добавить("10000110100"); // 72: h
	МассивПаттернов.Добавить("10000110010"); // 73: i
	МассивПаттернов.Добавить("11000010010"); // 74: j
	МассивПаттернов.Добавить("11001010000"); // 75: k
	МассивПаттернов.Добавить("11110110110"); // 76: l
	МассивПаттернов.Добавить("11101011010"); // 77: m
	МассивПаттернов.Добавить("11101010010"); // 78: n
	МассивПаттернов.Добавить("11100101010"); // 79: o
	// 80-89 (p, q, r, s, t, u, v, w, x, y)
	МассивПаттернов.Добавить("11100100100"); // 80: p
	МассивПаттернов.Добавить("11100100100"); // 81: q
	МассивПаттернов.Добавить("11100100100"); // 82: r
	МассивПаттернов.Добавить("11100100100"); // 83: s
	МассивПаттернов.Добавить("10011110110"); // 84: t
	МассивПаттернов.Добавить("10011110010"); // 85: u
	МассивПаттернов.Добавить("11110100100"); // 86: v
	МассивПаттернов.Добавить("11110010100"); // 87: w
	МассивПаттернов.Добавить("11110010010"); // 88: x
	МассивПаттернов.Добавить("11011011110"); // 89: y
	// 90-94 (z, {, |, }, ~)
	МассивПаттернов.Добавить("11011110110"); // 90: z
	МассивПаттернов.Добавить("11110110110"); // 91: {
	МассивПаттернов.Добавить("10101111000"); // 92: |
	МассивПаттернов.Добавить("10100011110"); // 93: }
	МассивПаттернов.Добавить("10001011110"); // 94: ~
	// 95-106 (System chars)
	МассивПаттернов.Добавить("10111101000"); // 95: DEL
	МассивПаттернов.Добавить("10111100010"); // 96: FNC3
	МассивПаттернов.Добавить("11110101000"); // 97: FNC2
	МассивПаттернов.Добавить("11110100010"); // 98: SHIFT
	МассивПаттернов.Добавить("10111011110"); // 99: CODE C
	МассивПаттернов.Добавить("10111101110"); // 100: CODE B (FNC4)
	МассивПаттернов.Добавить("11101011110"); // 101: CODE A
	МассивПаттернов.Добавить("11110101110"); // 102: FNC1
	МассивПаттернов.Добавить("11010000100"); // 103: Start A
	МассивПаттернов.Добавить("11010010000"); // 104: Start B (Наш старт!)
	МассивПаттернов.Добавить("11010011100"); // 105: Start C
	МассивПаттернов.Добавить("1100011101011"); // 106: Stop (Жирный)
	
	Возврат МассивПаттернов
	
КонецФункции

 

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

Вступайте в нашу телеграмм-группу Инфостарт

Штрих-код svg png pdf печатные формы

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    84935    60    42    

71

Работа с интерфейсом Рабочее место 1С:Предприятие 8 1C:Бухгалтерия 1С:Комплексная автоматизация 2.х Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). В комплект поставки включены Расширения для легкого подключения данного функционала в БК, УТ, КА и ERP. Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу. Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6100 руб.

16.01.2015    68709    46    60    

85

Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами (виджетами) в 1С.

5246 руб.

29.06.2020    25028    34    6    

53

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    2328    3    0    

2

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.

36600 руб.

28.08.2025    8306    2    2    

6

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    50684    mrXoxot    44    

139

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    26823    smielka    39    

117

Инструментарий разработчика Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

3 стартмани

10.04.2023    17731    182    acces969    31    

132
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4921 01.06.26 22:12 Сейчас в теме
Автор, кто вам сказал, что Code128 самый распространённый? Различные EANы как минимум не уступают ему.
Мысль в целом хорошая, публикация полезная.
Но хочется и для других типов тоже.
3. Baronello 5 01.06.26 22:49 Сейчас в теме
(1) Железному дураку напиши это пожелание, калибра дипсик или гемини, думаю справится. Отладка со смартфоном легко происходит.

А так QR много лучше, ибо документы имею привычку мяться, а коробки всякие бывает пинают. Тут просто не было задачи менять формат.
6. Yashazz 4921 02.06.26 10:49 Сейчас в теме
(3) с железными дураками дело имею исключительно как с продвинутыми поисковиками, код сам пишу.
7. Baronello 5 02.06.26 11:02 Сейчас в теме
(6) Уже 10+ лет как либа на JS разрабатывается и лежит на гитхабе, всё уже написано.
5. RocKeR_13 1478 02.06.26 09:26 Сейчас в теме
(1)
Автор, кто вам сказал, что Code128 самый распространённый? Различные EANы как минимум не уступают ему.

По стандарту EAN может содержать только цифры, поэтому для логистики (как указано у автора) все-таки EAN используется только для идентификации товаров, а вот для штрихкодирования документов, упаковок и прочих вещей - там уже как минимум Code128. Хотя и он сейчас уже потихоньку уходит в прошлое: в условиях маркировки и наличия у всех (почти) 2D-сканеров проще формировать всеми любимые QR-коды - они и компактнее, и универсальнее, и читаются лучше
Baronello; +1 Ответить
2. RustIG 1955 01.06.26 22:25 Сейчас в теме
что-то подобное другими методами было https://infostart.ru/1c/tools/321943/
вообще, любопытно разобраться,что вы придумали :)
Baronello; +1 Ответить
4. Baronello 5 01.06.26 23:24 Сейчас в теме
(2) Вроде ничего, кроме кода под 1С, этой либе на JS 10+ лет. https://github.com/lindell/JsBarcode Там даже такое есть. https://lindell.me/JsBarcode/generator/
8. avbolshakov 02.06.26 14:50 Сейчас в теме
(4) простите, не очень понял. попробовал ваше решение - работает, всё здорово, средствами самой платформы. А при чём тут js библиотека? или вы задумку оттуда взяли?
9. Baronello 5 02.06.26 15:07 Сейчас в теме
(8) Моё чутье на попранное авторское железным дураком право подсказывает, что именно оттуда он и слизывал код, когда я предложил ему написать сабж, больно похоже на bin/barcodes/CODE128/CODE128.js. И там все остальные форматы поддерживаются, модульность красивая, текст можно прилепить и тд, чего в статье нету, можно слизывать дальше.
10. avbolshakov 02.06.26 15:15 Сейчас в теме
(9) ок. так и попробую. токены надо куда-то девать. Спасибо за статью
Baronello; +1 Ответить
11. 1cembreg 25 02.06.26 17:08 Сейчас в теме
Честно говоря рассчитывал на красивую работу с svg через ЗаписьXML - а в статье обычный конкат, ну такое. Но - лайк, подписка
Baronello; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация