Начиная с версии платформы 1С:Предприятие 8.3.9, разработчики и администраторы столкнулись с новым механизмом безопасности — «Защита от опасных действий». При попытке запустить внешнюю обработку, расширение или выполнить потенциально опасную операцию (например, загрузить внешний файл, выполнить команду операционной системы или подключить COM-соединение), платформа выводит интерактивное предупреждение с вопросом о подтверждении действия. Если в интерактивном режиме пользователь может нажать кнопку подтверждения, то при выполнении регламентных заданий в фоновом режиме или автоматическом запуске обработок по расписанию это предупреждение намертво блокирует работу системы.
В этой статье мы подробно разберем, как правильно настроить платформу 1С для отключения этих предупреждений, исправим частые ошибки при работе с файлом конфигурации conf.cfg, научимся отключать защиту для конкретных баз по маске и разберемся, как победить повторное предупреждение при использовании COM-соединений.
Прежде чем переходить к настройкам, проанализируем суть механизма. Защита от опасных действий срабатывает в тот момент, когда платформа определяет запуск кода, способного нанести вред операционной системе или данным. К таким действиям платформа относит:
V83.COMConnector для связи с другими базами 1С или объектов автоматизации MS Office).ЗапуститьПриложение.Проверка необходимости вывода предупреждения выполняется платформой в строго определенном порядке:
DisableUnsafeActionProtection файла конфигурации conf.cfg, то защита отключается на глобальном уровне для всей базы.ЗащитаОтОпасныхДействий при программном подключении внешней обработки или отчета.ЗащитаОтОпасныхДействий перед вызовом метода записи этого объекта.Чаще всего администраторы пытаются отключить защиту глобально, прописав специальный параметр в конфигурационном файле conf.cfg. Однако здесь кроется самая распространенная ошибка синтаксиса, из-за которой настройки просто игнорируются или платформа начинает выдавать системные ошибки.
Рассмотрим ситуацию: администратор прописывает в файле следующую строку:
DisableUnsafeActionProtection=*.*;
При таком написании предупреждения продолжают появляться, а в технологическом журнале может регистрироваться ошибка с кодом 10301 (U_REGEX_RULE_SYNTAX). Выясним причину этой ошибки. Дело в том, что платформа 1С использует стандарт регулярных выражений POSIX BRE (Basic Regular Expressions) для обработки строки параметра DisableUnsafeActionProtection.
В синтаксисе POSIX BRE символ звездочки * означает «ноль или более повторений предыдущего символа». Если поставить звездочку в самом начале регулярного выражения (как в маске файла *.*), движок регулярных выражений выдаст ошибку синтаксиса, поскольку перед первой звездочкой нет символа, к которому она должна применяться.
Для правильного глобального отключения защиты для всех баз без исключения необходимо использовать корректное регулярное выражение, где точка . означает любой символ, а звездочка * — любое количество повторений этого символа. Запишем правильный вариант:
DisableUnsafeActionProtection=.*;
Обратите внимание на точку с запятой в конце строки. Она используется исключительно в качестве разделителя, если вы указываете несколько шаблонов подряд. Если шаблон один, то символ ; в самом конце строки указывать не обязательно, а в некоторых релизах платформы это также может вызвать ошибку разбора конфигурационного файла.
Полное отключение защиты для всех информационных баз на сервере снижает общий уровень безопасности системы. Правильным подходом является выборочное отключение защиты только для тех баз, где это действительно необходимо (например, для баз интеграции). Рассмотрим, как правильно составить маску для регулярного выражения.
Строка соединения для файловой базы выглядит следующим образом:
File="D:\1C_Bases\Accounting";
Строка соединения для серверной базы имеет другой формат:
Srvr="ServerName";Ref="tpk_liga";
Поскольку платформа сопоставляет регулярное выражение со всей строкой соединения целиком, нам необходимо использовать символы .* в начале и в конце выражения, чтобы проигнорировать имя сервера и другие параметры подключения.
Настроим маску для серверной базы с именем tpk_liga. Для этого в файле conf.cfg мы можем прописать один из следующих рабочих вариантов:
DisableUnsafeActionProtection=.*tpk_liga.*
Этот вариант отключит проверку для любой базы, в имени которой содержится строка "tpk_liga".
DisableUnsafeActionProtection=.*Ref="tpk_liga".*
Этот вариант более безопасен, так как он точно указывает платформе искать конкретную базу на сервере приложений 1С. Кавычки внутри регулярного выражения экранировать не нужно.
DisableUnsafeActionProtection=.*tpk_liga.*;.*test_base.*
Даже после успешного прописывания параметров в conf.cfg многие разработчики сталкиваются с тем, что при попытке программного создания COM-объекта (например, V83.COMConnector) платформа продолжает выдавать предупреждение: «Разрешить подключать исполнимые бинарные файлы для данного модуля?».
Разберем природу этого явления. Платформа 1С разделяет защиту на два независимых контура:
DisableUnsafeActionProtection и флажок пользователя в конфигураторе.Чтобы полностью победить эту проблему и обеспечить стабильный запуск COM-соединений в автоматическом режиме (например, в регламентных заданиях), необходимо выполнить комплекс действий.
Во-первых, определим правильное расположение файла conf.cfg.
Параметр DisableUnsafeActionProtection применяется на том компьютере, который непосредственно выполняет код 1С:
C:\Program Files\1cv8\conf\conf.cfg (для 64-разрядной платформы)C:\Program Files (x86)\1cv8\conf\conf.cfg (для 32-разрядной платформы)conf.cfg необходимо править на самом сервере 1С:Предприятия по пути установки серверной платформы. После редактирования файла на сервере обязательно перезапустите службу сервера «1С:Предприятие», иначе новые настройки безопасности не вступят в силу.Во-вторых, настроим учетную запись для регламентных заданий в базе данных.
По умолчанию фоновые задания выполняются в контексте системных механизмов. Для надежной работы автоматического обмена через COM создадим специального служебного пользователя и настроим его свойства:
Робот_Обмена) или откроем существующего.Теперь настроим выполнение нашего регламентного задания именно под этим пользователем. Сделать это можно интерактивно через консоль регламентных заданий в режиме «1С:Предприятие», указав имя созданного пользователя в параметрах регламентного задания.
Если в вашей системе используется большое количество пользователей, или вы хотите автоматизировать процесс отключения предупреждений для сервисных учетных записей при развертывании новых баз, можно применить программный метод отключения защиты.
Напишем фрагмент кода на встроенном языке 1С, который находит нужного служебного пользователя информационной базы и программно отключает у него признак предупреждения об опасных действиях:
// Определим имя нашего служебного пользователя
ИмяПользователяРегламентов = "Робот_Обмена";
// Найдем пользователя в списке пользователей информационной базы
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователяРегламентов);
Если ПользовательИБ <> Неопределено Тогда
// Обратимся к свойству защиты от опасных действий
ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
// Запишем изменения в базу данных
ПользовательИБ.Записать();
ЗаписьЖурналаРегистрации("Безопасность", СистемнаяИнформацияПошлины.УровеньЖурналаРегистрации.Информация,,,
"Защита от опасных действий успешно отключена для пользователя: " + ИмяПользователяРегламентов);
КонецЕсли;
Этот код можно поместить в обработчик обновления конфигурации или выполнить один раз через внешнюю обработку в привилегированном режиме. Для массового снятия этого флажка со всех учетных записей без модификации кода подойдёт обработка для отключения защиты от опасных действий у пользователей информационной базы.
Если вы разрабатываете собственную систему запуска внешних обработок и не хотите заставлять администраторов править файл conf.cfg, вы можете программно отключить защиту непосредственно в момент подключения обработки с помощью параметра ЗащитаОтОпасныхДействий менеджера внешних обработок.
Посмотрим на пример кода, который безопасно подключает внешний файл обработки без вывода предупреждений пользователю:
// Укажем путь к файлу внешней обработки на диске
ПутьКФайлу = "C:\Exchange\UploadData.epf";
// Создадим описание защиты от опасных действий с признаком отключения предупреждений
ПараметрыЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ПараметрыЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
Попытка
// Подключаем внешнюю обработку, передавая параметры защиты третьим аргументом
ИмяВнешнейОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , ПараметрыЗащиты);
// Создаем объект обработки и выполняем ее экспортный метод
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяВнешнейОбработки);
ОбъектОбработки.ВыполнитьВыгрузкуДанных();
Исключение
ЗаписьЖурналаРегистрации("ОшибкаПодключения", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось подключить обработку: " + ОписаниеОшибки());
КонецПопытки;
Важным фактором, влияющим на работу COM-соединений во внешних обработках, является интеграция с Библиотекой стандартных подсистем (БСП). Если вы регистрируете внешнюю обработку через стандартный справочник «Дополнительные отчеты и обработки», платформа по умолчанию может запускать ее в так называемом безопасном режиме.
В безопасном режиме выполнение любых потенциально опасных операций (включая работу с COM-объектами) заблокировано на уровне ядра платформы 1С. В этом случае никакие настройки файла conf.cfg вам не помогут — система будет выдавать ошибку: «Установлен безопасный режим. Выполнение операции запрещено».
Для исправления этой ситуации выполним следующие шаги:
Таким образом, комбинируя правильный синтаксис файла conf.cfg, программное отключение защиты у служебных пользователей и корректную настройку безопасного режима в дополнительных обработках БСП, мы можем полностью автоматизировать запуск любых внешних модулей и COM-соединений без ущерба для стабильности системы.