Разработчики внешних отчетов и обработок в среде «1С:Предприятие 8.3» часто сталкиваются со строгой системой безопасности платформы. Типичная ситуация: вам необходимо разработать отчет, собирающий данные из других информационных баз посредством COM-соединения. Однако при попытке инициализировать объект COMConnector под пользователем с активной опцией «Защита от опасных действий» платформа блокирует выполнение кода. Вместо успешного подключения выводится окно предупреждения безопасности, кнопки которого (включая закрытие окна) просто аварийно завершают текущий сеанс пользователя.
В этой статье мы подробно разберем природу этого поведения платформы, выясним причины блокировки и рассмотрим несколько надежных, легитимных способов обхода этой проблемы без отключения защиты от опасных действий у пользователей и без перехода на Web-сервисы.
Начиная с версии платформы 8.3.9, в «1С:Предприятие» встроен механизм защиты от выполнения потенциально опасных действий. К таким действиям платформа относит запуск внешних программ, загрузку внешних компонент, а также создание COM-объектов (в частности, V83.COMConnector), поскольку они могут выполнять произвольный код в операционной системе в обход ограничений безопасности 1С.
Когда вы открываете внешний отчет интерактивно через меню Файл — Открыть, платформа автоматически запускает его в изолированном (безопасном) режиме. Любая попытка выполнить код:
ТекCOMОбъект = Новый COMОбъект("V83.COMConnector");
приводит к мгновенному срабатыванию системы защиты. Если у пользователя в конфигураторе включен флаг «Защита от опасных действий», платформа выводит предупреждение. Невозможность нажать кнопку «Разрешить» или некорректное закрытие сеанса при интерактивном открытии файла часто связаны с тем, что код выполняется на этапе инициализации формы или модуля объекта, когда платформа еще не построила полностью интерфейс для корректной обработки модального диалога разрешения.
Рассмотрим два основных практических сценария обхода этой проблемы с помощью Библиотеки Стандартных Подсистем (БСП) и настроек безопасного режима.
Это самый правильный и безопасный с точки зрения архитектуры способ. Мы не отключаем защиту у пользователя, но явно декларируем в коде обработки, какие именно системные ресурсы (в данном случае COM-классы) нам требуются для работы. Платформа и БСП проверят эти разрешения при регистрации обработки в информационной базе.
Для реализации этого способа необходимо переписать функцию СведенияОВнешнейОбработке() в модуле объекта внешнего отчета. Мы должны явно запросить разрешение на использование COM-классов семейства COMConnector.
Разберем пример кода, который решает эту задачу:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.1.1");
ПараметрыРегистрации.Наименование = НСтр("ru = 'Консолидированный отчет по сотрудникам (COM)'");
ПараметрыРегистрации.Информация = НСтр("ru = 'Собирает данные из внешних баз через COM-соединение'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет;
ПараметрыРегистрации.Версия = "1.2.0";
// Оставляем безопасный режим включенным!
ПараметрыРегистрации.БезопасныйРежим = Истина;
ТаблицаКоманд = ПараметрыРегистрации.Команды;
ДобавитьКоманду(ТаблицаКоманд,
ПараметрыРегистрации.Наименование,
"КонсолидированныйОтчетПоСотрудникамCOM",
"ОткрытиеФормы");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
// Создаем разрешения на использование конкретных COM-классов
Разрешения = Новый Массив;
РазрешениеV83 = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("V83.COMConnector", Неопределено);
Разрешения.Добавить(РазрешениеV83);
РазрешениеV82 = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("V82.COMConnector", Неопределено);
Разрешения.Добавить(РазрешениеV82);
// Передаем сформированные разрешения в параметры регистрации
ПараметрыРегистрации.Разрешения = Разрешения;
Возврат ПараметрыРегистрации;
КонецФункции
Как это работает: При регистрации этого отчета в справочнике «Дополнительные отчеты и обработки» администратору системы будет выведено окно с запросом на предоставление разрешений. После того как администратор один раз одобрит доступ к V83.COMConnector, отчет будет без проблем запускаться у рядовых пользователей, не вызывая аварийных диалогов защиты.
Если по какой-то причине вы не хотите детально настраивать разрешения для каждого COM-объекта, или ваша конфигурация не поддерживает актуальные механизмы БСП по управлению разрешениями в безопасном режиме, существует более простой обходной путь.
Вы можете зарегистрировать внешний отчет в справочнике дополнительных отчетов и обработок, принудительно отключив для него безопасный режим на уровне самой регистрации. Для этого в функции СведенияОВнешнейОбработке установите свойство БезопасныйРежим в значение Ложь:
ПараметрыРегистрации.БезопасныйРежим = Ложь;
При интерактивном подключении и первом запуске такого отчета из интерфейса программы (из справочника дополнительных обработок) пользователю будет выведен стандартный и корректно работающий диалог предупреждения. В этом диалоге пользователь сможет один раз нажать кнопку «Разрешить», после чего платформа запомнит выбор и позволит коду беспрепятственно использовать COMConnector.
В процессе обсуждения проблемы разработчики часто пытаются применить методы, которые оказываются неэффективными:
ЗащитаОтОпасныхДействий у текущего пользователя. Попытки записать свойство ПредупреждатьОбОпасныхДействиях = Ложь программно в модуле сеанса или при открытии формы не приносят результата. Платформа блокирует изменение настроек безопасности «на лету» из кода внешних обработок.УстановитьПривилегированныйРежим(Истина). Привилегированный режим отключает проверку прав доступа (RLS), но он никак не влияет на ограничения безопасного режима платформы в отношении внешних исполняемых файлов и COM-объектов. Вызов кода в привилегированном режиме внутри внешнего отчета все равно вызовет блокировку.Чтобы диалоги предупреждений и COM-соединения отрабатывали стабильно, убедитесь, что выполнены следующие условия:
comcntr.dll зарегистрирована в операционной системе под той разрядностью, под которой запущен рабочий процесс сервера 1С (для серверной базы) или клиентское приложение (для файловой базы). Регистрация выполняется через утилиту Windows regsvr32.USR1CV8), есть права на доступ к веткам реестра, связанным с COM-компонентами 1С.Применяя механизмы декларации разрешений БСП или регистрируя обработку во внутреннем справочнике системы с отключением безопасного режима, вы сможете обойти жесткие ограничения «Защиты от опасных действий», сохранив при этом общую безопасность информационной системы предприятия.