Не удается загрузить внешнюю компоненту addinextd dll

Обновлено: 06.07.2024

Эта статья дает представление о работе внешних компонент в системе «1С: Предприятие».
Будет показан процесс разработки внешней компоненты для системы «1С: Предприятие» версии 8.2, работающей под управлением ОС семейства Windows с файловым вариантом работы. Такой вариант работы используется в большинстве решений, предназначенных для предприятий малого бизнеса. ВК будет реализована на языке программирования C++.

Внешние компоненты «1C: Предприятие»

  • с использованием Native API
  • с использованием технологии COM
Структура ВК

Внешняя компонента системы «1С: Предприятие» представлена в виде DLL-библиотеки. В коде библиотеки описывается класс-наследник IComponentBase. В создаваемом классе должны быть определены методы, отвечающие за реализацию функций внешней компоненты. Более подробно переопределяемые методы будут описаны ниже по ходу изложения материала.

Запуск демонстрационной ВК

  1. Выполнить сборку внешней компоненты, поставляемой с подпиской ИТС и предназначенной для демонстрации основных возможностей механизма внешних компонент в 1С
  2. Подключить демонстрационную компоненту к конфигурации 1С
  3. Убедиться в корректной работоспособности заявленных функций
Компиляция


Демонстрационная ВК расположена на диске подписки ИТС в каталоге «/VNCOMP82/example/NativeAPI».
Для сборки демонстрационной ВК будем использовать Microsoft Visual Studio 2008. Другие версии данного продукта не поддерживают используемый формат проекта Visual Studio.

Открываем проект AddInNative. В настройках проекта подключаем каталог с заголовочными файлами, необходимыми для сборки проекта. По умолчанию они располагаются на диске ИТС в каталоге /VNCOMP82/include.
Результатом сборки является файл /bind/AddInNative.dll. Это и есть скомпилированная библиотека для подключения к конфигурации 1С.

Подключение ВК к конфигурации 1С

Создадим пустую конфигурацию 1С.
Ниже приведен код модуля управляемого приложения.

Если при запуске конфигурации 1С не было сообщено об ошибке, то ВК была успешно подключена.
В результате выполнения приведенного кода в глобальной видимости конфигурации появляется объект ДемоКомп, имеющий свойства и методы, которые определены в коде внешней компоненты.

Демонстрация заложенного функционала

Произвольное имя внешней компоненты

Задача: Изменить имя внешней компоненты на произвольное.
В предыдущем разделе использовался идентификатор AddInNativeExtension, смысл которого не был пояснен. В данном случае AddInNativeExtension — это наименование расширения.
В коде ВК определен метод RegisterExtensionAs, возвращающий системе «1С: Предприятие» имя, которое необходимо для последующей регистрации ВК в системе. Рекомендуется указывать идентификатор, который в известной мере раскрывает суть внешней компоненты.
Приведем полный код метода RegisterExtensionAs с измененным наименованием расширения:

В приведенном примере имя ВК изменено на SomeName. Тогда при подключении ВК необходимо указывать новое имя:

Расширение списка свойств ВК

  1. Изучить реализацию свойств ВК
  2. Добавить свойство строкового типа, доступное для чтения и записи
  3. Добавить свойство строкового типа, доступное для чтения и записи, которое хранит тип данных последнего установленного свойства. При установке значения свойства никаких действий не производится
  4. Убедиться в работоспособности произведенных изменений

Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию приведенных методов класса CAddInNative.
В демонстрационной ВК определены 2 свойства: Включен и ЕстьТаймер (IsEnabled и IsTimerPresent).
В глобальной области видимости кода библиотеки определено два массива:

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

  1. Добавить имя добавляемого свойства в массивы g_PropNames и g_PropNamesRu (файл AddInNative.cpp)
  2. В перечисление Props (файл AddInNative.h) перед ePropLast добавить имя, однозначно идентифицирующее добавляемое свойство
  3. Организовать память под хранение значений свойств (завести поля модуля компоненты, хранящие соответствующие значения)
  4. Внести изменения в методы GetPropVal и SetPropVal для взаимодействия с выделенной на предыдущем шаге памятью
  5. В соответствии с логикой приложения внести изменения в методы IsPropReadable и IsPropWritable

