Добрый день уважаемые форумчане.
Прошу помощи у гуру.

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

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

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

Заранее огромное спасибо !!!
---
Вот готовая функция ПолучитьДанныеШтрихкода

```1c
    Функция ПолучитьПеременнуюСтроку(М,Начало,Длина)

    Поток = Новый ПотокВПамяти;
    ЗаписьДанных = Новый ЗаписьДанных(Поток);
    Длина = 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") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
    //Правильный штрихкод с маркировкой
    Иначе
    //Нет маркировки
    КонецЕсли;
```
---
Есть функция по проверке штрихкода маркировки ??? - что он соответсвует формату

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

А для легкой промышленности чего там проверять?
Я писал проверку соответствия считанного кода коду в исходном файле csv, выданному Честным знаком,
своеобразное "техническое зрение" для проверки правильности распечатки кода, т.к. принтер сбоил и печатал некоторые коды неправильно.
Но это подходит для любой продукции, не обязательно для легкой промышленности.
---
Странный вопрос. Стандарт и состав кода маркировки легкой промышленности есть в Интернете. По нему можно написать собственную функцию проверки.
---
https://customs.gov.ru/techdoc/markirovka-gismt/lprom/document/243426
---
По табачке, я все Кизы Записываю в свой созданный справочник при получении документа, а затем фоновым заданием запрашиваю информацию в Честном знаке о состоянии КиЗа и возможной агрегации. Но не знаю, подходит ли для легкой промышленности...
Для УТ 11.4 (11.4.12.71):
Функция ПолучитьДеревоВложенныхКиЗов(тмпШК,тмпПриобретениеТоваровУслуг) Экспорт
 МассивШК=Новый Массив;
 СтруктураШК1=Новый Структура;
 СтруктураШК1.Вставить("Штрихкод",тмпШК);
 СтруктураШК1.Вставить("Количество",1);
 МассивШК.Добавить(СтруктураШК1);
 ДанныеПоШтрихкодам = ШтрихкодированиеИС.ИнициализацияДанныхПоШтрихкодам();
 ДанныеШапки = ШтрихкодированиеИС.ПолучитьСтруктуруРеквизитовДокумента(тмпПриобретениеТоваровУслуг);
 ПараметрыСканирования=ШтрихкодированиеИС.ПараметрыСканирования(ДанныеШапки,Неопределено,Перечисления.ВидыПродукцииИС.Табак);
 ШтрихкодированиеИС.ПодготовитьДанныеКодовМаркировкиДляОбработки(ДанныеПоШтрихкодам.ДанныеКодовМаркировки,МассивШК,ПараметрыСканирования);
 Результат=ИнтерфейсМОТП.ДеревоУпаковок(ДанныеПоШтрихкодам.ДанныеКодовМаркировки);
 Возврат Результат.ДеревоУпаковок;
КонецФункции
---
Я на следующей неделе тоже буду заниматься проверкой и поиском функций по разагрегации и проверки кодов маркировки для легкой промышленности на свежем релизе. Как найду, то отпишусь, если ты найдешь, то тоже напиши в ответ
---
Я делал проверку только на длину строки, чтобы определить какой ШК сканируют: простой EAN или qr
---
По нему можно написать собственную функцию проверки.
- Хотелось бы готовую функцию ...

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

Я делал проверку только на длину строки, чтобы определить какой ШК сканируют: простой EAN или qr
- а если продавец случайно отсканирует 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с по проверке ? полюбому что то такое уже есть ...
---
Вот готовая функция ПолучитьДанныеШтрихкода

```1c
    Функция ПолучитьПеременнуюСтроку(М,Начало,Длина)

    Поток = Новый ПотокВПамяти;
    ЗаписьДанных = Новый ЗаписьДанных(Поток);
    Длина = 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") И ДанныеШтрихкода.Свойство("СерийныйНомер") Тогда
    //Правильный штрихкод с маркировкой
    Иначе
    //Нет маркировки
    КонецЕсли;
```
---
Уважаемый sivin-alexey - Брат я проверю сегодня днем и обязательно отблагадарю.
Спасибо !!! уважение !!!
---
Уважаемый sivin-alexey - Спасибо брат !!! Уважение !!! все работает как надо ...