Нечеткий поиск по штрихкоду

Обработка позволяет найти товары с «наиболее похожим» штрихкодом, что бывает удобно, когда в штрихкод закралась ошибка (или несколько ошибок).

Делюсь обработкой, вдруг кому понадобится. Обработка написана для УТ 11.2, но подойдет для любой конфигурации, где есть таблица «Штрихкоды номенклатуры» с полями «Штрихкод, Номенклатура».

Для оценки «похожести» строк используется расстояние Левенштейна. Алгоритм достаточно простой, но хорошо показал себя на практике.

Обработка в цикле перебирает все записи из регистра сведений «Штрихкоды номенклатуры» и для каждого штрихкоды вызывается функция, которая возвращает расстояние между словами. Если расстояние не превосходит заданного параметра (для себя установил значение 3), то штрихкод добавляется в таблицу найденных значений.

 При необходимости код можно доработать, добавив условие, которое будет отбразывать заранее неподходящие по длине штрихкоды.

Код основной функции:

Функция РасстояниеЛевенштейна(Строка1, Строка2)

л1 = СтрДлина(Строка1) + 1;
л2 = СтрДлина(Строка2) + 1;

Если л1 = 1 ИЛИ л2 =1 Тогда
Возврат 449;
КонецЕсли;

м = Новый Массив(л1 + 1, л2 + 1);

Для ы = 0 По л1 Цикл
м[ы][0] = ы;
КонецЦикла;

Для ы = 0 По л2 Цикл
м[0][ы] = ы;
КонецЦикла;

Для ы1 = 1 По л1 Цикл
Для ы2 = 1 По л2 Цикл
дифф = Сред(Строка1, ы1, 1) = Сред(Строка2, ы2, 1);
м[ы1][ы2] = Мин(м[ы1-1][ы2] + 1, м[ы1][ы2-1] + 1, м[ы1-1][ы2-1] + ?(дифф, 0, 1));
КонецЦикла;
КонецЦикла;

Возврат м[л1][л2];

КонецФункции

7 Comments

  1. MSConfig

    >> Обработка в цикле перебирает все записи из регистра сведений «Штрихкоды номенклатуры» и для каждого штрихкоды вызывается функция

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

    Reply
  2. KazanKokos

    (1) вопрос хороший 🙂 а вообще если посмотреть на код, его легко можно всунуть в запрос. тогда проблемы скорости не будет )

    Reply
  3. MSConfig

    (2) да, вариант с запросом был бы более интересным.

    Reply
  4. KazanKokos

    автор — посмотри тут http://infostart.ru/public/558079/ . вообще на ИС полно таких запросов. и в комментах еще попроще кинули, но в нем сложно разобраться. может поможет сделать все одни запросом

    Reply
  5. harmer

    (1)

    В рабочей базе порядка 20к записей, алгоритм на глаз отрабатывает за 4-5 сек (более точного анализа не производилось, так как время работы устраивает). При увеличении количества ШК время будет увеличиваться пропорционально, поэтому на объемах данных порядка 100к придется задуматься об оптимизации (выбрать другой алгоритм или оптимизировать данный). Возможно, когда мы достигнем такого объема, кто-то уже напишет решение в комментариях).

    (2)

    Обработка в основном используется при ревизии, когда сотрудники вручную забивают ШК или переписывают их на листок. Естественно, в таких случаях возможны ошибки. Обработка используется пару раз в месяц для поиска одного-двух штрихкодов, поэтому спортивного интереса минимизировать время работы не возникало.

    Спасибо за ссылку. Разборы строк в запросе выглядит ужасно и требует гораздо бОльшего времени на разработку, чем переписать известный алгоритм на 1С. Если кто-то решит перенести все в запрос, скажу ему огромное спасибо и попробую сравнить скорость работы.

    Reply
  6. KazanKokos

    (5) а «ы» «л» «м» это чтобы враг не раскрыл военную тайну?:)

    Reply
  7. harmer

    (6) Конечно! Когда в коде присутствуют такие переменные, сложность алгоритма возрастает в несколько раз, что автоматически увеличивает гордость автора =)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *