Как заставить 32-битную компоненту StrMatch.dll работать в 64-битной версии 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Проблема несовместимости старых 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) этих библиотек по умолчанию нет.

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

Рассмотрим по шагам, как подготовить окружение для работы компоненты. Если вы используете 32-битный клиент 1С на 64-битной Windows, вам достаточно корректно зарегистрировать библиотеку.

  1. Подготовка runtime-библиотек. Проанализируем системные требования: нам необходимы файлы mfc71.dll (версия 7.10.6119.0) и msvcr71.dll (версия 7.10.7031.4). Эти файлы нужно скопировать в папку C:\Windows\SysWOW64\. Именно в этой директории 64-битная Windows хранит библиотеки для 32-битных приложений.
  2. Регистрация компоненты. Запустим командную строку cmd.exe от имени администратора. Для регистрации 32-битных библиотек в 64-битной системе нужно использовать версию regsvr32, расположенную в папке SysWOW64.

Выполним следующую команду:


C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКВашейПапке\StrMatch.dll"

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

Способ 2: Использование COM+ как моста между x64 и x32

Что же делать, если нам критически важно использовать StrMatch.dll именно в 64-битном процессе (например, в регламентном задании на сервере)? Рассмотрим механизм создания суррогатного процесса через "Службы компонентов" (Component Services). Это позволит 64-битной 1С обращаться к 32-битной библиотеке через межпроцессное взаимодействие.

Проанализируем шаги настройки:

  1. Откройте "Панель управления" -> "Администрирование" -> "Службы компонентов".
  2. Перейдите в ветку Консоль управления -> Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.
  3. Нажмите правой кнопкой мыши и выберите Создать -> Приложение.
  4. В мастере создания выберите "Создать новое приложение", дайте ему имя (например, StrMatch_Bridge) и выберите тип "Серверное приложение".
  5. В качестве учетной записи укажите пользователя, под которым работает сервер 1С (или локальную систему).
  6. В созданном приложении откройте папку Компоненты, нажмите Создать -> Компонент.
  7. Выберите "Установка новых компонентов" и укажите путь к вашей StrMatch.dll.

После этой настройки при вызове компоненты из 1С система автоматически запустит процесс dllhost.exe (32-битный), который станет "прослойкой". Теперь ваш 64-битный сервер сможет работать с методами нечеткого сравнения строк.

Способ 3: Реализация алгоритма на встроенном языке 1С

Посмотрим на ситуацию шире. Если использование внешних 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С.

← На главную