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

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

См. также

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 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

6000 руб.

27.02.2017    791591    4799    9515    

2836

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

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

8970 руб.

15.12.2015    169770    867    364    

398

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

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

28500 руб.

21.04.2017    95055    125    40    

213

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

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

18000 руб.

06.10.2023    13576    34    7    

67

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    230011    988    894    

986

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

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5400 руб.

25.05.2015    332859    1918    3042    

1020

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

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

4500 руб.

27.08.2018    120287    982    575    

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

Возврат Символ(Рез);
3. DoReMi 20.10.15 16:03 Сейчас в теме
(2) cassper, точно! я к этой строке устал сравнивать :)
4. Sergey1CSpb 245 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 245 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
Оставьте свое сообщение