При переходе на современные операционные системы, такие как Windows Server 2019, системные администраторы и разработчики 1С часто сталкиваются с проблемой: старые ActiveX-компоненты (например, Ocvita Barcode) отказываются работать под учетными записями обычных пользователей. В то же время под правами администратора все печатается корректно. Давать права администратора каждому пользователю терминального сервера категорически неприемлемо из соображений безопасности. В данной статье мы подробно разберем, почему это происходит и как настроить систему так, чтобы компонента работала стабильно при ограниченных правах.
Разберем ситуацию: компонента Ocvita Barcode была разработана во времена Windows XP и Server 2003, когда механизмы безопасности были менее строгими. Основные причины отказа в работе на современных ОС под обычным пользователем следующие:
HKEY_LOCAL_MACHINE, но при работе может пытаться обращаться к разделам, закрытым для записи пользователям..ocx расположен в папке, куда у пользователя нет прав на чтение или выполнение, 1С не сможет инициализировать объект.C:\.Выясним причину, по которой обычная регистрация часто не помогает. Многие совершают ошибку, регистрируя компоненту из папки профиля администратора (например, с рабочего стола) или из папок с ограниченным доступом. Рассмотрим правильный алгоритм действий:
Во-первых, выберем общедоступную папку. Рекомендуется создать каталог C:\ProgramData\Ocvita\ или использовать системную директорию C:\Windows\SysWOW64\ (так как компонента 32-битная). Поместим туда файл BARCODE.OCX.
Во-вторых, выполним регистрацию через командную строку от имени администратора, используя правильный путь к regsvr32. Для 64-битных систем важно использовать версию утилиты из SysWOW64:
%systemroot%\SysWoW64\regsvr32.exe "C:\ProgramData\Ocvita\BARCODE.OCX"
Если ваша задача включает печать на мобильных принтерах по bluetooth, регистрация OCX может не потребоваться, так как там используются другие протоколы.
Важно: Перед этим убедимся, что у группы "Пользователи" есть права на "Чтение и выполнение" для этой папки и самого файла.
Проанализируем ситуацию с реестром. Компоненты ActiveX хранят информацию о своих программных идентификаторах (ProgID) и интерфейсах в ветке HKEY_CLASSES_ROOT. На самом деле эта ветка является виртуальным представлением, объединяющим HKEY_LOCAL_MACHINE\Software\Classes и HKEY_CURRENT_USER\Software\Classes.
Для стабильной работы выполним следующие действия:
regedit и найдем разделы, связанные с Ocvita (обычно поиск по слову "Ocvita" или "Barcode").HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{GUID_компоненты}.Рассмотрим важный технический нюанс. Компонента Ocvita Barcode является 32-битной (x86). Это означает, что она принципиально не будет работать в 64-битном клиенте 1С. Если на сервере установлен 64-битный клиент 1cv8.exe, попытка создать объект Новый COMОбъект("Ocvita.Barcode") (или аналогичный) выдаст ошибку инициализации, которую часто путают с нехваткой прав.
Убедимся, что пользователи запускают 32-битный клиент 1С. Путь к нему обычно выглядит так: C:\Program Files (x86)\1cv8\...\bin\1cv8.exe.
Если вышеуказанные шаги не помогли, разберем ситуацию с помощью инструмента Process Monitor (ProcMon). Это единственный надежный способ увидеть, на каком именно этапе система выдает ACCESS DENIED.
Посмотрим на алгоритм диагностики:
ProcMon под правами администратора на сервере.Process Name is 1cv8.exe и Result is ACCESS DENIED.C:\Windows\ или к ключу в HKLM, значит, нужно точечно расширить права именно на этот объект.Иногда современные серверные процессоры и ОС блокируют выполнение кода ActiveX из-за политики безопасности памяти. Проанализируем настройки DEP:
1cv8.exe).Несмотря на "историческую привычку" пользователей, стоит рассмотреть возможность перехода на штатную компоненту печати штрихкодов от 1С, которая входит в состав БСП (Библиотеки стандартных подсистем). Она работает как Native API, не требует регистрации в реестре через regsvr32 и корректно функционирует под любыми правами доступа в любых версиях Windows.
Пример программного создания штрихкода штатными средствами (если компонента уже подключена):
Попытка
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native);
ОбъектШК = Новый("AddIn.Barcode.Barcode");
Исключение
Сообщить("Не удалось загрузить компоненту печати ШК");
КонецПопытки;
Этот метод навсегда избавит системного администратора от необходимости бороться с правами доступа и "древними" технологиями ActiveX.