Штрихи к портрету…

13.10.15

Учетные задачи - Печатные формы

Описываются принципы формирования одномерных штрих-кодов  стандарта Code128 в 1С стандартными средствами.
Приводятся примеры кода модулей для 1С: Предприятия 7.х/8.х

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

Как это реализовать стандартными средствами без применения внешних компонент и т.д.?

Все помнят времена, когда основным стандартом штрихкодирования был EAN-8/EAN-13. Любой «начинающий специалист» знал, что после установки 1С: Предприятия 7.7 необходимо установить шрифт с названием Ean… (ean13, eangnivc или аналогичный). Если этого не сделать, в декларациях вместо штрих-кода отображались бы огромные цифры.

Данный шрифт позволял формировать штрих-коды самым прямым методом – написанием цифр с использованием специального шрифта.

Например, ряд цифр 1...9, шрифт EANGnivc.

Заметим, что «кодируемые» цифры отображаются под соответствующим кодом, т.е. каждый символ шрифта содержит «штрих» и «кодируемую» цифру.

 

Минусом применения стандарта EAN-13 становится крайне ограниченный набор кодируемых символов (фактически, только цифры). В этой связи применение его, например, для кодификации документооборота неэффективно.

Следующим поколением штрих-кодирования является стандарт Code128(EAN-128) (далее – Стандарт), который позволяет кодировать не только цифры, но и буквы латиницы.

Для печати кодов Стандарта также разработан специальный шрифт – Code128. Однако напечатать коды Стандарта с использованием данного шрифта значительно сложнее.

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

Во-вторых, для повышения отказоустойчивости Стандарт требует в состав штрихкода включать специальные контрольно-управляющие символы (печатаются шрифтом Code128).

 

Схема Code128:

Start

1-й символ кода

2-й символ кода

.

.

.

.

n-й символ кода

Контроль

ный

символ

Stop

 

Посмотрим, как это реализовать средствами встроенного языка 1С: Предприятие 7.7/8.

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

Группа А – набор цифр, дополнительных символов и заглавных букв латинского алфавита

Группа B – набор цифр, дополнительных символов, заглавных и строчных букв латинского алфавита

Группа C – фактически, набор группы B  с несколько иным кодированием.

 

В соответствии с выбранной группой формируется первый символ (Start) формируемого кода. Применительно Start’ы будут иметь следующие ASCII-коды:

Группа

Код

A

203

B

204

C

205

 

Завершаться штрих-код должен Stop-символом, который независимо от группы имеет ASCII-код 206.

 

Осталось разобраться с принципом формирования контрольного символа.

Стандарт сообщает, что для расчета символа требуется:

  1. Коды всех символов помножить на весовой коэффициент (фактически, порядковый номер символа в коде, начиная с первого).
  2. Просуммировать полученные произведения и добавить к ним код Start’a (104-для A, 105 для B и 106 для C).
  3. Вычислить остаток от деления полученной суммы на 103.

 

Реализация в 1С осложняется разницей в несколько ином кодировании символов в Стандарте и шрифте. Для кода группы B для декодирования (определения кода для расчета суммы):

Код символа

Стандарт

0..31

64..95 (прибавление 64)

От 32

От 0 (вычитание 32)

 

Для кодирования (преобразования вычисленного остатка в код символа)

Стандарт

Код символа

0..94

32..126 (прибавление 32)

От 95

От 105 (прибавление 100)

 

Таким образом при формировании контрольного символа перед расчетом остатка от деления потребуется преобразовать коды символов кода. А затем полученный остаток преобразовать в код по иным правилам.

 

На встроенном языке 1С Предприятие 7/8 команда формирования штрихкода  

ШК = Симв(204)+Наименование+КонтрСимв(Наименование)+Симв(206)

 

 

Текст функции КонтрСимв(Наименование) для 1С: Предприятие 7 и 8

//Для 7.х
Функция КонтрСимв(Наим)
            Рез = 104;
            Дл = СтрДлина(Наим);
            Для Н=1 По Дл Цикл
                        Р = КодСимв(Лев(Наим,1));
                        Р = ?(Р>=32,Р-32,Р+64);
                        Рез = Рез+Р*Н;
                        Наим = Прав(Наим,СтрДлина(Наим)-1);
            КонецЦикла;
            Рез = Рез%103;
            Рез = ?(Рез>94,Рез+100,Рез+32);
            Возврат Симв(Рез);
