Меню
Бесплатно
Главная  /  Дом и быт  /  Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы. Расширение списка методов

Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы. Расширение списка методов


Это связано с некоторыми особенностями работы функции глобального контекста ПодключитьВнешнююКомпоненту() .

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

При этом пользователи видят, например, такую картинку:

В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.

С чем это связано? Это связано с тем, что, когда пользователи работают через сервер терминалов, они имеют меньше прав, чем при работе на локальном компьютере.

В этом легко убедиться, если зайти на сервер терминалов под учетной записью с административными правами.

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

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

Например, такие:

1. Запустить первый раз 1С под административными правами.

Этот вариант далеко не всегда срабатывает. Ниже объясню, почему.

2. Дать обычным пользователям терминала права на запись в ветку системного реестра HKEY_CLASSES_ROOT .

Недостаточно "продвинутым" пользователям лучше этого не делать, иначе могут быть проблемы.

3. С помощью различных "примочек" регистрировать ВК от имени пользователя с полными правами.

Тоже не есть хорошо.

Так как же все таки лучше выйти из этой ситуации?

Я предлагаю свой вариант решения этой проблемы. По моему мнению - простой и красивый.

Исследуя эту проблему, я задался вопросом - а зачем 1С вообще пытается зарегистрировать ВК по новому пути? Ведь она уже зарегистрирована в системе.

Дело оказалось в том, что в типовых конфигурациях 1С (например "Управление Торговлей") используется такой синтаксис метода глобального контекста ПодключитьВнешнююКомпоненту():

ПодключитьВнешнююКомпоненту("Справочник.ПодключаемоеОборудование.Макет.ДрайверАТОЛСканерШтрихкода", "АТОЛСканер");

Как видим, ВК драйвера подключается из макета "ДрайверАТОЛСканерШтрихкода" справочника "ПодключаемоеОборудование".

Что же при этом происходит?

1С сохраняет компоненту во временной папке пользователя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

и пытается зарегистрировать ее в ветке реестра HKEY_CLASSES_ROOT именно по этому пути.

На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.

Теперь о том, как выйти из этой ситуации.

Метод глобального контекста ПодключитьВнешнююКомпоненту() имеет несколько вариантов синтаксиса. Вот этим мы и воспользуемся.

Итак, по шагам:

1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:\WINDOWS\SYSTEM32 для 32-разрядной ОС или в папке C:\WINDOWS\SYSWOW64 для 64-разрядной ОС.

2. Используем один из двух дополнительных вариантов синтаксиса метода ПодключитьВнешнююКомпоненту():

Вариант 1:

ПодключитьВнешнююКомпоненту("C:\WINDOWS\SysWOW64\Scaner1C.dll", "АТОЛСканер", ТипВнешнейКомпоненты.COM);

ОбъектДрайвера = Новый ("AddIn.АТОЛСканер.Scaner45");

Вариант 2:

ProgID = "AddIn.Scaner45";

ПодключитьВнешнююКомпоненту(ProgID);

ОбъектДрайвера = Новый (ProgID);

На мой взгляд, вариант № 2 предпочтительнее.

При этом 1С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.

Ну вот собственно и все. Успехов в работе!

[необходимо зарегистрироваться для просмотра ссылки]

Вариант синтаксиса: По имени и местоположению

Синтаксис:

ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
Параметры:

<Местоположение> (обязательный)

Тип: Строка.
Местоположение внешнего компонента.
В качестве местоположения может использоваться:
путь к файлу внешнего компонента в файловой системе (недоступно на веб-клиенте), не ZIP-архив;
полное имя макета, хранящего двоичные данные или ZIP-архив;
URL к внешнему компоненту, в виде двоичных данных или ZIP-архива, в , аналогичном ПолучитьНавигационнуюСсылку.
<Имя> (обязательный)

Тип: Строка.
Символическое имя подключаемой внешнего компонента.
Имя должно удовлетворять правилам именования встроенного языка.
<Тип> (необязательный)

