Где найти и как использовать компоненту StrMatch.dll для нечеткого поиска в 1С 7.7

Программист 1С v7.7
← На главную

В экосистеме 1С:Предприятие 7.7 внешняя компонента StrMatch.dll является де-факто стандартом для реализации алгоритмов нечеткого поиска. Она незаменима, когда требуется сопоставить номенклатуру от разных поставщиков, найти дублирующихся контрагентов или реализовать интеллектуальный подбор адресов. Платформа 7.7 не обладает встроенными механизмами для подобных задач, поэтому использование сторонних библиотек становится производственной необходимостью. Проанализируем возможности этой компоненты, разберем способы её подключения и рассмотрим современные модификации.

Основные возможности и алгоритм работы StrMatch

Разберем, как именно компонента обрабатывает данные. В отличие от стандартных методов поиска «по подстроке», StrMatch.dll вычисляет коэффициент схожести (рейтинг) между двумя текстовыми значениями. Это позволяет находить результаты даже при наличии опечаток, перестановок слов или различий в регистрах.

Проанализируем ключевые особенности логики библиотеки:

  1. Рейтинговая система: Компонента возвращает числовое значение схожести. Чем оно выше, тем ближе искомая строка к оригиналу. Это позволяет сортировать результаты по релевантности.
  2. Работа с весовыми коэффициентами: Алгоритм учитывает последовательность символов и их близость, что делает его более эффективным по сравнению с обычным расстоянием Левенштейна.
  3. Кэширование данных: Для ускорения обработки больших справочников компонента позволяет загружать массив строк в оперативную память один раз и проводить по нему мгновенный поиск.

Классический способ использования через объект AddIn

Рассмотрим, как традиционно программно взаимодействовать с компонентой в коде 1С 7.7. Для этого необходимо сначала зарегистрировать библиотеку в системе с помощью regsvr32 (если используется старая версия) и создать объект программно.

Выясним назначение основных методов классического интерфейса:

  1. ДобавитьВКэш(Текст, Идентификатор) — метод служит для предварительной загрузки данных. Например, мы можем перебрать справочник номенклатуры и отправить в память компоненты наименование товара и его внутренний код.
  2. СравнитьСКэшем(ИскомаяСтрока, КоличествоРезультатов) — основная функция поиска. Она сопоставляет строку со всеми данными в памяти и возвращает список наиболее похожих совпадений.
  3. Сравнить(Строка1, Строка2) — используется для разового сравнения двух конкретных значений.

Посмотрим на пример кода для наполнения кэша:


// Создание объекта компоненты
ВК = СоздатьОбъект("AddIn.StrMatch");

// Наполнение кэша данными из справочника
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.ЭтоГруппа = 0 Тогда
        ВК.ДобавитьВКэш(Спр.Наименование, Спр.ТекущийЭлемент());
    КонецЕсли;
КонецЦикла;

Современная модификация: Гибридная компонента без регистрации

Проанализируем современную версию компоненты (версии 3.x), которая решает несколько критических проблем старых библиотек. Основное нововведение заключается в переводе на движок Native API (использование наработок Орефкова), что позволяет компоненте загружаться без регистрации в системном реестре Windows. Это особенно важно для работы в терминальных сессиях и под операционными системами, отличными от Windows (через Wine).

Разберем преимущества гибридной версии:

Использование StrMatch в связке с SQLite

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

Рассмотрим пример реализации такого поиска через SQLiteBase. По словам разработчиков, такой подход сокращает время поиска на 5000 строк с 2-3 секунд до 150 миллисекунд.

Проанализируем по шагам процесс выполнения запроса:


База = СоздатьОбъект("SQLiteBase");
База.Открыть(":memory:"); // Создаем временную базу в памяти
База.РазрешитьЗагрузкуРасширений(1);

Запрос = База.НовыйЗапрос();
// Загружаем расширение из DLL-файла
Запрос.ВыполнитьЗапрос("SELECT load_extension('strmatch.dll');");

// Выполняем поиск по справочнику
ТекстЗапроса = "
|SELECT
|  descr as Наименование,
|  strmatch(descr, 'ИскомыйТекст') as Рейтинг
|FROM Справочник_Номенклатура
|WHERE Рейтинг > 50
|ORDER BY strmatch(descr, 'ИскомыйТекст') DESC;";

ТЗ_Результатов = Запрос.ВыполнитьЗапрос(ТекстЗапроса);

В данном примере функция strmatch() становится доступна прямо в теле SQL-запроса. Обратите внимание, что мы можем использовать ORDER BY по результату функции, чтобы получить наиболее релевантные записи в самом верху таблицы значений.

Практические советы по оптимизации поиска

Работа с нечетким поиском требует внимательного отношения к ресурсам. Проанализируем несколько советов, которые помогут сделать работу с StrMatch.dll более стабильной:

  1. Предварительная фильтрация: Не стоит загонять в кэш или в поисковый запрос сотни тысяч записей. Если вы ищете запчасти конкретного бренда, сначала отфильтруйте данные по этому бренду штатными средствами 1С, и только потом применяйте StrMatch.
  2. Очистка кэша: Не забывайте вызывать метод ОчиститьКэш(), если вы используете классическую версию компоненты, после завершения обработки. Это освободит оперативную память сервера.
  3. Использование идентификаторов: При добавлении данных в кэш используйте в качестве идентификатора уникальный внутренний код элемента (ID), а не само наименование. Это упростит последующее позиционирование на найденном объекте в 1С.
  4. Типизация в SQL: При работе через SQLite помните, что функция strmatch возвращает числовой рейтинг. В некоторых версиях может потребоваться явная типизация для корректной сортировки, например, через CAST(strmatch(...) AS INTEGER), хотя в большинстве случаев сортировка по псевдониму столбца или по порядковому номеру (ORDER BY 2 DESC) работает корректно.

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

← На главную