Улучшенный алгоритм Левенштейна для 1С: интеллектуальное сравнение строк

07.11.25

Разработка - Математика и алгоритмы

Данная внешняя обработка для платформы 1С:Предприятие реализует усовершенствованный алгоритм Левенштейна для вычисления схожести строк с учетом различных лингвистических особенностей русского языка. В отличие от классической реализации, этот алгоритм учитывает фонетические, визуальные и контекстные особенности набора текста.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Улучшенный алгоритм Левенштейна для 1С: интеллектуальное сравнение строк
.epf 14,32Kb
4 2 150 руб. Купить
Только алгоритм Левенштейна (без дополнительных проверок)
.epf 6,81Kb
1 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Ключевые возможности:

📊 Умное вычисление расстояния между строками

  • Расширенный алгоритм Левенштейна с адаптивными весами замены символов

  • Процентное выражение схожести от 0% до 100%

  • Нормализация входных данных (автоматическое удаление пробелов и приведение к нижнему регистру)

🎯 Учет лингвистических особенностей:

 

1. Фонетическая идентичность

 

Учитывает буквы, которые звучат одинаково:

"е" <-> "э", "и" <-> "ы", "о" <-> "а", "г" <-> "х", "ч" <-> "щ" ...

 

2. Частые орфографические ошибки

 

Распознает типичные замены:

"з" <-> "с", "т" <-> "д", "п" <-> "б", "ж" <-> "ш", "в" <-> "ф" ...

 

3. Визуальное сходство

 

Учитывает похожие по начертанию буквы:

"ш" <-> "щ", "м" <-> "н", "и" <-> "й", "ц" <-> "у", "л" <-> "п" ...

 

4. Соседние клавиши на клавиатуре

 

Определяет вероятные опечатки из-за близкого расположения клавиш в русской раскладке.

 

5. Транслитерация

 

Распознает замены русских букв на похожие латинские:

"а" <-> "a", "е" <-> "e", "у" <-> "y", "о" <-> "o", "с" <-> "c" ...

 

6. Учет частотности букв

 

  • Редкие буквы ("ф", "ц", "щ", "э", "ъ") - высокая стоимость замены

  • Частые буквы ("а", "о", "е", "и", "н") - низкая стоимость замены

Гибкая настройка параметров

Обработка позволяет включать/выключать различные типы проверок через структуру параметров или в пользовательском интерфейсе:

 

Настройка весов алгоритма

В данной функции вы сможете самостоятельно установить коэффициенты для настройки точности работы алгоритма (чем больше коэффициент "скидка", тем выше будет результат сравнения, если условие проверки было выполнено).

Функция ПолучитьСтоимостьЗамены(Символ1, Символ2, СтруктураПараметров) // Основные настройки весов данного алгоритма
    Символ1 = Символ1;
    Символ2 = Символ2;
	КоэффициентЧастотности = 1;
	Стоимость = 1; // Значение, которое показывает как сильно отличаются символы
	Скидка = 0;    // Значение, которое уменьшает стоимость
	 
    // Полное совпадение
    Если Символ1 = Символ2 Тогда
        Возврат 0; // Если символы идентичны стоимость = 0;
    КонецЕсли;
	
    // Фонетически идентичные звуки (минимальная стоимость) 
	Если СтруктураПараметров.ПроверитьФонетическуюИдентичность Тогда
	    Если ПроверитьФонетическуюИдентичность(Символ1, Символ2) Тогда
	        Скидка = Скидка + 0.3; // 30% скидка
		КонецЕсли;
	КонецЕсли;   
	
	// Буквы, которые часто путают (средняя стоимость) 
	Если СтруктураПараметров.ПроверитьЧастыеОшибки Тогда
		Если ПроверитьЧастыеОшибки(Символ1, Символ2) Тогда
			Скидка = Скидка + 0.25; // 25% скидка
		КонецЕсли;
	КонецЕсли;
	
	// Похожие по начертанию буквы  
	Если СтруктураПараметров.ПроверитьВизуальноеСходство Тогда
		Если ПроверитьВизуальноеСходство(Символ1, Символ2) Тогда
			Скидка = Скидка + 0.15; // 15% скидка
		КонецЕсли;
	КонецЕсли;
	
	// Соседние клавиши на клавиатуре
	Если СтруктураПараметров.ПроверитьСоседниеКлавиши  Тогда
		Если ПроверитьСоседниеКлавиши(Символ1, Символ2) Тогда
			Скидка = Скидка + 0.15; // 15% скидка
		КонецЕсли;
	КонецЕсли;
	
	// Буква случайно написана на английском   
	Если СтруктураПараметров.ПроверитьТранслитерацию Тогда	
		Если ПроверитьТранслитерацию(Символ1, Символ2) Тогда
			Скидка = Скидка + 0.2; // 20% скидка
		КонецЕсли;
	КонецЕсли;             
	
	// Стоимость от частоты употребления букв в русском языке 
	Если СтруктураПараметров.УчестьЧастотностьБукв Тогда
		КоэффициентЧастотности = УчестьЧастотностьБукв(Символ1, Символ2);
	КонецЕсли;
	 
	Стоимость = Макс(0.1, Стоимость - Скидка) * КоэффициентЧастотности;
	
    // Полная замена
    Возврат Стоимость;
