
Многие программисты 1С пренебрегают безопасным режимом в своих дополнительных отчетах и обработках ставят «небезопасный режим». Да, так проще, не надо разбираться с ошибками при подключении, но такие обработки не могут исполняться в некоторых режимах, и вообще, не хорошо.
Почему не хорошо?
- Ну, например, могут запретить правильные (секьюрные, тру) Администраторы 1С.
- Могут не пустить в облако, типа 1cfresh. Это опять таки п1. И вот список требований. https://1cfresh.com/articles/so_addprocess_req
- Ну это просто не true )).
В данной статье я собрал (и буду дополнять, при случае) список подключаемых разрешений, которые позволяют подключать внешние обработки и отчеты в безопасном режиме. ПараметрыРегистрации.Разрешения.Добавить(…)
Немного документации
https://its.1c.ru/db/bsp244doc#content:1444:hdoc
Там, собственно, главное. Но примеров нет.
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты
- РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы
Итак, еще немного — и к делу
Напомню, что в модуле внешней обработки/отчета должна располагаться экспортная функция СведенияОВнешнейОбработке, которая должна возвращать структуру с параметрами регистрации.
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации =
ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.2.45"); ПараметрыРегистрации.Вид =
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма(); ПараметрыРегистрации.БезопасныйРежим = Истина; ПараметрыРегистрации.Наименование = Метаданные().Синоним; //мне кажется оптимально брать наименование прямо из //синонима обработки - код получается универсальным ПараметрыРегистрации.Версия = Метаданные().Комментарий; //я в комментарий обычно ставлю дату, она же версия ПараметрыРегистрации.Назначение.Добавить(
"Документ.ПриобретениеТоваровУслуг"); НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = Метаданные().Синоним; //оптимально брать наименование прямо из синонима, //но может быть произвольным НоваяКоманда.Идентификатор = Метаданные().Имя; НоваяКоманда.Использование =
ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Истина; Возврат ПараметрыРегистрации; КонецФункции
Если вы используете что-то «небезопасное», а именно что-то из перечня (как очень хорошо коллега расписал) следует передать в структуру в параметр «Разрешения» соответствующий XDTO объект используя следующую конструкцию
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
А «Разрешение» получается несколькими функциями модуля БСП
РаботаВБезопасномРежиме. Рассмотрим частные случаи:
Регистрация внешних компонент
Печать штрихкодов
Самая популярная компонента, используется для всех внешних печатных форм.
has-small-font-size
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты(
"ОбщийМакет.КомпонентаПечатиШтрихкодов", "Вывод в печатную форму штрихкода EAN13 AddOn 5"); ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Склонения ФИО
Тоже может пригодиться, используется для договоров и проч., где нужны склонения
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты(
"ОбщийМакет.КомпонентаСклоненияФИО", "CNameDeclSymbolicName")); ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Создание COM-классов
Если в коде используется COM-объект, то его нужно зарегистрировать, используя функцию РазрешениеНаСозданиеCOMКласса модуля БСП РаботаВБезопасномРежиме. Приведу ее текст здесь, чтобы понять небольшую загвоздку
Текст функции модуля РаботаВБезопасномРежиме
// Возвращает внутреннее описание разрешения на использование COM-класса. // // Параметры: // ProgID - Строка - ProgID класса COM, с которым он зарегистрирован в системе. // Например, "Excel.Application", // CLSID - Строка - CLSID класса COM, с которым он зарегистрирован в системе. // ИмяКомпьютера - Строка - имя компьютера, на котором надо создать указанный объект. // Если параметр опущен - объект будет создан на компьютере, на котором выполняется // текущий рабочий процесс, // Описание - Строка - описание причины, по которой требуется предоставление разрешения. // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. // Предназначен только для передачи в качестве параметра в функции. // РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), // РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и // РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаСозданиеCOMКласса(Знач ProgID,
Знач CLSID, Знач ИмяКомпьютера = "", Знач Описание = "") Экспорт Пакет = РаботаВБезопасномРежимеСлужебный.Пакет(); Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(Пакет, "CreateComObject")); Результат.Description = Описание; Результат.ProgId = ProgID; Результат.CLSID = Строка(CLSID); Результат.ComputerName = ИмяКомпьютера; Возврат Результат; КонецФункции
В принципе, из описания ясно, что нужна строка 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 запросом.
ПараметрыРегистрации.БезопасныйРежим = Истина; Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
"HTTP", "sync.-----.ru", Неопределено, Описание); ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Разрешение на использование каталога временных файлов
В принципе, тоже все ясно и необходимость использования возникает нередко, например, для открытия файла.
Например, при использовании: ВремФайл = ПолучитьИмяВременногоФайла(Расширение) или УдалитьФайлы(ВремФайл)
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(
Истина, Истина, "Чтение и запись файла Excel во временном каталоге"); ПараметрыРегистрации.Разрешения.Добавить(Разрешение); //РазрешениеНаИспользованиеКаталогаВременныхФайлов(Знач ЧтениеДанных = Ложь,
Знач ЗаписьДанных = Ложь, Знач Описание = "")
Разрешение на использование привилегированного режима
Как выяснилось, весьма актуальная штука. Например, для формирования печатных форм для пользователя без административных прав.
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима(
"Для печати под неполными правами требуется.."); ПараметрыРегистрации.Разрешения.Добавить(Разрешение);