Перечисление Props будет иметь вид:

Для значительного упрощения кода будем использовать STL C++. В частности, для работы со строками WCHAR, подключим библиотеку wstring.
Для сохранения значения метода Тест, определим в классе CAddInNative в области видимости private поле:

Для передачи строковых параметров между «1С: Предприятие» и внешней компонентов используется менеджер памяти «1С: Предприятие». Рассмотрим его работу подробнее. Для выделения и освобождения памяти соответственно используются функции AllocMemory и FreeMemory, определенные в файле ImemoryManager.h. При необходимости передать системе «1С: Предприятие» строковый параметр, внешняя компонента должна выделить под нее память вызовом функции AllocMemory. Ее прототип выглядит следующим образом:

где pMemory — адрес указателя, в который будет помещен адрес выделенного участка памяти,
ulCountByte — размер выделяемого участка памяти.
Пример выделения памяти под строку:

Для удобства работы с строковыми типами данными опишем функцию wstring_to_p. Она получает в качестве параметра wstring-строку. Результатом функции является заполненная структура tVariant. Код функции:

Тогда соответствующая секция case оператора switch метода GetPropVal примет вид:

Метода SetPropVal:

Для реализации второго свойства определим поле класса CaddInNative

в котором будем сохранять тип последнего переданного значения. Для этого в метод CaddInNative::SetPropVal добавим команду:

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

Расширение списка методов

  1. Расширить функционал внешней компоненты следующим функционалом:
  2. Изучить способы реализации методов внешней компоненты
  3. Добавить метод-функцию Функц1, которая в качестве параметра принимает две строки («Параметр1» и «Параметр2»). В качестве результата возвращается строка вида: «Проверка. Параметр1, Параметр2»
  4. Убедиться в работоспособности произведенных изменений
  1. Добавить имя метода в массивы g_MethodNames и g_MethodNamesRu (файл AddInNative.cpp)
  2. Добавить осмысленный идентефикатор метода в перечисление Methods (файл AddInNative.h)
  3. Внести изменения в код функции GetNParams в соответствии с логикой программы
  4. При необходимости внести изменения в код метода GetParamDefValue, если требуется использовать значения по умолчанию параметров метода.
  5. Внести изменения в функцию HasRetVal
  6. Внести изменения в логику работы функций CallAsProc или CallAsFunc, поместив туда непосредственно исполняемый код метода

Отредактируем функцию GetNProps, чтобы она возвращала количество параметров метода «Тест»:

Внесем изменения в функцию CAddInNative::GetParamDefValue:

Благодаря добавленной строке

в случае отсутствия одного или нескольких аргументов соответствующие параметры будут иметь пустое значение (VTYPE_EMPTY). Если необходимо наличие значения по умолчанию для параметра, следует задать его в секции eMethTest оператора switch функции CAddInNative::GetParamDefValue.
Так как метод «Тест» может возвращать значение, необходимо внести изменения в код функции HasRetVal:

И добавим исполняемый код метода в функцию CallAsFunc:

Скомпилируем компоненту и приведем код конфигурации к виду:

Таймер

  1. Изучить реализацию таймера в демонстрационной ВК
  2. Модифицировать метод «СтартТаймер», добавив возможность передавать в параметрах интервал срабатывания таймера (в миллисекундах)
  3. Убедиться в работоспособности произведенных изменений

Рассмотрим реализацию таймера в демонстрационной ВК.
Так как мы рассматриваем процесс разработки внешней компоненты для ОС семейства Windows, не будем рассматривать реализацию таймера в других операционных системах. Для ОС GNU/Linux, в частности, реализация будет отличаться синтаксисом функции SetTimer и TimerProc.
В исполняемом коде вызывается метод SetTimer, в который передается функция MyTimerProc:

Идентефикатор созданного таймера помещается в переменную m_uiTimer, чтобы в последствии его можно было отключить.
Функция MyTimerProc выглядит следующим образом:

Приведем код метода CallAsProc к виду:

Теперь проверим работоспособность. Для этого в модуле управляемого приложения конфигурации напишем код:

Взаимодействие с системой «1С: Предприятие»