КонецФункции

 

 

// Для 8.х
Функция КонтрСимв(Наим)
            Рез = 104;
            Дл = СтрДлина(Наим);
            Для Н=1 По Дл Цикл
                        Р = КодСимвола(Лев(Наим,1));
                        Р = ?(Р>=32,Р-32,Р+64);
                        Рез = Рез+Р*Н;
                        Наим = Прав(Наим,СтрДлина(Наим)-1);
            КонецЦикла;
            Рез = Рез%103;
            Рез = ?(Рез>94,Рез+100,Рез+32);
            Возврат Символ(Рез);
КонецФункции

 

 

Литература

ГОСТ 30743-2001 - Автоматическая идентификация. Кодирование штриховое. Спецификация символики Code 128 (Код 128) http://www.g-ost.ru/6846.html

Штрихкод Code128

См. также

SALE! 20%

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

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

28500 22800 руб.

21.04.2017    90178    105    39    

190

ККТ-ОНЛАЙН 54-ФЗ: Обработка для работы онлайн касс АТОЛ, ШТРИХ, VIKI PRINT и т.д. МАРКИРОВКА + ЭКВАЙРИНГ + БЕСПЛАТНЫЙ ДЕМО

ККМ Кассовые операции Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

4800 руб.

27.02.2017    763126    4668    9495    

2781

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    165968    679    362    

386

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 15300 руб.

06.10.2023    7292    21    6    

39

SALE! 10%

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 9504 руб.

29.10.2014    210175    620    524    

439

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110327    34    114    

178

Печать кассовых чеков на одну ККМ с нескольких рабочих мест для 1С:УТ11.х, КА2.х, Розница 2.х, УНФ, ERP 2.х, БП 3, БГУ2

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.4, 11.5, КА 2.4, 2.5, Розница 3.0, 2.3 и 2.2, УНФ 1.6, УНФ 3x, ERP 2.4, 2.5, БП 3, БГУ2 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4000 руб.

27.08.2018    115988    981    564    

827
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DoReMi 20.10.15 14:50 Сейчас в теме
Кто-нибудь нашел отличия между 7.7 и 8.х ? )
pahankill; RustIG; +2 Ответить
2. cassper 20.10.15 14:56 Сейчас в теме
(1) DoReMi,
Возврат Симв(Рез);

Возврат Символ(Рез);
3. DoReMi 20.10.15 16:03 Сейчас в теме
(2) cassper, точно! я к этой строке устал сравнивать :)
4. Sergey1CSpb 215 20.10.15 20:43 Сейчас в теме
Вообще-то, еще

Р = КодСимв(Лев(Наим,1));

и
 Р = КодСимвола(Лев(Наим,1));


Кстати, строка формирования штрихкода в v8 должна выглядеть так:
ШК = Символ(204)+Наименование+КонтрСимв(Наименование)+Символ(206)



На самом деле, задача была реализована в 7.7. Ну чтобы не отпугивать читателей, сделал "трансляцию" в код 8-ки. По-идее, только этими двумя функциями синтаксис и должен отличаться.
Честно скажу, 8-ю версию не проверял.
5. SlavaK 24.06.16 16:27 Сейчас в теме
Спасибо! Скачал в инете шрифт и использовал ваш код. Все работает! Проверял на 1С 8.3, УП. Запуск на тонком клиенте.
6. Sergey1CSpb 215 24.06.16 22:40 Сейчас в теме
(5) SlavaK, Спасибо за отзыв, коллега, хоть, увы, и без "лайка"))))).
А "УП" это УТ, УПП, или еще что-то?
7. mstvster 30.11.21 04:50 Сейчас в теме
Вот еще одна реализация кодирования строки в code 128. с переключением алфавитов внутри строки.

