Формат кода маркировки - определить програмно что код соответствует формату

1. andrey7617 54 22.02.21 05:00 Сейчас в теме
Добрый день уважаемые форумчане.
Прошу помощи у гуру.

Пытаюсь дописать у старой конфигурации маркировку.
Застрял на одном моменте.

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

И Самый Главный вопрос - Есть функция по проверке штрихкода маркировки ??? - что он соответсвует формату

Заранее огромное спасибо !!!
Вознаграждение за ответ
Показать полностью
Найденные решения
14. sivin-alexey 507 26.02.21 04:51 Сейчас в теме +1.8 $m
Вот готовая функция ПолучитьДанныеШтрихкода


Функция ПолучитьПеременнуюСтроку(М,Начало,Длина)
	
	Поток = Новый ПотокВПамяти;
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	Длина = 0;
	Для х=Начало-1 По М.Количество()-1 Цикл
		Если М[х]=29 Тогда //FNC1
			Прервать;
		КонецЕсли;
		ЗаписьДанных.ЗаписатьБайт(М[х]);
		Длина = Длина + 1;
	КонецЦикла;
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();

	Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.ANSI);
КонецФункции

Функция ПолучитьФиксированнуюСтроку(М,Начало,Длина)
	
	Поток = Новый ПотокВПамяти;
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	Для х=Начало-1 По Начало-1+Длина-1 Цикл
		ЗаписьДанных.ЗаписатьБайт(М[х]);
	КонецЦикла;
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
	
	Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.ANSI);
КонецФункции

Процедура Удалить(М,Количество)
	Для х=1 По Количество Цикл
		Если М.Количество()=0 Тогда
			Прервать;
		Иначе
			М.Удалить(0);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Функция ПолучитьДанныеШтрихкода(Штрихкод) Экспорт
	
	Результат = Новый Структура;
	
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод);
	
	М = Новый Массив;
	ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
	Пока Истина Цикл
		Байт = ЧтениеДанных.ПрочитатьБайт();
		Если Байт=Неопределено Тогда
			Прервать;
		Иначе
			М.Добавить(Байт);
		КонецЕсли;
	КонецЦикла;
	
	Длина = Неопределено;
	Пока Истина Цикл
		
		Если М.Количество()<3 Тогда
			Прервать;
		КонецЕсли;
		
		А1 = Символ(М[0]);
		А2 = Символ(М[1]);
		А3 = Символ(М[2]);
		
		Если А1+А2="01" Тогда
			Результат.Вставить("GTIN",ПолучитьФиксированнуюСтроку(М,3,14));
			Удалить(М,16);
			Продолжить;
		КонецЕсли;
		
		Если А1+А2="21" Тогда
			Результат.Вставить("СерийныйНомер",ПолучитьПеременнуюСтроку(М,3,Длина));
			Удалить(М,Длина+3);
			Продолжить;
		КонецЕсли;
		
		Если А1+А2+А3="240" Тогда
			Результат.Вставить("КодТНВЭД",ПолучитьПеременнуюСтроку(М,4,Длина));
			Удалить(М,Длина+4);
			Продолжить;
		КонецЕсли;
		
		Если А1="9" Тогда
			Результат.Вставить("INTERNAL"+А2,ПолучитьПеременнуюСтроку(М,3,Длина));
			Удалить(М,Длина+3);
			Продолжить;
		КонецЕсли;
		
		
//		Сообщить("Неизвестный AI "+А1+А2);
		Прервать;
		
	КонецЦикла;
	

	Возврат Результат;
КонецФункции

ДанныеШтрихкода = ПолучитьДанныеШтрихкода(Штрихкод);
Если ДанныеШтрихкода.Свойство("GTIN") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
	//Правильный штрихкод с маркировкой
Иначе
	//Нет маркировки
КонецЕсли;

Показать
user1170885; Alexponenta; andrey7617; +3 Ответить
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
8. pavel06 2 22.02.21 18:31 Сейчас в теме +0.1 $m
(1)
Есть функция по проверке штрихкода маркировки ??? - что он соответсвует формату


Вот тут писали для табака для примера
https://infostart.ru/1c/articles/1247366/

