Выполнение обработок 1С в безопасном режиме

Многие программисты 1С пренебрегают безопасным режимом в своих дополнительных отчетах и обработках ставят «небезопасный режим». Да, так проще, не надо разбираться с ошибками при подключении, но такие обработки не могут исполняться в некоторых режимах, и вообще, не хорошо.
Почему не хорошо?
- Ну, например, могут запретить правильные (секьюрные, тру) Администраторы 1С.
- Могут не пустить в облако, типа 1cfresh. Это опять таки п1. И вот список требований. https://1cfresh.com/articles/so_addprocess_req
- Ну это просто не true )).
В данной статье я собрал (и буду дополнять, при случае) список подключаемых разрешений, которые позволяют подключать внешние обработки и отчеты в безопасном режиме. ПараметрыРегистрации.Разрешения.Добавить(…)
Немного документации
Там, собственно, главное. Но примеров нет.
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты
- РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы
Итак, еще немного — и к делу
Напомню, что в модуле внешней обработки/отчета должна располагаться экспортная функция СведенияОВнешнейОбработке, которая должна возвращать структуру с параметрами регистрации.
Если вы используете что-то «небезопасное», а именно что-то из перечня (как очень хорошо коллега расписал) следует передать в структуру в параметр «Разрешения» соответствующий XDTO объект используя следующую конструкцию
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
А «Разрешение» получается несколькими функциями модуля БСП
РаботаВБезопасномРежиме. Рассмотрим частные случаи:
Регистрация внешних компонент
Печать штрихкодов
Самая популярная компонента, используется для всех внешних печатных форм.
Склонения ФИО
Тоже может пригодиться, используется для договоров и проч., где нужны склонения
Создание COM-классов
Если в коде используется COM-объект, то его нужно зарегистрировать, используя функцию РазрешениеНаСозданиеCOMКласса модуля БСП РаботаВБезопасномРежиме. Приведу ее текст здесь, чтобы понять небольшую загвоздку
Текст функции модуля РаботаВБезопасномРежиме
В принципе, из описания ясно, что нужна строка CLSID класса COM, с которым он зарегистрирован в системе. Для этого, можно залезть через regedit на сервер, но он, насколько я понимаю, везде одинаков и приведен здесь для разных приложений.
Запуск 1С 8.3
Для запуска 1С 8.3 на 64-разрядной Windows:
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«V83.ComConnector», «<181E893D-73A4-4722-B61D-D604B3D67D47>», «ИмяСервера»)
Запуск Excel
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«Excel.Application», «<00000514-0000-0010-8000-00AA006D2EA4>», «ИмяСервера»)
ADODB
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«ADODB.Connection», «<00000514-0000-0010-8000-00AA006D2EA4>», «ИмяСервера»)
Прочие COM-серверы
Если у Вас сервер или приложение 32-х разрядное или другой COM-сервер, запускайте regedit и ищите свой CLSID как на скриншоте, дел на пару минут.
Разрешение на использование интернет-ресурсов
Тут все более-менее ясно. Использовал на практике.
Например, моя внешняя обработка по расписанию забирает данные с некого сайта http запросом.
Разрешение на использование каталога временных файлов
В принципе, тоже все ясно и необходимость использования возникает нередко, например, для открытия файла.
Например, при использовании: ВремФайл = ПолучитьИмяВременногоФайла(Расширение) или УдалитьФайлы(ВремФайл)
Разрешение на использование привилегированного режима
Как выяснилось, весьма актуальная штука. Например, для формирования печатных форм для пользователя без административных прав.
Как узнать progid класса com
Здравствуйте. Подскажите.
Как узнать ProgID COM объекта, если у меня есть .Lib и .H(Описание интерфейсов и др)? Можно ли как обойтись без ProgID создавая объект на стороне клиента?
От: | angry.andrew | |
Дата: | 09.08.12 12:05 | |
Оценка: | 3 (1) +1 |
ProgID как раз штука вторичная при создании COM-объекта, т.к. основным идентификатором класса служит CLSID, который передается, например, в CoCreateInstance. CLSID класса объявлен в .h-файле, генерируемом из .idl.
ProgID — это такой строковый идентификатор класса, придуманный в основном ради всяких скриптовых языков, в которых неудобно иметь дело с GUID-ами. ProgID прописывается в реестре COM-сервером при регистрации. Для зарегистрированного COM-сервера можно использовать функции ProgIDFromCLSID и CLSIDFromProgID для взаимной конвертации ProgID и CLSID.
Здравствуйте, TARGRED, Вы писали:
TAR>Здравствуйте. Подскажите.
TAR>Как узнать ProgID COM объекта, если у меня есть .Lib и .H(Описание интерфейсов и др)? Можно ли как обойтись без ProgID создавая объект на стороне клиента?
TAR>Спасибо.
Как узнать идентификатор COM prog?
Я хотел бы получить доступ к библиотеке COM через позднюю привязку.
Как я могу узнать его progID?
1 ответов
progID обычно будет иметь библиотеку форм.Класс, вы можете просмотреть, какие классы предоставляет библиотека COM с помощью oleview.
функция, которую вы хотите в oleview, — это View TypeLib (три маленьких красных треугольника). Имя библиотеки будет вверху, и вы захотите использовать имя класса, как показано в разделе CoClasses
Как получить библиотеку типов из ProgID или CLSID (без загрузки COM-объекта)?
Как программно получить путь или LIBID библиотеки типов, учитывая ProgID или CLSID класса COM, содержащиеся в этой библиотеке типов, без создания экземпляра объекта COM?
Для некоторых COM-объектов вы можете сделать это через путь в реестре.
Но некоторые COM-объекты не имеют TypeLib ключ, такой как Word.Application :
Как определить путь к библиотеке типов или LIBID для этих объектов COM, не создавая экземпляр объекта COM?
Решение
Библиотека типов может быть или не быть связана с данным CLSID , Если у вас нет ссылки на библиотеку типов в реестре, возможно, вам повезет получить ее во время выполнения, используя IDispatch::GetTypeInfo ,
Класс COM без библиотеки типов (или зарегистрированной библиотеки типов) по-прежнему является допустимым классом COM, поэтому в конечном итоге он может работать и использоваться без библиотеки типов вообще.
Еще один шанс, который у вас есть, — найти двоичный файл, на котором размещен COM-сервер, независимо от того, .EXE , .DLL , или же .OCX и попытаться загрузить библиотеку типов из ее ресурсов (обычно под идентификатором 1). Довольно часто библиотека типов находится тут же.
Другие решения
Как вы упомянули в своем вопросе, не все объекты COM имеют TypeLib Идентификатор в реестре или даже они не обязаны отправлять свою TypeLib в целевую систему, но для того, чтобы иметь возможность раскрыть информацию своего объекта, им нужна TypeLib. Так что, как правило, их информация TypeLib хранится в EXE или же DLL как ресурс. Ты можешь использовать LoadTypeLib функция для извлечения информации TypeLib как ITypeLib из указанного модуля, а затем написать свой IDL или даже извлечь ресурс, а затем сохранить его как .tlb ,