КонецФункции

 

 

Гибкая настройка параметров

Обработка позволяет включать/выключать различные типы проверок через структуру параметров или в пользовательском интерфейсе:

СтруктураПараметров = Новый Структура;

СтруктураПараметров.Вставить("ПроверитьСоседниеКлавиши",Истина);
СтруктураПараметров.Вставить("ПроверитьТранслитерацию",Истина);
СтруктураПараметров.Вставить("ПроверитьТранспозициюСимволов",Истина);
СтруктураПараметров.Вставить("ПроверитьФонетическуюИдентичность",Истина);
СтруктураПараметров.Вставить("ПроверитьЧастыеОшибки",Истина);
СтруктураПараметров.Вставить("ПроверитьВизуальноеСходство",Истина);
СтруктураПараметров.Вставить("УчестьЧастотностьБукв",Истина);

 

Технические особенности

 

Архитектура решения

  1. Модульная структура - разделение на основные и вспомогательные функции

  2. Гибкая система весов - адаптивная стоимость замены символов

  3. Оптимизация производительности - эффективное использование массивов

 

Алгоритмические улучшения

  • Транспозиция символов - учет перестановки соседних букв

  • Динамические коэффициенты - автоматическая корректировка весов

  • Нормализация результата - приведение к интуитивно понятному проценту схожести

 

Области применения

  • Поиск дубликатов в справочниках контрагентов, товаров, номенклатуры

  • Коррекция опечаток при вводе данных пользователями

  • Нечеткий поиск в больших массивах информации

  • Сравнение наименований при интеграциях и загрузках данных

 

Преимущества перед классическим алгоритмом

Критерий       Классический Левенштейн            Улучшенный алгоритм
Учет фонетики                          Нет                 Да
Учет раскладки клавиатуры                          Нет                 Да
Распознавание транслитерации                          Нет                 Да
Учет частотности букв                          Нет                 Да
Гибкая настройка                          Нет                 Да

 

Заключение

Данная обработка представляет собой инструмент для решения практических задач сравнения строк в системах на платформе 1С. Благодаря учету множества лингвистических и поведенческих факторов, алгоритм обеспечивает значительно более точные результаты по сравнению с классическими методами, что делает его незаменимым в задачах очистки данных и нечеткого поиска.

Обработка может встраиваться в справочник "Дополнительные отчеты и обработки" или открываться как внешняя. Также обработка совместима с платформами 1С:Предприятие 8.n

 

Бонус

Тут представлен полный код из второй обработки "Только алгоритм Левенштейна (без дополнительных проверок)". С помощью него будет легче понять саму работу алгоритма, которая заключается в создании матрицы и дальнейшем её заполнении с получением конечного результата.

&НаКлиенте
Функция ВыполнитьОбработку()
	Если ЗначениеЗаполнено(Строка1) И ЗначениеЗаполнено(Строка2) Тогда
		РасстояниеЛевенштейна = РасчитатьРасстояниеЛевенштейна(); 
			НаибольшаяДлинаСтроки = Макс(СтрДлина(Строка1),СтрДлина(Строка2));
		Сходство = (1 - РасстояниеЛевенштейна / НаибольшаяДлинаСтроки) * 100; // Преобразование полученного расстояния в проценты
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ПолучитьМассивИзСтроки(Строка) // Массив, где каждый элемент массива это символ переданной строки
	МассивСтрок = Новый Массив;
	Для Счетчик = 1 По СтрДлина(Строка) Цикл
		Символ = Прав(Лев(Строка,Счетчик),1); 
		МассивСтрок.Добавить(Символ);
	КонецЦикла; 
	Возврат МассивСтрок;
