Добрый день уважаемые форумчане.
Прошу помощи у гуру.
Пытаюсь дописать у старой конфигурации маркировку.
Застрял на одном моменте.
подскажите пожалуйста - если я получил строку штрихкода - как мне понять что штрихкод маркировки соответсвует формату.
Вообще у маркировки легкой промышленности какой формат ? какие цыфорки должны идти за чем и есть ли проверочные цыфорки ?
И Самый Главный вопрос - Есть функция по проверке штрихкода маркировки ??? - что он соответсвует формату
14.
sivin-alexey
50626.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") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
//Правильный штрихкод с маркировкой
Иначе
//Нет маркировки
КонецЕсли;
А для легкой промышленности чего там проверять?
Я писал проверку соответствия считанного кода коду в исходном файле csv, выданному Честным знаком,
своеобразное "техническое зрение" для проверки правильности распечатки кода, т.к. принтер сбоил и печатал некоторые коды неправильно.
Но это подходит для любой продукции, не обязательно для легкой промышленности.
4.
AlexeyIsip
2622.02.21 09:32 Сейчас в теме+0.1 $m
По табачке, я все Кизы Записываю в свой созданный справочник при получении документа, а затем фоновым заданием запрашиваю информацию в Честном знаке о состоянии КиЗа и возможной агрегации. Но не знаю, подходит ли для легкой промышленности...
Для УТ 11.4 (11.4.12.71):
Функция ПолучитьДеревоВложенныхКиЗов(тмпШК,тмпПриобретениеТоваровУслуг) Экспорт
МассивШК=Новый Массив;
СтруктураШК1=Новый Структура;
СтруктураШК1.Вставить("Штрихкод",тмпШК);
СтруктураШК1.Вставить("Количество",1);
МассивШК.Добавить(СтруктураШК1);
ДанныеПоШтрихкодам = ШтрихкодированиеИС.ИнициализацияДанныхПоШтрихкодам();
ДанныеШапки = ШтрихкодированиеИС.ПолучитьСтруктуруРеквизитовДокумента(тмпПриобретениеТоваровУслуг);
ПараметрыСканирования=ШтрихкодированиеИС.ПараметрыСканирования(ДанныеШапки,Неопределено,Перечисления.ВидыПродукцииИС.Табак);
ШтрихкодированиеИС.ПодготовитьДанныеКодовМаркировкиДляОбработки(ДанныеПоШтрихкодам.ДанныеКодовМаркировки,МассивШК,ПараметрыСканирования);
Результат=ИнтерфейсМОТП.ДеревоУпаковок(ДанныеПоШтрихкодам.ДанныеКодовМаркировки);
Возврат Результат.ДеревоУпаковок;
КонецФункции
Я на следующей неделе тоже буду заниматься проверкой и поиском функций по разагрегации и проверки кодов маркировки для легкой промышленности на свежем релизе. Как найду, то отпишусь, если ты найдешь, то тоже напиши в ответ
По нему можно написать собственную функцию проверки.
- Хотелось бы готовую функцию ...
Я на следующей неделе тоже буду заниматься проверкой и поиском функций по разагрегации и проверки кодов маркировки для легкой промышленности на свежем релизе. Как найду, то отпишусь, если ты найдешь, то тоже напиши в ответ
- Буду очень ждать - сразу отблагадарю ...
Я делал проверку только на длину строки, чтобы определить какой ШК сканируют: простой EAN или qr
- а если продавец случайно отсканирует qr код допустим с чека ккм ?
как бы логично предположить что QR-code, EAN-13,EAN-8,DataMatrix, имеют разную структуру и внешний вид. Т.е. логично делать некую ступенчатую обработку.
Самые быстрые в данном плане - "Вани 8 и 13"
8 и 13 символов.(с "весом" информации - это уже другой вопрос)
А вот с qr и dm уже сложнее. Тут надо смотреть конкретно на структуру
Хотя по идее программа спутать их не должна ну вот никак. QR код приняться не должен. Поскольку работают именно с datamatrix. Хотя возможно в последнее время что-то и изменилось.
Хотя по идее программа спутать их не должна ну вот никак. QR код приняться не должен. Поскольку работают именно с datamatrix. Хотя возможно в последнее время что-то и изменилось.
- Старую программу Розница 2.0 дописываю под маркировку - сканер без проблем считывает штрихкод - а вот как его проверить что он именно дата матрикс ???
сканер без проблем считывает штрихкод - а вот как его проверить что он именно дата матрикс ???
Можно проверять наличие 01 перед гтин или 21 перед серией или 91 перед криптохвостом.
В датаматриксе ведь четко заданное количество символов в гтин и серии.
Можно проверять наличие 01 перед гтин или 21 перед серией или 91 перед криптохвостом.
В датаматриксе ведь четко заданное количество символов в гтин и серии.
- а есть сертифицированная функция 1с по проверке ? полюбому что то такое уже есть ...
14.
sivin-alexey
50626.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") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
//Правильный штрихкод с маркировкой
Иначе
//Нет маркировки
КонецЕсли;