При работе с отраслевыми решениями для розничной торговли (например, на базе разработок «Штрих-М») или кастомными конфигурациями для управления продажами, программисты часто сталкиваются с использованием внешних библиотек, написанных на C++. Одной из таких специфических библиотек является addin_rmk40.dll. Рассмотрим ситуацию, когда при запуске обработки или конфигурации возникает ошибка «не удалось создать объект внешней компоненты», и разберем по шагам, как восстановить работоспособность системы.
Прежде всего, проанализируем, за что отвечает данный компонент. Судя по коду и названию (RMK 4.0), эта библиотека является частью фронт-офисных систем и используется как математический акселератор. В 1С сложные расчеты, например, расчет многомерных матриц скидок или распределение товаров по сложным алгоритмам, могут выполняться достаточно медленно. Внешняя компонента addin_rmk40.dll берет на себя эти вычисления, предоставляя 1С готовый результат через COM-интерфейс.
Если компонента не подключена, система выдает предупреждение: «Скорость расчета будет замедлена». Это означает, что в коде предусмотрен альтернативный алгоритм на встроенном языке 1С, но он менее эффективен.
Если у вас есть сама конфигурация или внешняя обработка, но нет файла DLL в системных папках, первым делом проверим макеты. Разберем, как разработчики обычно «упаковывают» такие файлы внутрь 1С. Как правило, библиотека хранится в макете с типом Двоичные данные.
AddIn_dll или похожим, это и есть наша библиотека.addin_rmk40.dll.Проанализируем программный код, который пытается инициализировать компоненту. Рассмотрим пример типичного блока инициализации:
АльтернативныйРасчетМатрицы = Ложь;
Попытка
// Попытка регистрации компоненты в сеансе
ПодключитьВнешнююКомпоненту("AddIn.AddInObject");
Исключение
ОписаниеРезультата = "не удалось загрузить внешнюю компоненту ""addin_rmk40.dll"". Скорость расчета будет замедлена.";
Сообщить(ОписаниеРезультата, СтатусСообщения.Важное);
АльтернативныйРасчетМатрицы = Истина;
КонецПопытки;
Если АльтернативныйРасчетМатрицы = Ложь Тогда
Попытка
// Создание объекта для выполнения расчетов
МатрицаОбъект = Новый("AddIn.Matrix", Неопределено);
Исключение
ОписаниеРезультата = "не удалось создать объект внешней компоненты ""addin_rmk40.dll""";
Сообщить(ОписаниеРезультата, СтатусСообщения.Важное);
КонецПопытки;
КонецЕсли;
Выясним причину, по которой ПодключитьВнешнююКомпоненту может возвращать Ложь. Часто разработчики забывают, что перед подключением компоненту нужно физически «положить» на диск и зарегистрировать. В современных версиях 1С (начиная с 8.2) для этого используется метод УстановитьВнешнююКомпоненту().
Рассмотрим правильную последовательность действий в коде:
AddIn.Matrix).Если в коде вашей обработки отсутствует вызов УстановитьВнешнююКомпоненту(), то 1С будет искать библиотеку только в системных путях Windows или в реестре. Попробуем добавить этот вызов перед попыткой подключения.
Проанализируем ситуацию с точки зрения системного администрирования. Библиотека addin_rmk40.dll создавалась во времена активного использования 32-битных систем. Это накладывает критическое ограничение:
Важно: Если вы используете 64-битный клиент «1С:Предприятие», 32-битная компонента (которой почти наверняка является данная DLL) работать не будет. При попытке подключения вы всегда будете получать ошибку, так как 64-битный процесс не может загрузить 32-битный модуль.
Выясним, как решить эту проблему:
Если программные методы 1С не помогают, рассмотрим вариант ручной регистрации COM-объекта. Для этого нам понадобятся права администратора.
addin_rmk40.dll в папку C:\Windows\SysWOW64 (для 64-битных ОС) или C:\Windows\System32 (для 32-битных ОС).regsvr32 "C:\Windows\SysWOW64\addin_rmk40.dll".Если регистрация прошла успешно, в реестре Windows появятся записи для AddIn.AddInObject и AddIn.Matrix. После этого 1С сможет создать объект без дополнительных манипуляций с макетами.
Иногда при попытке регистрации возникает ошибка «Модуль не найден». Разберем, что это значит. Часто это не означает отсутствие самого файла DLL, а указывает на отсутствие зависимых библиотек (например, Microsoft Visual C++ Redistributable). Для addin_rmk40.dll может потребоваться установка старых версий пакетов Visual C++ (2005 или 2008 года), так как компонента была разработана именно под эти стандарты.
Подведем итог: если вы нашли конфигурацию без этой библиотеки, попробуйте сначала найти её в макетах. Если её там нет — придется искать оригинальный дистрибутив «Штрих-М: РМК» или аналогичного решения, так как библиотека является проприетарной. Однако, как показывает практика, наличие в коде «Альтернативного расчета» позволяет работать и без неё, хоть и с меньшей производительностью на больших объемах данных.