Тип: ТипВнешнейКомпоненты.
Тип подключаемого внешнего компонента.
Не используется, если компонент упакован в ZIP-архив.
Описание варианта метода:

Подключает компоненты, выполненные по технологии Native и COM.
Компонент может храниться в информационной базе или макете конфигурации в виде двоичных данных или в ZIP-архиве.
Для режимов запуска "Тонкий клиент" и "Веб-клиент", компонент должен быть предварительно установлен методом УстановитьВнешнююКомпоненту.
Вариант синтаксиса: По идентификатору

Синтаксис:

ПодключитьВнешнююКомпоненту(<ИдентификаторОбъекта>)
Параметры:

<ИдентификаторОбъекта> (обязательный)

Тип: Строка.
Идентификатор объекта внешнего компонента в виде ProgID (Programmatic Identifier) реестра MS Windows (например: "AddIn.Scanner").
Должно соответствовать информации, находящейся в регистрационной базе данных системы (Registry).
Описание варианта метода:

Компонент должен быть выполнен по технологии COM и зарегистрирован в реестре MS Windows.
Эти компоненты совместимы с компонентами 1С:Предприятия 7.7.
Внимание! Вариант метода не работает на сервере и во внешнем соединении.
Возвращаемое значение:

Тип: Булево.
Истина - подключение прошло успешно.
Описание:

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

Доступность:

Тонкий клиент, веб-клиент, сервер, внешнее соединение.
Примечание:

Внешние компоненты могут быть выполнены по технологии Native API или COM. Компоненты, выполненные по технологии COM, совместимы с компонентами 1С:Предприятия 7.7.
Веб-клиент может работать только с компонентами в информационной базе, упакованными в архив.
Тонкий клиент может работать с компонентами в информационной базе, упакованными в архив, и компонентами, расположенными в файловой системе.
Толстый клиент может работать со всеми вариантами хранения компонентов. При этом, если компонент установлен методом УстановитьВнешнююКомпоненту, то используется установленный компонент, а если не установлен, то компонент будет получен в момент подключения.
Сервер может работать со всеми компонентами. Компонент кэшируется на сеанс работы сервера.
Пример:

Если ПодключитьВнешнююКомпоненту("AddinObject.Scanner") Тогда
Сообщить("Компонента для сканера штрихкодов загружена");
Иначе
Сообщить("Компонента для сканера штрихкодов не загружена");
КонецЕсли;

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

При этом пользователи видят, например, картинку представленную в анонсе статьи.

В то время как при работе с локальных компьютеров никаких проблем с подключением внешних компонент нет.

С чем это связано? Это связано с тем, что, когда пользователи работают через сервер терминалов, они имеют меньше прав, чем при работе на локальном компьютере.

В этом легко убедиться, если зайти на сервер терминалов под учетной записью с административными правами.

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

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

Например, такие:

1. Запустить первый раз 1С под административными правами.

Этот вариант далеко не всегда срабатывает. Ниже объясню, почему.

2. Дать обычным пользователям терминала права на запись в ветку системного реестра HKEY_CLASSES_ROOT .

Недостаточно "продвинутым" пользователям лучше этого не делать, иначе могут быть проблемы.

3. С помощью различных "примочек" регистрировать ВК от имени пользователя с полными правами.

Тоже не есть хорошо.

Так как же все таки лучше выйти из этой ситуации?

Я предлагаю свой вариант решения этой проблемы. По моему мнению - простой и красивый, не предлагавшийся на инфостарте ранее.

Исследуя эту проблему, я задался вопросом - а зачем 1С вообще пытается зарегистрировать ВК по новому пути? Ведь она уже зарегистрирована в системе.

Дело оказалось в том, что в типовых конфигурациях 1С (например "Управление Торговлей") используется такой синтаксис метода глобального контекста ПодключитьВнешнююКомпоненту() :