Добрый день.
Используется:
Windows8.1 x64, 1С:Предприятие 8.3 (8.3.13.1644), ARM_ORION_PRO1_20_2
Orion1C.dll ,брал из каталога 1C_WorkTime, в каталоге находятся Orion1C.sil и Orion1C.dll
при использовании Example1.exe и Example2.exe все происходит корректно

На текущий момент такая ошибка при использовании метода в 1с
ЗагрузитьВнешнююКомпоненту("Orion1C.dll"); выдает ошибку
"Не смогли загрузить внешнюю компоненту."
ОписаниеОшибки() = "Ошибка при вызове метода контекста (ЗагрузитьВнешнююКомпоненту): Ошибка при загрузке внешней компоненты"
Пробовал указать полный путь к местонахождению dll, ошибка та же.

При попытке зарегистрировать компоненту с помощь. regsvr32 выходит ошибка,
"модуль . Orion1C.dll загружен, но не удалось выполнить вызов DLLRegisterServer, код ошибки: 0х80004005"
Подскажите что можно сделать.

1 год 6 месяцев назад

avatar

Это сразу пробовал. не помогает. Если нет прав обычно пишет другую ошибку

– Ряснов Александр 1 год 6 месяцев назад

«ЗАМЕЧАНИЕ: на управляемых формах программа работает ощутимо медленнее, поэтому, если есть возможность оставаться на обычных формах, то разработчик рекомендует запускать программу в режиме «Обычное приложение».»

(Заинтригован, т.к. у «1С» ников упор в сторону «управляемых форм», буду пробовать «на разгон», там есть такая «фича», будет время, кратко распишу… )

. А запуск в отладочном режиме - даёт много дополнительной информации…

– Карпов Дмитрий 1 год 6 месяцев назад

Ваш номер телефона будет доступен только администраторам сайта.

Спасибо за понимание.

ПОКАЗАН

ЗАДАН

1 год 6 месяцев назад

ПРОДУКТЫ

По каждому вопросу/ответу можно добавлять комментарии. Комментарии предназначены для уточнения вопроса/ответа.

Ошибка Не найден файл внешней компоненты возникает при использовании в 1С дополнительных сервисов, например:

  • Сервис Банковских выписок;
  • Сервис мониторинга банков;
  • Сервис регистрации;
  • Сервис склонения Morpher;
  • Сервис Спарк риски;
  • и т.д.


За каждый такой загружаемый сервис в 1С отвечает своя константа. Если открыть Конфигуратор 1С, то в ветке Константы можно увидеть список этих специализированных констант.


При загрузке указанных сервисов константа «взводится» в положение Используется.

Рекомендации по исправлению ошибки

Если по каким-то причинам при проведении банковских выписок, склонении ФИО в формах документа и т.д. выходит ошибка, что не найден файл внешней компоненты, начинать нужно с проверки состояния констант, отвечающих за данную компоненту в 1С.

Посмотреть состояние константы можно из 1С: кнопка Главное меню — Все функции — Константы .


Флаг сервиса должен быть взведен. Если сервис не используется, программа компоненту «не видит». Выставите флаг сервиса вручную.


Если после установки флага автоматическую загрузку компоненты 1С не выполняет, приходится «загружать» ее «вручную». В этих случаях программисты пишут маленькие внешние обработки, которые позволяют загрузить нужную компоненту самостоятельно.

Перестал работать сервис склонений ФИО в программе 1С. Программист написал внешнюю обработку, проверяющую состояние константы Использовать сервис склонения «Морфер» и загружающую компоненту принудительно.

В программном коде обработки программист прописал принудительную установку константы ИспользоватьСервисСклоненияMorpher для загрузки сервиса Морфер.


Пошаговая инструкция работы с обработкой установки сервиса Морфер.

Шаг 1. Подключение внешней обработки в программе.

Откройте форму подключения внешних печатных форм, отчетов и обработок в 1С: раздел Администрирование — Настройки программы — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки .


По кнопке Добавить из файла … загрузите внешнюю обработку ЗагрузкаСервисаМорфер.


Шаг 2. Настройка внешней обработки.

Укажите раздел размещения обработки и пользователей, которым предоставлен доступ к ней.


Шаг 3. Запуск обработки.

Перейдите в раздел, который указали в настройке и откройте ссылку Дополнительные обработки .


В окне дополнительных обработок установите курсор на указанной обработке и нажмите кнопку Выполнить .


