Проблема несовместимости старых COM-компонент с современными 64-битными версиями платформы 1С:Предприятие — одна из классических задач, с которой сталкиваются разработчики при миграции систем. Компонента StrMatch.dll, предназначенная для нечеткого сравнения строк (алгоритмы Левенштейна и другие), была написана много лет назад и имеет 32-битную архитектуру. В этом материале мы подробно разберем, почему возникает ошибка, и какими способами можно вернуть работоспособность привычному инструменту.
Разберем ситуацию с технической точки зрения. Когда мы запускаем 64-битный клиент 1С или регламентное задание на 64-битном сервере, операционная система создает процесс с архитектурой x64. По правилам Windows, 64-битный процесс не может напрямую загрузить в свое адресное пространство 32-битную библиотеку (DLL). Именно поэтому стандартная попытка инициализировать объект через Новый COMОбъект("StrMatch.FuzzyString") заканчивается ошибкой "Класс не зарегистрирован", даже если сама библиотека успешно зарегистрирована в системе.
Дополнительная сложность заключается в зависимостях. StrMatch.dll была разработана с использованием старых версий Microsoft Visual C++ (в частности, версии 2003 года), поэтому для её работы в системе обязательно должны присутствовать файлы mfc71.dll и msvcr71.dll. В современных ОС (Windows 10, Server 2019/2022) этих библиотек по умолчанию нет.
Рассмотрим по шагам, как подготовить окружение для работы компоненты. Если вы используете 32-битный клиент 1С на 64-битной Windows, вам достаточно корректно зарегистрировать библиотеку.
mfc71.dll (версия 7.10.6119.0) и msvcr71.dll (версия 7.10.7031.4). Эти файлы нужно скопировать в папку C:\Windows\SysWOW64\. Именно в этой директории 64-битная Windows хранит библиотеки для 32-битных приложений.cmd.exe от имени администратора. Для регистрации 32-битных библиотек в 64-битной системе нужно использовать версию regsvr32, расположенную в папке SysWOW64.Выполним следующую команду:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейПапке\StrMatch.dll"
Важный нюанс: Если регистрация проходит успешно, но 1С все равно не видит объект, попробуйте один раз запустить 1С от имени администратора. Это позволит компоненте корректно прописать необходимые ключи в ветке реестра HKEY_CLASSES_ROOT.
Что же делать, если нам критически важно использовать StrMatch.dll именно в 64-битном процессе (например, в регламентном задании на сервере)? Рассмотрим механизм создания суррогатного процесса через "Службы компонентов" (Component Services). Это позволит 64-битной 1С обращаться к 32-битной библиотеке через межпроцессное взаимодействие.
Проанализируем шаги настройки:
Консоль управления -> Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.Создать -> Приложение.StrMatch_Bridge) и выберите тип "Серверное приложение".Компоненты, нажмите Создать -> Компонент.StrMatch.dll.После этой настройки при вызове компоненты из 1С система автоматически запустит процесс dllhost.exe (32-битный), который станет "прослойкой". Теперь ваш 64-битный сервер сможет работать с методами нечеткого сравнения строк.
Посмотрим на ситуацию шире. Если использование внешних DLL вызывает слишком много проблем с администрированием, стоит рассмотреть вариант реализации алгоритма Левенштейна непосредственно на языке 1С. Это обеспечит полную кроссплатформенность (Windows/Linux) и независимость от разрядности.
Рассмотрим пример кода функции для расчета расстояния Левенштейна:
Функция РасстояниеЛевенштейна(Стр1, Стр2) Экспорт
н1 = СтрДлина(Стр1);
н2 = СтрДлина(Стр2);
Если н1 = 0 Тогда Возврат н2; КонецЕсли;
Если н2 = 0 Тогда Возврат н1; КонецЕсли;
Матрица = Новый Массив(н1 + 1, н2 + 1);
Для и1 = 0 По н1 Цикл
Матрица[и1][0] = и1;
КонецЦикла;
Для и2 = 0 По н2 Цикл
Матрица[0][и2] = и2;
КонецЦикла;
Для и1 = 1 По н1 Цикл
Символ1 = Сред(Стр1, и1, 1);
Для и2 = 1 По н2 Цикл
Символ2 = Сред(Стр2, и2, 1);
ЦенаЗамены = ?(Символ1 = Символ2, 0, 1);
Матрица[и1][и2] = Мин(
Матрица[и1-1][и2] + 1, // Удаление
Матрица[и1][и2-1] + 1, // Вставка
Матрица[и1-1][и2-1] + ЦенаЗамены // Замена
);
КонецЦикла;
КонецЦикла;
Возврат Матрица[н1][н2];
КонецФункции
Преимущества данного подхода:
Проанализировав проблему, мы выяснили, что "неработоспособность" StrMatch.dll — это не ошибка самой компоненты, а следствие естественного развития технологий и перехода на 64-битную архитектуру.
Для быстрого решения в рамках 32-битных клиентов достаточно правильно разместить mfc71.dll и msvcr71.dll в папке SysWOW64. Для серверных решений оптимальным путем будет настройка COM+ Surrogate или переход на современные Native API компоненты, которые изначально поставляются в двух вариантах разрядности. Если же производительность позволяет, наиболее надежным и современным способом станет перенос логики сравнения на встроенный язык 1С.