ПодключитьВнешнююКомпоненту("Справочник.ПодключаемоеОборудование.Макет.ДрайверАТОЛСканерШтрихкода", "АТОЛСканер");

Как видим, ВК драйвера подключается из макета "ДрайверАТОЛСканерШтрихкода" справочника "ПодключаемоеОборудование".

Что же при этом происходит?

1С сохраняет компоненту во временной папке пользователя, например "C:\Documents and Settings\User\Local Settings\Temp\1032\v8_4_12.tmp"

и пытается зарегистрировать ее в ветке реестра HKEY_CLASSES_ROOT именно по этому пути.

На терминале у обычных пользователей нет прав на изменение этой ветки реестра, поэтому компонента у них не подключается.

Теперь о том, как выйти из этой ситуации.

Метод глобального контекста ПодключитьВнешнююКомпоненту() имеет несколько вариантов синтаксиса. Вот этим мы и воспользуемся.

Итак, по шагам:

1. Регистрируем внешнюю компоненту утилитой regsvr32.exe на сервере терминалов в папке C:\WINDOWS\SYSTEM32 для 32-разрядной ОС или в папке C:\WINDOWS\SYSWOW64 для 64-разрядной ОС.

2. Используем один из двух дополнительных вариантов синтаксиса метода ПодключитьВнешнююКомпоненту():

Вариант 1:

ПодключитьВнешнююКомпоненту("C:\WINDOWS\SysWOW64\Scaner1C.dll", "АТОЛСканер", ТипВнешнейКомпоненты.COM);

ОбъектДрайвера = Новый ("AddIn.АТОЛСканер.Scaner45");

Вариант 2:

ProgID = "AddIn.Scaner45";

ПодключитьВнешнююКомпоненту(ProgID);

ОбъектДрайвера = Новый (ProgID);

На мой взгляд, вариант № 2 предпочтительнее.

При этом 1С не пытается перерегистрировать ВК по новому пути в реестре и таким образом, все проблемы решаются.

Ну вот собственно и все. Успехов в работе!

Вопрос: Внешняя компонента Native Api на C++ под Linux (Ubuntu x64) на 1С 8.3


Пишу ВК, не могу подключить к 1с на ubuntu. Даже экзапл от 1с не подключается. Поэтому вопрос по нему:

1) Пытаюсь подключи ВК из примера VNCOMPS, приведённым в статье

(ссылку можно найти в самом конце: «Копирование»).
Внутри в проекте NativeApi есть makefile. С его помощью я собираю.so библиотеку на Ununtu.
Но при "ПодключитьВнешнююКомпоненту" 1с вылетает.
Аналогично, если собираю при помощи "build.sh" (в корне проекта).

В самом makefile меняю флаг с m32 на m64, т.к. 1с и сама система x64. (с параметром m32 не подцепляется всё равно)
Вот пример вызова ВК из 1С 8.3:
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту ("/home/alexeyubuntux64-20 gb/Документы/VNCOMP83/example/NativeAPI/AddInNative.so", "AddInNative", ТипВнешнейКомпоненты.Native); Есть статейка как раз на эту тему.
Но, насколько я вижу, все эти моменты уж учтены исправили в VNCOMPS примере.

Но по сути дело в параметрах компиляции. Мб 32битная внешняя компонента подцепляется к 32-x битной 1с нормально, но я развернул на Ubuntu x64 1c enterprise83 8.3.5-1486 amd64. И хочу к ней подцепить ВК.

Есть у кого мысли, как решить этот вопрос?)
VNCOMPS-пример должен работать, но походу надо поправить параметры сборки, или сама платформа, на которой я тестирую - некорректна.

Ответ: Интересно, а на яве можно внешнюю компоненту написать?

Вопрос: Не подключается внешняя компонента (Native)


Скомпилировал пример c ИТС, для 64 и 32 битной системы.