Шаг 4. Проверка подключения сервиса Морфер.

Проверьте использование сервиса в программе по кнопке Проверить .


Шаг 5. Установка сервиса Морфер.

Включите использование сервиса Морфер и загрузите программно соответствующую компоненту по кнопке Применить .


Шаг 6. Проверьте установку компоненты по кнопке Проверка .


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

Например, печать штрихкодов в 1С 8.3 для 64-х разрядной Платформы на текущий момент не выполняется. Требуется установить 32-разрядную Платформу 8.3. Подробно об этом мы рассказали в статье Компонента 1С: Печать штрихкодов не установлена на данном компьютере.

И не забывайте самое главное правило при поиске ошибок: перед тем, как лезть в проблему глубоко — перезагрузите компьютер или сервер, если установлена не файловая. а клиент-серверная 1С. Часто именно такой простой способ дает отличные результаты. Особенно, если все раньше «работало» и вдруг… перестало.

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

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Похожие публикации

Карточка публикации

(3 оценок, среднее: 2,33 из 5)

Данную публикацию можно обсудить в комментариях ниже.
Обратите внимание! В комментариях наши кураторы не отвечают на вопросы по программам 1С и законодательству.
Задать вопрос нашим специалистам можно по ссылке >>
Вы можете задать еще вопросов

Доступ к форме "Задать вопрос" возможен только при оформлении полной подписки на БухЭксперт8

Вы можете оформить заявку от имени Юр. или Физ. лица Оформить заявку

Нажимая кнопку "Задать вопрос", я соглашаюсь с
регламентом БухЭксперт8.ру >>

Содержание

Вы можете задать еще вопросов

Доступ к форме "Задать вопрос" возможен только при оформлении полной подписки на БухЭксперт8

Вы можете оформить заявку от имени Юр. или Физ. лица Оформить заявку

Нажимая кнопку "Задать вопрос", я соглашаюсь с
регламентом БухЭксперт8.ру >>

· для банковских выписок;

· для мониторинга банков;

· для склонения имен;

· сервисом «СПАРК риски»;

· для формирования штрихкодов;

2. Как избавится от данной ошибки в системе 1С

Зачастую за сервисы, которые используются в базе отвечают конкретная константа и функциональная опция, поэтому в первую очередь следует проверить, установлено ли на данной константе в состояние «Истина».

Если ошибка в системе 1С появилась недавно, а до этого момента все работало нормально, предлагается почистить кэш 1С, а также перезагрузить сервер. Если данная рекомендация не помогла, следует проверить наличие регистра сведений «Кэш файлов». Для этого нужно в главном меню открыть пункт «Все функции», далее выбрать «регистры сведений», а затем найти регистр «Кэш файлов» и нажать кнопку «Очистить кэш». После этого нужно перезапустить платформу.

Если в результате данных манипуляций ошибка все еще появляется, следует проверить, как называется данная компонента в конфигураторе и зарегистрировать ее в системе Windows. Для этого нужно открыть командную строку Windows под правами администратора и использовать команду regsvr32 "<Путь к компоненте>", где "<Путь к компоненте>" – путь к компоненте (*.dll). Пример регистрации компоненты «comcntr.dll»:

Пример регистрации компоненты comcntr.dll

После удачной регистрации компоненты обязательно нужно перезапустить службу агента 1С.

Может возникнуть вопрос, «где же взять файл компоненты?». Некоторые компоненты идут в самой поставке платформы 1С. Ярким примером такой компоненты является «comcntr.dll». Данная компонента отвечает за COM соединения, что позволяет обмениваться данными между базами и сервисами по данной технологии. Остальные компоненты зачастую предоставляются сервисами, которые вы используете.

В данной статье мы рассмотрели основные возможности устранения ошибки отсутствия файла компоненты 1С. Но важно понимать, что при работе с таким многогранным и сложным продуктом как 1С трудности возникать будут – увы, как бы хороши ни были программные решения 1С, ничто в этом мире не идеально. Поэтому если у Вас возникают вопросы, не стесняйтесь обратиться за помощью. Наши специалисты всегда рады помочь в решении сложных задач!

Спасибо за уделенное внимание и пусть Ваши дела всегда идут только в гору!

Читайте также: