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

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

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

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

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

Заранее огромное спасибо !!!
Вознаграждение за ответ
Показать полностью
Найденные решения
14. sivin-alexey 506 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 343 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 396 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 506 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 - Спасибо брат !!! Уважение !!! все работает как надо ...
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)