А для легкой промышленности чего там проверять?
Я писал проверку соответствия считанного кода коду в исходном файле csv, выданному Честным знаком,
своеобразное "техническое зрение" для проверки правильности распечатки кода, т.к. принтер сбоил и печатал некоторые коды неправильно.
Но это подходит для любой продукции, не обязательно для легкой промышленности.
andrey7617; +1 Ответить
2. acces969 344 22.02.21 08:53 Сейчас в теме
Странный вопрос. Стандарт и состав кода маркировки легкой промышленности есть в Интернете. По нему можно написать собственную функцию проверки.
andrey7617; +1 Ответить
4. AlexeyIsip 26 22.02.21 09:32 Сейчас в теме +0.1 $m
По табачке, я все Кизы Записываю в свой созданный справочник при получении документа, а затем фоновым заданием запрашиваю информацию в Честном знаке о состоянии КиЗа и возможной агрегации. Но не знаю, подходит ли для легкой промышленности...
Для УТ 11.4 (11.4.12.71):
Функция ПолучитьДеревоВложенныхКиЗов(тмпШК,тмпПриобретениеТоваровУслуг) Экспорт
МассивШК=Новый Массив;
СтруктураШК1=Новый Структура;
СтруктураШК1.Вставить("Штрихкод",тмпШК);
СтруктураШК1.Вставить("Количество",1);
МассивШК.Добавить(СтруктураШК1);
ДанныеПоШтрихкодам = ШтрихкодированиеИС.ИнициализацияДанныхПоШтрихкодам();
ДанныеШапки = ШтрихкодированиеИС.ПолучитьСтруктуруРеквизитовДокумента(тмпПриобретениеТоваровУслуг);
ПараметрыСканирования=ШтрихкодированиеИС.ПараметрыСканирования(ДанныеШапки,Неопределено,Перечисления.ВидыПродукцииИС.Табак);
ШтрихкодированиеИС.ПодготовитьДанныеКодовМаркировкиДляОбработки(ДанныеПоШтрихкодам.ДанныеКодовМаркировки,МассивШК,ПараметрыСканирования);
Результат=ИнтерфейсМОТП.ДеревоУпаковок(ДанныеПоШтрихкодам.ДанныеКодовМаркировки);
Возврат Результат.ДеревоУпаковок;
КонецФункции
andrey7617; +1 Ответить
5. AlexeyIsip 26 22.02.21 09:37 Сейчас в теме
Я на следующей неделе тоже буду заниматься проверкой и поиском функций по разагрегации и проверки кодов маркировки для легкой промышленности на свежем релизе. Как найду, то отпишусь, если ты найдешь, то тоже напиши в ответ
andrey7617; +1 Ответить
6. KVIKS 399 22.02.21 16:49 Сейчас в теме
Я делал проверку только на длину строки, чтобы определить какой ШК сканируют: простой EAN или qr
andrey7617; +1 Ответить
7. andrey7617 54 22.02.21 17:11 Сейчас в теме
По нему можно написать собственную функцию проверки.

- Хотелось бы готовую функцию ...

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

- Буду очень ждать - сразу отблагадарю ...

Я делал проверку только на длину строки, чтобы определить какой ШК сканируют: простой EAN или qr

- а если продавец случайно отсканирует qr код допустим с чека ккм ?
11. pavel06 2 25.02.21 19:14 Сейчас в теме
(7)
а если продавец случайно отсканирует qr код допустим с чека ккм ?

Они сильно непохожи, но, если выпивши, то все спутать можно.
andrey7617; +1 Ответить
9. Alexponenta 25.02.21 11:29 Сейчас в теме
как бы логично предположить что QR-code, EAN-13,EAN-8,DataMatrix, имеют разную структуру и внешний вид. Т.е. логично делать некую ступенчатую обработку.

Самые быстрые в данном плане - "Вани 8 и 13"

8 и 13 символов.(с "весом" информации - это уже другой вопрос)

А вот с qr и dm уже сложнее. Тут надо смотреть конкретно на структуру

Хотя по идее программа спутать их не должна ну вот никак. QR код приняться не должен. Поскольку работают именно с datamatrix. Хотя возможно в последнее время что-то и изменилось.
andrey7617; +1 Ответить
10. andrey7617 54 25.02.21 16:36 Сейчас в теме
Хотя по идее программа спутать их не должна ну вот никак. QR код приняться не должен. Поскольку работают именно с datamatrix. Хотя возможно в последнее время что-то и изменилось.

- Старую программу Розница 2.0 дописываю под маркировку - сканер без проблем считывает штрихкод - а вот как его проверить что он именно дата матрикс ???
12. pavel06 2 25.02.21 19:17 Сейчас в теме
(10)
сканер без проблем считывает штрихкод - а вот как его проверить что он именно дата матрикс ???