Подключаю так:
РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКДЛЛ, "Comp", ТипВнешнейКомпоненты.Native); На одном ПК подключение проходит, на другом нет. Есть разница в ос. Где подключение проходит, там стоит Win7, где нет Win10. При этом на ПК, где не работает моя компонента, работают типовые компоненты.

Тестировал на разных платформах (8.3.4.482, 8.3.6.2100, 8.3.11.2700, 8.3.12.1412).

Как понять почему не подключается?

Ответ: vc_redist не забыл?

Вопрос: 1С8 и внешняя компонента с типом Native


Добрый день.
Имеется конфигурация БП 3.0.50.12 и желание внедрить в нее взвешивание от компании Весы-Софт с помощью UniServerAuto.
Разработчики скомпилировали компоненту на Native для Windows 32 и 64, и с файлом maifest сложили в архив. Так же есть пример для 1С, как можно считать вес. В нём с помощью макета с двоичными данными указан, я так понимаю, архив этот. В примере всё неплохо: устанавливается компонента, подключается, потом устанавливается связь и считывается вес.
Но как только начинаешь себе в 1С переносить - вес не считывается. Вроде всё просто написано, но где грабли не пойму.
У кого будет немного времени - помогите, гляньте одним глазком, может решение на поверхности, а я хожу где-т не там и делаю не то. Раньше мне не приходилось с технологией Native работать...

А во вложении мой текст обработки

Ответ:

Ну что, есть новости у меня...
Начал просто по шажкам смотреть в какой момент начнет сбоить. Для этого создал пустую базу и обработку с командой. По аналогии с примером поставщика перенес макет в новую конфу - работает со второго раза. Т.е. с первого раза нет, а со второго да. Это натолкнуло на мысль, что всё-таки надо будет в своей обработке развести подключение компоненты и объекта по разным процедурам.
Далее перенес это в свою базу с подключением макета - работает. Фух, уже хорошо.... Но хотелось бы без внесения изменений в конфигурацию, значит идём дальше

Пробую макет добавить в обработку. Её размер сразу увеличивается с 10кб до 3мб и замечается существенное замедление работы - не подходит. Начинаю копать в сторону подключения компоненты через dll. Т.е. по сути к тому же с чего начал. Но тут есть одно "НО": поиском по имени dll по папке пользователя заметил, что эта dll лежит там, где (я так понял) складываются зарегистрированные в 1С dll-ки:
C:\Users\USER\AppData\Roaming\1C\1cv8\ExtCompT
соответственно нет нужды использовать полный путь к dll, можно просто прописать ее имя:
ПодключитьВнешнююКомпоненту("Add1CUniServerAuto32.dll", "UniServerAuto", ТипВнешнейКомпоненты.Native);

Пробую... ругается на регистрацию, но результат взвешивания возвращает. Получается, что уже dll зарегистрирована и значит ее нужно просто подключать. Убираю и всё работает.
Подвожу итог:
1. В обработку взвешивания в процедуру ПриОткрытии внёсподключение внешней компоненты и подключение к объекту.
2. Путь к dll Не писал, указал просто ее имя.

Теперь сижу и думаю, а когда dll установилась в 1С? В момент установки ПО? Вряд ли... В момент запуска конфигурации разработчика этой dll, где она устанавливается при открытии формы? Не знаю, но мне кажется близко... Вы как думаете?
И второе, На новом месте, когда появится нужда установки такого же терминала, что надо сделать чтобы всё заработало? Установить полностью ПО,запустить конфу поставщика чтобы проверить работу и потом (в теории) моя обработка должна заработать? Че-то как-то сложновато... Или же после установки ПО в моей обработке сделать УстановитьВнешнююКомпоненту один раз?

Ваши мысли на этот счет хотелось бы услышать...

Вопрос: Внешняя компонента.dll


