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

Многие программисты 1С пренебрегают безопасным режимом в своих дополнительных отчетах и обработках ставят «небезопасный режим». Да, так проще, не надо разбираться с ошибками при подключении, но такие обработки не могут исполняться в некоторых режимах, и вообще, не хорошо.

Почему не хорошо?

  1. Ну, например, могут запретить правильные (секьюрные, тру) Администраторы 1С.
  2. Могут не пустить в облако, типа 1cfresh. Это опять таки п1. И вот список требований. https://1cfresh.com/articles/so_addprocess_req
  3. Ну это просто не true )).

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

Немного документации

https://its.1c.ru/db/bsp244doc#content:1444:hdoc

Там, собственно, главное. Но примеров нет.

Итак, еще немного — и к делу

Напомню, что в модуле внешней обработки/отчета должна располагаться экспортная функция СведенияОВнешнейОбработке, которая должна возвращать структуру с параметрами регистрации.

Функция СведенияОВнешнейОбработке() Экспорт
	 
	ПараметрыРегистрации =
ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("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 во временном каталоге"); ПараметрыРегистрации.Разрешения.Добавить(Разрешение); //РазрешениеНаИспользованиеКаталогаВременныхФайлов(Знач ЧтениеДанных = Ложь,
Знач ЗаписьДанных = Ложь, Знач Описание = "")

Разрешение на использование привилегированного режима

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

Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима(
"Для печати под неполными правами требуется.."); ПараметрыРегистрации.Разрешения.Добавить(Разрешение);

Вам также может понравиться

About the Author: Павел Пчелинцев