В экосистеме 1С:Предприятие 7.7 внешняя компонента StrMatch.dll является де-факто стандартом для реализации алгоритмов нечеткого поиска. Она незаменима, когда требуется сопоставить номенклатуру от разных поставщиков, найти дублирующихся контрагентов или реализовать интеллектуальный подбор адресов. Платформа 7.7 не обладает встроенными механизмами для подобных задач, поэтому использование сторонних библиотек становится производственной необходимостью. Проанализируем возможности этой компоненты, разберем способы её подключения и рассмотрим современные модификации.
Разберем, как именно компонента обрабатывает данные. В отличие от стандартных методов поиска «по подстроке», StrMatch.dll вычисляет коэффициент схожести (рейтинг) между двумя текстовыми значениями. Это позволяет находить результаты даже при наличии опечаток, перестановок слов или различий в регистрах.
Проанализируем ключевые особенности логики библиотеки:
Рассмотрим, как традиционно программно взаимодействовать с компонентой в коде 1С 7.7. Для этого необходимо сначала зарегистрировать библиотеку в системе с помощью regsvr32 (если используется старая версия) и создать объект программно.
Выясним назначение основных методов классического интерфейса:
ДобавитьВКэш(Текст, Идентификатор) — метод служит для предварительной загрузки данных. Например, мы можем перебрать справочник номенклатуры и отправить в память компоненты наименование товара и его внутренний код.СравнитьСКэшем(ИскомаяСтрока, КоличествоРезультатов) — основная функция поиска. Она сопоставляет строку со всеми данными в памяти и возвращает список наиболее похожих совпадений.Сравнить(Строка1, Строка2) — используется для разового сравнения двух конкретных значений.Посмотрим на пример кода для наполнения кэша:
// Создание объекта компоненты
ВК = СоздатьОбъект("AddIn.StrMatch");
// Наполнение кэша данными из справочника
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа = 0 Тогда
ВК.ДобавитьВКэш(Спр.Наименование, Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Проанализируем современную версию компоненты (версии 3.x), которая решает несколько критических проблем старых библиотек. Основное нововведение заключается в переводе на движок Native API (использование наработок Орефкова), что позволяет компоненте загружаться без регистрации в системном реестре Windows. Это особенно важно для работы в терминальных сессиях и под операционными системами, отличными от Windows (через Wine).
Разберем преимущества гибридной версии:
regsvr32, достаточно положить её в папку с базой или в каталог Bin платформы.Выясним причину, по которой интеграция с 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 более стабильной:
StrMatch.ОчиститьКэш(), если вы используете классическую версию компоненты, после завершения обработки. Это освободит оперативную память сервера.ID), а не само наименование. Это упростит последующее позиционирование на найденном объекте в 1С.strmatch возвращает числовой рейтинг. В некоторых версиях может потребоваться явная типизация для корректной сортировки, например, через CAST(strmatch(...) AS INTEGER), хотя в большинстве случаев сортировка по псевдониму столбца или по порядковому номеру (ORDER BY 2 DESC) работает корректно.Таким образом, использование компоненты StrMatch.dll значительно расширяет возможности 1С 7.7 в области обработки текстовой информации. Переход на современные версии библиотеки позволяет избежать проблем с регистрацией компонент и существенно повысить скорость поиска за счет использования технологий прямого доступа к данным.