Всем Доброго дня.
Такой вопрос.
Компонента dll , которая прекрасно работает в 1С 7.7
в 1с 8.1 не хочет вообще загрузиться...
Пробовал и вставить ее в C:\Program Files\1cv81\bin\cache1c.dll
Пробовал регистрировать средствами regsvr32 "C:\Program Files\1cv81\bin\cache1c.dll"
Регистрируется без проблем.
Когда хочу к ней обратится, получаю сообщение об ошибке:

Ошибка загрузки внешней компоненты! cache1c.dll
Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка ЗагрузитьВнешнююКомпоненту("C:\Program Files\1cv81\bin\cache1c.dll" ); Исключение Сообщить("Ошибка загрузки внешней компоненты!" + " cache1c.dll" ); КонецПопытки; Попытка // Получить объект компоненты. // m = Новый ("cache1c.GTMcmd" ); m = Новый COMОбъект("cache1c.GTMcmd" ); Исключение Сообщить(); КонецПопытки; КонецПроцедуры

Ответ: Банально до невозможности...
Нужно выдержать паузы между вызовами (миллисекунды)...
Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка // Получить объект компоненты. m = Новый COMОбъект("cache1c.GTMcmd" ); Исключение Сообщить("Не удалось создать объект внешней компоненты" ); КонецПопытки; m.RemoteHost = "192.168.1.101" ; m.RemotePort = 6330; m.Подключить(); m.Пауза(100); ...... итд
Для 1с 7.7 - это не нужно, получается, что шустрее обращение.

Вопрос: Работа внешней компоненты с сервером 1С...


Добрый день,

Имеется внешняя компонента, написанная на С++, задача которой получение информации из внешней базы данных и возврат результата запроса в виде Таблицы значений в 1С.
Для формирования таблицы значений на текуший момент используется интерфейс IDispatch* pBackConnection, получаемый в качестве параметра в функции Init(). Далее я просто, используя функции 1С формирую таблицу значений, заполняю ее и возвращаю ее во второй параметр в CallAsFunc(...).
Проблемы начались с переходом на тонких клиентов 1С. На стороне сервера внешняя компонента толком не запускается. Можно запустить на стороне клиента, но это все выглядит как костыли и выпадает из общей логики "клиент-сервер" в 1С. Например клиент не понимает, что такое таблица значений, проблемы с "глобальными" переменными, сеансами и т.п.
NativeAPI еще более урезан в этом плане.
Танцы с бубном привели к тому, что я смог запустить внешнюю компоненту под сервером 1С, НО работа происходит до того момента, пока не производится попытка вызвать Invoke у pBackConnection. 64-битная версия сервера 8.2 что-то пытается делать, пока не отваливается по таймауту, 32-битная (ВК естественно тоже 32 битная) просто сразу отваливается.
Предполагаю, что сервер 1С не обслуживает этот режим работы.
Соответственно возникают вопросы, это временно или логика 1С сводится к отмене этой схемы работы? Если создать внутренние структуры 1С (таблицу значений) таким способом нельзя, есть ли в принципе описание, что из себя представляет таблица значений на системном уровне, чтобы попытаться создать ее на С++ , заполнить, а затем просто подсунуть 1С в качестве возвратного параметра? Хотелось бы хотя бы получить направление, в какую сторону копать.

Спасибо.

Ответ:

Вы пишите одно, и имеете в виду другое.
В среде 1С, объявление переменных, которые будут видны в разных сеансах не невозможна сейчас, и не было такой возможности ранее. Другой сеанс, это физически другой процесс.
Сеанс, это сеанс подключения к базе данных, т.е. сеанс работы пользователя. Или вы что-то своё вкладываете а это понятие?

В рамках одного сеанса можно было, и можно сейчас, объявить переменные в модуле сеанса, которые будут жить и будут видны в рамках сеанса из разных мест... вообще-то, их 4-ре штуки.
- Модуль сеанса;
- Модуль обычного приложения;
- Модуль управляемого приложения;
- Модуль внешнего соединения.

Ну и естественно, нужно помнить про контекст. Серверный контекст напрямую не доступен на стороне клиента и наоборот.

Вообще то, архитектурой 1С предусмотрено, что обмен данными будет идти:
- по средствам параметров/возвратов процедур/функций;
- по средствам так называемых параметров сеансов (не могут быть объектами, ну собственно видно в палитре).

Таблица на форме... а она связана с какой-либо таблицей объекта (обработки, например) ? или нет. Если да, то она доступна и на сервере (&НаСервере) там и редактируйте....

И таки да, ТаблицаЗначений не доступна в УФ на стороне клиента. Ну уж так решила 1С.

Да ладно! Вот с Excel работает, с FSO работает и кучей всего остального, а тут тут не работает. Отлавливайте ошибку и анализируйте....

Попытка
...
ваши действия
...
Исключение
стр = ОписаниеОшибки();
КонецПопытки;

При современных аппаратных возможностях, это вообще не аргумент.

Сугубо Ваше лично мнение. Ничего общего с реальностью не имеет. Ни в каком виде. Повторю ещё раз, 1С прекрасно работает с COM. Как с in-proc, так и с out-proc.

Приведите, код, которым вы загружаете и обращаетесь в ВК.

Кстати, ВК... в Вашем случае, это COM или Native API ?
Если COM, то вы регистрируете её как... через regsvr32... как тогда "разруливаете" вопрос разрядности?

Вопрос: Установка внешней компоненты


Подскажите плз как установить внешнюю компоненту. При исполнении следующего кода выдается ошибка. В макете находить NameDecl.dll

Попытка УстановитьВнешнююКомпоненту("ОбщийМакет.Макет"); Исключение КонецПопытки ;
Ошибка: Установка внешней компоненты не выполнена!

Ответ: ()
ПодключитьВнешнююКомпоненту("ОбщийМакет.Макет", "NameDecl", ТипВнешнейКомпоненты.Native) выдает ЛОЖЬ ,
Новый("AddIn.NameDecl.CNameDecl", Неопределено) = {()}: Тип не определен (AddIn.NameDecl.NameDecl)

Вопрос: Не подключается native dll на 1с 8.1 (fptrwin32_fz54_9_11_0_5549.dll)


Здравствуйте.
1С обновил dll для онлайн-касс атол для ффд 1.05 (входит в обработку обслуживания fptrwin32_fz54_9_11_0_5549.dll).
У меня старая 1С 8.1. Она в отличии от 8.2 не поддерживает работу со внешним оборудованием аналогично 8.2, поэтому сначала нужно зарегистрировать dll в windows, а затем только в 1С подключать?

ПрогИД = "AddIn.ИнтеграционнаяКомпонента.ATOL_KKT_1C83_V9"; ЗагрузитьВнешнююКомпоненту("C:\fptrwin32_fz54_9_11_0_5549.dll"); ПодключитьВнешнююКомпоненту(ПрогИД); Драйвер = Новый (ПрогИД);

Однако старая обработка была написана на "технологии" com, а новая native. Соответственно при регистрации regsvr32 выдает ошибку:
Модуль загружен, но точка входа DllRegisterServer не найден. И предлагает проверить, что этот файл является правильным файлом dll или OCX.
Кто с подобной ситуацией сталкивался, как выкручивались? Понимаю что аналогичная проблема будет и у 7.7.
Код 8.2:

Макет = ПолучитьМакет("ИнтеграционнаяКомпонента"); Адрес = ПоместитьВоВременноеХранилище(Макет); ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native); Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.ATOL_KKT_1C83_V9");