КонецФункции

&НаКлиенте
Функция ПолучитьМатрицу(Строка1, Строка2) // Матрица размером - длина первой строки на длину второй строки
	Матрица =  Новый Массив;
	ПерваяСтрока = Истина;
	Для Счетчик1 = 0 По СтрДлина(Строка2) Цикл
		СтрокаМатрицы = Новый Массив; 
		СтрокаМатрицы.Добавить(Счетчик1);
		Для Счетчик2 = 1 По СтрДлина(строка1) Цикл
			Если ПерваяСтрока Тогда
				СтрокаМатрицы.Добавить(Счетчик2);	
			Иначе	
				СтрокаМатрицы.Добавить(Неопределено);	
			КонецЕсли;
		КонецЦикла;
		ПерваяСтрока = Ложь;
		Матрица.Добавить(СтрокаМатрицы);
	КонецЦикла;
	Возврат Матрица;
КонецФункции

&НаКлиенте
Функция РасчитатьРасстояниеЛевенштейна() // Заполняем последовательно матрицу
	Матрица = ПолучитьМатрицу(Строка1, Строка2); 
	Массив1 = ПолучитьМассивИзСтроки(Строка2);
	Массив2 = ПолучитьМассивИзСтроки(Строка1);
	НомерСтрокиМатрицы = 0;
	Для каждого Элемент1 Из Массив1 Цикл 
		НомерСтрокиМатрицы = НомерСтрокиМатрицы + 1;
		НомерКолонкиМатрицы = 0;	
		Для каждого Элемент2 Из Массив2 Цикл   
			НомерКолонкиМатрицы = НомерКолонкиМатрицы + 1;
			ЭлементМатрицы1 = Матрица[НомерСтрокиМатрицы-1][НомерКолонкиМатрицы-1]; 
			ЭлементМатрицы2 = Матрица[НомерСтрокиМатрицы][НомерКолонкиМатрицы-1];
			ЭлементМатрицы3 = Матрица[НомерСтрокиМатрицы-1][НомерКолонкиМатрицы];
			НаименьшийЭлемент = Мин(ЭлементМатрицы1, ЭлементМатрицы2, ЭлементМатрицы3); // Выбираем наименьшее значение из трех соседних элементов матрицы
			Если Элемент1 <> Элемент2 Тогда // Если символы двух строк не равны тогда к выбранному ранее наименьшему элементу прибавляем стоимость(1)
				Матрица[НомерСтрокиМатрицы][НомерКолонкиМатрицы] = НаименьшийЭлемент + 1;
			Иначе
				Матрица[НомерСтрокиМатрицы][НомерКолонкиМатрицы] = НаименьшийЭлемент;	
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат Матрица[НомерСтрокиМатрицы][НомерКолонкиМатрицы]; // Это последний элемент полученной матрицы, который и является расстоянием Левенштейна
КонецФункции

 

Проверено на следующих конфигурациях и релизах:

  • 1С:ERP Управление предприятием 2, релизы 2.5.24.68

Вступайте в нашу телеграмм-группу Инфостарт

обработка 1С:Предприятие демонстрация открытый код памятка инструмент разработчика математика алгоритмы сравнение строк внешняя обработка ERP

См. также

Математика и алгоритмы Программист 1C v8.2 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    12095    stopa85    12    

42

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    19061    user1959478    57    

39

Математика и алгоритмы Разное 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    11592    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    19131    11    SpaceOfMyHead    20    

64

Математика и алгоритмы Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    13063    RustIG    9    

30

Механизмы платформы 1С Математика и алгоритмы Программист 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    12189    gzharkoj    15    

27

Математика и алгоритмы Программист 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    11270    8    kalyaka    11    

45

Математика и алгоритмы Программист 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    14303    fishca    12    

39
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user-z99999 76 07.11.25 16:19 Сейчас в теме
Можно добавить (учитывать или наоборот не учитывать в коде):
ь ъ
тире и другие знаки
две буквы нн
цифры

Тогда похожесть повыситься.
2. InFlach 9 07.11.25 16:35 Сейчас в теме
(1) Проверка на пропуск "ь", "ъ" есть в одной из функций, что касается символов, с ними сложнее, придется отдельно "учить" алгоритм правилам пунктуации, а вот проверку на двойные согласные, в принципе, можно поместить, буду иметь ввиду)
Для отправки сообщения требуется регистрация/авторизация