Можно проверять наличие 01 перед гтин или 21 перед серией или 91 перед криптохвостом.
В датаматриксе ведь четко заданное количество символов в гтин и серии.
andrey7617; +1 Ответить
13. andrey7617 54 26.02.21 02:12 Сейчас в теме
Можно проверять наличие 01 перед гтин или 21 перед серией или 91 перед криптохвостом.
В датаматриксе ведь четко заданное количество символов в гтин и серии.

- а есть сертифицированная функция 1с по проверке ? полюбому что то такое уже есть ...
14. sivin-alexey 507 26.02.21 04:51 Сейчас в теме +1.8 $m
Вот готовая функция ПолучитьДанныеШтрихкода


Функция ПолучитьПеременнуюСтроку(М,Начало,Длина)
	
	Поток = Новый ПотокВПамяти;
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	Длина = 0;
	Для х=Начало-1 По М.Количество()-1 Цикл
		Если М[х]=29 Тогда //FNC1
			Прервать;
		КонецЕсли;
		ЗаписьДанных.ЗаписатьБайт(М[х]);
		Длина = Длина + 1;
	КонецЦикла;
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();

	Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.ANSI);
КонецФункции

Функция ПолучитьФиксированнуюСтроку(М,Начало,Длина)
	
	Поток = Новый ПотокВПамяти;
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	Для х=Начало-1 По Начало-1+Длина-1 Цикл
		ЗаписьДанных.ЗаписатьБайт(М[х]);
	КонецЦикла;
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
	
	Возврат ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.ANSI);
КонецФункции

Процедура Удалить(М,Количество)
	Для х=1 По Количество Цикл
		Если М.Количество()=0 Тогда
			Прервать;
		Иначе
			М.Удалить(0);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Функция ПолучитьДанныеШтрихкода(Штрихкод) Экспорт
	
	Результат = Новый Структура;
	
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод);
	
	М = Новый Массив;
	ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
	Пока Истина Цикл
		Байт = ЧтениеДанных.ПрочитатьБайт();
		Если Байт=Неопределено Тогда
			Прервать;
		Иначе
			М.Добавить(Байт);
		КонецЕсли;
	КонецЦикла;
	
	Длина = Неопределено;
	Пока Истина Цикл
		
		Если М.Количество()<3 Тогда
			Прервать;
		КонецЕсли;
		
		А1 = Символ(М[0]);
		А2 = Символ(М[1]);
		А3 = Символ(М[2]);
		
		Если А1+А2="01" Тогда
			Результат.Вставить("GTIN",ПолучитьФиксированнуюСтроку(М,3,14));
			Удалить(М,16);
			Продолжить;
		КонецЕсли;
		
		Если А1+А2="21" Тогда
			Результат.Вставить("СерийныйНомер",ПолучитьПеременнуюСтроку(М,3,Длина));
			Удалить(М,Длина+3);
			Продолжить;
		КонецЕсли;
		
		Если А1+А2+А3="240" Тогда
			Результат.Вставить("КодТНВЭД",ПолучитьПеременнуюСтроку(М,4,Длина));
			Удалить(М,Длина+4);
			Продолжить;
		КонецЕсли;
		
		Если А1="9" Тогда
			Результат.Вставить("INTERNAL"+А2,ПолучитьПеременнуюСтроку(М,3,Длина));
			Удалить(М,Длина+3);
			Продолжить;
		КонецЕсли;
		
		
//		Сообщить("Неизвестный AI "+А1+А2);
		Прервать;
		
	КонецЦикла;
	

	Возврат Результат;
КонецФункции

ДанныеШтрихкода = ПолучитьДанныеШтрихкода(Штрихкод);
Если ДанныеШтрихкода.Свойство("GTIN") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
	//Правильный штрихкод с маркировкой
Иначе
	//Нет маркировки
КонецЕсли;

Показать
user1170885; Alexponenta; andrey7617; +3 Ответить
15. andrey7617 54 26.02.21 04:59 Сейчас в теме
Уважаемый sivin-alexey - Брат я проверю сегодня днем и обязательно отблагадарю.
Спасибо !!! уважение !!!
16. andrey7617 54 27.02.21 18:12 Сейчас в теме
Уважаемый sivin-alexey - Спасибо брат !!! Уважение !!! все работает как надо ...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот