Найчастіше у програмістів виникають проблеми з підключенням зовнішніх компонент (наприклад, драйверів торгового устаткування), коли користувачі працюють з 1С, підключаючись до сервера через термінал.
Це пов'язано з деякими особливостями роботи функції глобального контексту ПодключітьВнешнююКомпоненту ().
При цьому користувачі бачать, наприклад, картинку представлену в анонсі статті.
У той час як при роботі з локальних комп'ютерів ніяких проблем з підключенням зовнішніх компонент немає.
З чим це пов'язано? Це пов'язано з тим, що, коли користувачі працюють через сервер терміналів, вони мають менше прав, ніж при роботі на локальному комп'ютері.
У цьому легко переконатися, якщо зайти на сервер терміналів під обліковим записом з адміністративними правами.
Причина такої різниці полягає в тому, що 1С не може зареєструвати зовнішню компоненту в реєстрі, коли користувач працює в терміналі під звичайними правами, тому що у звичайного користувача немає прав на запис в гілку системного реєстру HKEY_CLASSES_ROOT.
У публікаціях на тему підключення зовнішніх компонент в терміналі пропонуються найрізноманітніші методи вирішення цієї проблеми.
1. Запустити перший раз 1С під адміністративними правами.
Цей варіант далеко не завжди спрацьовує. Нижче поясню, чому.
2. Дати звичайним користувачам терміналу права на запис в гілку системного реєстру HKEY_CLASSES_ROOT.
Недостатньо "просунутим" користувачам краще цього не робити, інакше можуть бути проблеми.
3. За допомогою різних "примочок" реєструвати ВК від імені користувача з повними правами.
Теж не є добре.
Так як же все таки краще вийти з цієї ситуації?
Я пропоную свій варіант вирішення цієї проблеми. На мою думку - простий і красивий, не пропонувався на Лансере раніше.
Досліджуючи цю проблему, я задався питанням - а навіщо 1С взагалі намагається зареєструвати ВК по новому шляху? Адже вона вже зареєстрована в системі.
Справа виявилася в тому, що в типових конфігураціях 1С (наприклад "Управління Торгівлею") використовується такий синтаксис методу глобального контексту ПодключітьВнешнююКомпоненту ():
Об'ектДрайвера = Новий ( "AddIn.АТОЛСканер.Scaner45");
Як бачимо, ВК драйвера підключається з макета "ДрайверАТОЛСканерШтріхкода" довідника "ПодключаемоеОборудованіе".
Що ж при цьому відбувається?
1С зберігає компоненту в тимчасовій папці користувача, наприклад "C: \ Documents and Settings \ User \ Local Settings \ Temp \ тисячу тридцять два \ v8_4_12.tmp"
і намагається зареєструвати її в гілці реєстру HKEY_CLASSES_ROOT саме цим шляхом.
На терміналі у звичайних користувачів немає прав на зміну цієї гілки реєстру, тому компонента у них не підключається.
Тепер про те, як вийти з цієї ситуації.
Метод глобального контексту ПодключітьВнешнююКомпоненту () має кілька варіантів синтаксису. Ось цим ми і скористаємося.
1. Реєструємо зовнішню компоненту утилітою regsvr32.exe на сервері терміналів в папці C: \ WINDOWS \ SYSTEM32 для 32-розрядної ОС або в папці C: \ WINDOWS \ SYSWOW64 для 64-розрядної ОС.
2. Використовуємо один з двох додаткових варіантів синтаксису методу ПодключітьВнешнююКомпоненту ():
ПодключітьВнешнююКомпоненту ( "C: \ WINDOWS \ SysWOW64 \ Scaner1C.dll", "АТОЛСканер", ТіпВнешнейКомпоненти.COM);
Об'ектДрайвера = Новий ( "AddIn.АТОЛСканер.Scaner45");
Об'ектДрайвера = Новий (ProgID);
На мій погляд, варіант № 2 краще.
При цьому 1С не намагається перереєструвати ВК по новому шляху в реєстрі і таким чином, всі проблеми вирішуються.
Ну ось власне і все. Успіхів у роботі!