Функция CODE_129(Вых_строка_для_кодирования)      
	Строка_для_кодирования = 	СокрЛП(Вых_строка_для_кодирования);
	Символы_штрих_кода = 		СоздатьОбъект("СписокЗначений");	
	Текущий_алфавит = 			"*";
	
	Н=1;
	Пока Н <= СтрДлина(Строка_для_кодирования) Цикл
	    Символ_1 = Сред(Строка_для_кодирования,Н,1);                           
		Н = Н + 1;                                      
		//Пропустить символы больше 127
		Если КодСимв(Символ_1) > 127 Тогда
			Продолжить;
		КонецЕсли;	
		
		// Определение к какому алфавиту пренадлежит символ
        Если КодСимв(Символ_1) > 95 Тогда
			Алфавит = "B";
		Иначе	
			Алфавит = "A";
		КонецЕсли;                              
		Тек_символ = Символ_1;
		Если (Н <= СтрДлина(Строка_для_кодирования)) И (Найти("0123456789",Символ_1)>0) Тогда
			Символ_2 = Сред(Строка_для_кодирования,Н,1);                                                                     			
			Если Найти("0123456789",Символ_2) > 0 Тогда
				Алфавит = "C";
				Тек_символ = Тек_символ + Символ_2;
				Н = Н + 1;                    
			КонецЕсли;		
		КонецЕсли;	
		                
		// Добавить стартовок указание алфавита или переключить, если алфавит изменился
        Если Текущий_алфавит <> Алфавит Тогда         
			Если Алфавит = "A" Тогда 
				Если Текущий_алфавит = "*" Тогда
					// START-A             
					Символы_штрих_кода.ДобавитьЗначение("103","103");
				Иначе
					// Code-A      
					Символы_штрих_кода.ДобавитьЗначение("101","103");
				КонецЕсли;	
			ИначеЕсли Алфавит = "B" Тогда
				Если Текущий_алфавит = "*" Тогда
					// START-B
					Символы_штрих_кода.ДобавитьЗначение("104","104");	
				Иначе
					// START-B
					Символы_штрих_кода.ДобавитьЗначение("100","100");	
				КонецЕсли;	
			Иначе                       
				Если Текущий_алфавит = "*" Тогда
					// START-C
					Символы_штрих_кода.ДобавитьЗначение("105","105");		
				Иначе
					// START-C
					Символы_штрих_кода.ДобавитьЗначение("99","99");		
				КонецЕсли;	
			КонецЕсли;	
			Текущий_алфавит = Алфавит;
		КонецЕсли;	   
		                        
		// Добавляем символ в выходную строку
		Если Текущий_алфавит <> "C" Тогда
			Тек_символ = КодСимв(Тек_символ)-32;
		КонецЕсли;	
		Символы_штрих_кода.ДобавитьЗначение(Тек_символ,Тек_символ);	
		
	КонецЦикла;		
	
	//************** Расчет проверочного кода ***************     
	Стр = "";
	Пров_код = Число(Символы_штрих_кода.ПолучитьЗначение(1,Стр));
	Для Н=2 по Символы_штрих_кода.РазмерСписка() Цикл
		Пров_код = Пров_код + (Н-1)*Число(Символы_штрих_кода.ПолучитьЗначение(Н,Стр));
	КонецЦикла;
	Пров_код	= Пров_код%103;
	Символы_штрих_кода.ДобавитьЗначение(Строка(Пров_код),Строка(Пров_код));  
	// *********** СТРОП СИМВОЛ ***************
	// STOP
	Символы_штрих_кода.ДобавитьЗначение("106","106");
	// TERM - Не уверен что это нужно.                                         
	// Символы_штрих_кода.ДобавитьЗначение("107","107");

	//***** Преобразование в символы шрифта ********
	Вых_ШК = "";
	Для Н=1 по Символы_штрих_кода.РазмерСписка() Цикл
		Тек_код_символа = Число(Символы_штрих_кода.ПолучитьЗначение(Н,Стр));
		Если Тек_код_символа >= 95 Тогда
			Тек_код_символа = Тек_код_символа + 100;
		Иначе	
			Тек_код_символа = Тек_код_символа + 32;
		КонецЕсли;	                     
		Вых_ШК = Вых_ШК + Симв(Тек_код_символа);  
	КонецЦикла;
	
	Возврат Вых_ШК;
	
КонецФункции
Показать
8. mstvster 30.11.21 05:04 Сейчас в теме
вот шрифт, для пред идущего поста
Прикрепленные файлы:
7fonts.ru_code128.ttf
Оставьте свое сообщение