1C 8.2:
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
1С 8.1:
ПодключитьВнешнююКомпоненту(<Идентификатор объекта>)
Параметры:
<Идентификатор объекта> (обязательный)
Тип: Строка. ProgID (Programmatic Identifier) объекта внешней компоненты. Должно соответствовать информации, находящейся в регистрационной базе данных системы (Registry).
Описание:
Подключает объекты внешней компоненты к 1С:Предприятию.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Примечание:
Внешние компоненты совместимы с компонентами 1С:Предприятия 7.7.
Пример:
Попытка
ПодключитьВнешнююКомпоненту("AddinObject.Scanner");
Сообщить("Компонента для сканера штрих-кодов загружена");
Исключение
Сообщить("Компонента для сканера штрих-кодов не загружена");
КонецПопытки

Как-нибудь можно эту dll на 8.1 подключить или нет?

Спасибо!

Ответ:

У меня тоже недавно всплыла такая проблема. Конвертировать на более позднюю версию 1с не было возможности т.к. dll с которомыми данная конфигурация работает просто переставали работать и 1с вываливалась с ошибкой.
Проблему решил следующим образом:
Создал пустую базу 8.3 в которой сделал обработку инициализации компоненты и затем из 8.1 по COM соединению обращался к созданной ранее базе и там инициализировал компоненту. Затем уже в 8.1 вызывал методы этой компоненты.
Конечно это костыльно, но другого выхода пока не нашел(

Пример кода 8.3:
Перем Драйвер Экспорт;
Функция ПодключениеКомпонентыККТ() Экспорт
Попытка

Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);
ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native);
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20");
Результат = Истина;​

Исключение

Результат = Ложь;​

КонецПопытки;
Возврат Результат
КонецФункции

Пример кода 8.1

Функция СоздатьОбъектДрайвера(Драйвер) Экспорт

Результат = Истина;

Попытка

