Имя: Пароль:
1C
 
Нечеткий поиск
0 repin_mike
 
24.06.25
17:15
Как на языке 1С оценить меру похожести строк? Например, строки "Иванов Петр Юрьевич" "Иванов Пётр Юрьевич" и "Иванов.Петр.Юрьевич " скорее похожи, а "Иванов Юрий Петрович" скорее не похожа на предыдущие?
1 PR
 
24.06.25
17:18
(0) Замени все ё на е
Замени все точки на пробелы
Разбей строку на подстроки по пробелам
Отсортируй по наименованию
Сравни получившиеся массивы
2 dark70
 
24.06.25
17:19
в запросе ПОДОБНО "%Иванов%" , например.
3 PR
 
24.06.25
17:20
А вообще гугли "Методы нечеткого сравнения текстов"
4 PR
 
24.06.25
17:20
(2) "Иванов Иванов Иванов" и "Иванов Петр Сергеевич" равны?
5 Timon1405
 
24.06.25
17:21
(0) wiki:Расстояние_Левенштейна
как запрограммировать на 1с спросите у дипсика
6 PR
 
24.06.25
17:21
7 dark70
 
24.06.25
17:25
(4) Нет. Но как вариант поиска.
8 PR
 
24.06.25
17:31
(7) И почему нет?
Все найдется
Таких никому не нужных нерабочих недовариантов можно дохрена накидать
Но зачем?
9 PR
 
24.06.25
17:33
Щас еще особо умные персонажи вспомнят, что 1С теперь умеет в регулярки, начнут наперебой умничать, что все нужно через них делать, не вдаваясь в детали, что именно и как именно делать
10 dark70
 
24.06.25
17:40
(8) Автор не обозначил критериев оценок "скорее похоже чем нет". А если задать проценты похожести, то "Подобно" вполне подойдет.
Хотя бы вот
https://catalog.mista.ru/1c/tools/445962/
11 Волшебник
 
24.06.25
17:59
(4) а бывают полные однофамильцы, которые не равны.

Или хотя бы уволенный сотрудник, который не равен вновь принятому, хотя физлицо совпадает.
12 dark70
 
24.06.25
18:01
Вообще-то здесь речь о строках, а ФИО как пример.
13 PR
 
24.06.25
18:02
(10) Рассуждения спеца за соточку
14 PR
 
24.06.25
18:03
(11) Ну, это уже не сравнение строк
15 Волшебник
 
24.06.25
18:03
Можно привести строки к минимальной длине, потом отбрасывать по одному символу справа и сравнивать. Если совпало, то длина строки будет мерой похожести.
16 Волшебник
 
24.06.25
18:11
(5) Я поддерживаю это решение. Там алгоритм на 10 строчек кода, три цикла
17 Злопчинский
 
24.06.25
18:40
На ИС штуки к реализации разных методов нечеткого поиска.
18 Злопчинский
 
24.06.25
18:41
(5) strmatch.dll на гем вроде базируется с добавками...
19 Волшебник
 
24.06.25
21:20
Функция РасстояниеЛевенштейна на языке 1С
Функция РасстояниеЛевенштейна(Строка1, Строка2)
    len1 = СтрДлина(Строка1)
    len2 = СтрДлина(Строка2)

    // Создаем матрицу (len1+1) x (len2+1)
    матрица = Новый Массив(len1 + 1)
    Для i = 0 По len1 Цикл
        матрица[i] = Новый Массив(len2 + 1)
    КонецЦикла

    // Инициализация первой строки
    Для j = 0 По len2 Цикл
        матрица[0][j] = j
    КонецЦикла

    // Инициализация первого столбца
    Для i = 0 По len1 Цикл
        матрица[i][0] = i
    КонецЦикла

    // Заполнение матрицы
    Для i = 1 По len1 Цикл
        Для j = 1 По len2 Цикл
            символ1 = Сред(Строка1, i, 1)
            символ2 = Сред(Строка2, j, 1)
            cost = ?(символ1 = символ2, 0, 1)

            матрица[i][j] = Мин(
                матрица[i-1][j] + 1,   // Удаление
                матрица[i][j-1] + 1,   // Вставка
                матрица[i-1][j-1] + cost  // Замена или совпадение
            )
        КонецЦикла
    КонецЦикла

    Возврат матрица[len1][len2]
КонецФункции


Я не проверял. Это творчество Qwen. Очевидно не хватает точки с запятой ";"
20 Djelf
 
гуру
24.06.25
21:23
(18) это для 7.7, на 8ку вроде никто это не портировал, но там это не требуется, 8ка же, там все есть...
Так ведь?
(19) гадя невероятная
21 Волшебник
 
24.06.25
21:23
(20) Простите великодушно.
Функция на самом деле очень интересная. Можно искать номенклатуру по артикулу или по части штрих|QR-кода.
22 Злопчинский
 
24.06.25
23:52
(20) штатная strmatch и с 8ой работает, на ис тоже были решения
23 DrZombi
 
гуру
25.06.25
06:06
(0) Для нечеткого поиска будь готов использовать кучу доп. полей, заполняемых системой, т.е. автоматически на основании динамических полей, к примеру "Наименование", "Комментарий" и т.д. другие прелести пользовательского интерфейса. :)

А так, только порядок ввода данных и административное "Нагоняй", помогут твоему горю :)
24 ptiz
 
25.06.25
09:14
(0) Самый простой способ, которого достаточно в большинстве случаев:
1) Делим строку на блоки и получаем таблицу строк вида: "%Иванов%Петр%Юрьевич%" - 38, "%Иванов%Петр%" -23, "%Иванов%" - 14.
2) Строим запрос поиска похожих:
    ВЫБРАТЬ
        ТЗ.Подстрока,
        ТЗ.ДлинаСтроки
    ПОМЕСТИТЬ ТЗ
    ИЗ
        &ТЗ КАК ТЗ
    ;
    
    
    ВЫБРАТЬ ПЕРВЫЕ 5
        ГдеИщем.Наименование,
        МАКСИМУМ(ТЗ.ДлинаСтроки) КАК Приоритет,
    ИЗ
        Справочник.ГдеИщем КАК ГдеИщем
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
            ПО (ГдеИщем.Наименование ПОДОБНО ТЗ.Подстрока)
    СГРУППИРОВАТЬ ПО
        ГдеИщем.Наименование
    
    УПОРЯДОЧИТЬ ПО
        Приоритет УБЫВ
25 mmg
 
25.06.25
09:48
(0) Берешь библиотеку искусственного интеллекта для 1С. Определяешь векторы для этих строк, сравниваешь расстояния и получаешь то, что хотел.
26 arsik
 
гуру
25.06.25
10:24
(0) Можно подсмотреть. как это делается в любой стандартной. Например e1cib/app/Обработка.СопоставлениеНоменклатурыБЭД