СтрокаСоединения="File="""Путь к базе""";
КомОбъект= Новый COMОбъект("V83.ComConnector");
Коннект = КомОбъект.Connect(СтрокаСоединения);

Обработка = Коннект.Обработки.ПодключениеВнешнейКомпоненты.Создать();
РезультатПодключения = Обработка.ПодключениеКомпонентыККТ();
Если РезультатПодключения Тогда
Драйвер = Обработка.Драйвер;
КонецЕсли;​

Исключение
Кто занимался этим или сталкивался с подобными вынесениями обясните на простом примере сам принцип. Вроде с подключением внешних компонент все понятно.

// Пример заполнения таблицы значений ТЗ.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК Номенклатура"; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Стр = ТЗ.Добавить(); ЗаполнитьЗначенияСвойств(Стр, Выборка); КонецЦикла;
Не могли бы вы на этом примере объяснить, какую часть кода обычно выносят. Логично было бы вынести часть с запросом, но тогда как из внешней компоненты мы обратимся к БД из внешней компоненты в обход платформы? Текст выносить бессмысленно. Или выносить само формирование табличной части. Поделитесь опытом кто сталкивался с этим.

Ответ: А что слово «Несовместимо» всегда означает слово «Плохо»? Да мне кажется, что назови я свой стиль «1С:Самое плохое программирование на этом скриптовом движке, которое существует в природе (в переводе на литературный язык)!» и то наверняка найдутся желающие заценить этого зверя. А так похоже на классику: «Я Пастернака не читал, но я полностью с ним не согласен!»:)

Вопрос: Подключение внешней компоненты в 1с 8.3.6 и Win8


К самописной конфигурации надо подключить ВнешКомпоненту vk_rs232.dll. Вроде зарегистрировала через regsvr32.exe. "Вроде" потому, что получила сообщение что "компонента зарегистрирована, но чего-то там с брандмауэром". Понадеявшись на первую половину сообщения, пишу код в 1с
ПослеПодключения = Новый ОписаниеОповещения("ПослеПодключенияВК",ЭтаФорма); НачатьУстановкуВнешнейКомпоненты(,"C:\Controller\vk_rs232.dll"); НачатьПодключениеВнешнейКомпоненты(ПослеПодключения,"C:\Controller\vk_rs232.dll","ДЛЛ_Весы");
и получаю ошибку, что
"Установка внешней компоненты не выполнена! Возможно отсутствует компонента для используемого клиентского приложения!".

И теперь я не пойму:
1. Может все же компонента не зарегистрировалась в реестре - как ее там проверить?
2. Может ее "версия" не работает под Win8, хотя она у меня 32-бит.
3. Может сама 1с слишком новая, т.е. соответственно не может работать с этой dll-кой?
4. Ну и банальное - я пишу что-то не то.

Ответ: И все это привело меня в следующей проблеме. ВнешКомп Установлена, теперь ее надо Подключить. И тут оба варианта
ПодключитьВнешнююКомпоненту("C:\Controller\vk_rs232.dll","Весы")
ПодключитьВнешнююКомпоненту("ОбщийМакет.Макет","Весы")

Например, не получится переписать компоненту, если вы не её автор и исходников просто нет. Либо если для ее работы недостаточно поддерживаемых технологией Native API простейших типов (число, строка, булево, дата).

При работе с файловой базой особых проблем нет. Регламентное задание вызывается в фоновом процессе обычного пользователя. Поэтому ему доступны клиенские вызовы. В серверной базе при запуске регламентного задания клиентского контекста нет, соответственно вызов ПодключитьВнешнююКомпоненту() недоступен.

В этом случае можно вызывать компоненту на клиенте. Для этого достаточно выполнить из регламентного задания на сервере запуск еще одного сеанса 1С в котором на клиенте выполнить нужные действия. Ну и не забыть потом завершить запущенный сеанс.

Допустим, у нас в регламентном задании выполняется формирование и сохранение отчета, использующего для склонения ФИО внешнюю COM-компоненту NameDeclension.dll. На файловой базе такое регламентное задание будет работать корректно, на серверной компоненту подключить не получится.

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

#Если Клиент Тогда Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт Если ПодключитьВнешнююКомпоненту("ОбщийМакет.NAMEDECL","Скл",ТипВнешнейКомпоненты.COM) Тогда Компонента = Новый ("AddIn.Скл.NameDeclension"); //Тут код формирования и сохранения отчета Иначе ЗаписьЖурналаРегистрации("РеглЗадания", УровеньЖурналаРегистрации.Ошибка, "Не удалось подключить внешнюю компоненту на клиенте"); КонецЕсли; КонецПроцедуры #Иначе Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт ВыполнитьОперациюНаКлиенте("РеглЗадания.ВыполнитьФормированиеИСохранениеОтчета()"); КонецПроцедуры Процедура ВыполнитьОперациюНаКлиенте(ПараметрДляВыполнения) Экспорт ИмяПользователя = ""; ПарольПользователя = ""; ПутьКВнешнейОбработке = "c:/temp/Автозапуск.epf"; Кавычка = """"; КаталогBIN = КаталогПрограммы(); ПутьККонфигурации = СтрокаСоединенияИнформационнойБазы(); ПутьККонфигурации = СтрЗаменить(ПутьККонфигурации, Кавычка, Кавычка + Кавычка); СтрокаЗапуска = Кавычка + КаталогBIN + "1cv8.exe" + Кавычка + " ENTERPRISE" + " /IBConnectionString " + Кавычка + ПутьККонфигурации + Кавычка + " /N " + Кавычка + ИмяПользователя + Кавычка + " /P " + Кавычка + ПарольПользователя + Кавычка + " /Execute " + Кавычка + ПутьКВнешнейОбработке + Кавычка + " /C " + Кавычка + ПараметрДляВыполнения + Кавычка; ЗапуститьПриложение(СтрокаЗапуска); КонецПроцедуры #КонецЕсли

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

Попытка Выполнить(ПараметрЗапуска); Исключение КонецПопытки; ЗавершитьРаботуСистемы(Ложь);

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

Код для обычного приложения. Теоретически полностью аналогично будет работать и в управляемом.

p.s. Также этот подход можно использовать для выполнения любых клиентских процедур в регламентных заданиях.