В практике разработки на платформе 1С:Предприятие 8 часто возникают задачи повышенной безопасности, когда стандартного разграничения прав доступа через роли оказывается недостаточно. Рассмотрим ситуацию, когда необходимо запретить использование любых внешних обработок и отчетов для определенной категории пользователей, основываясь на данных из произвольного регистра сведений. Разберем, почему штатное меню Файл -> Открыть может стать лазейкой для обхода бизнес-логики и как это пресечь программными и административными методами.
Стандартный механизм защиты в 1С строится на ролях. Существует специальное право Интерактивное открытие внешних обработок и Интерактивное открытие внешних отчетов. Если у пользователя в его наборе ролей эти права отсутствуют, он не сможет открыть файл .epf или .erf через стандартное меню. Для контроля текущих настроек системы разработчики часто используют специальные средства, позволяющие выполнить быструю проверку прав доступа на объекты метаданных. Однако, как мы видим из ситуации, иногда логика прав должна быть динамической: если пользователь есть в специальном регистре — доступ разрешен, если нет — запрещен.
Проблема заключается в том, что роли нельзя изменять «на лету» без перезапуска сеанса пользователя. Более того, опытный пользователь может использовать «Консоль запросов» (которая сама является внешней обработкой), чтобы прочитать конфиденциальные данные в обход экранных форм. Чтобы предотвратить такие ситуации, важно провести детальный анализ прав и ролей и подобрать подходящий профиль для каждой категории сотрудников. Проанализируем способы, которые помогут нам закрыть эти бреши.
Для клиент-серверного варианта работы платформы наиболее эффективным средством являются профили безопасности. Этот механизм работает на уровне кластера серверов 1С и позволяет жестко ограничить возможности программного кода, даже если у пользователя есть полные права внутри базы. Данный подход отлично вписывается в современную концепцию защищенной IT-инфраструктуры, где безопасность обеспечивается на всех уровнях — от СУБД до прикладного решения.
Рассмотрим алгоритм настройки:
Предоставлять полный доступ к внешним отчетам и обработкам.Этот метод хорош тем, что его невозможно обойти программно изнутри сеанса 1С. Однако он требует административного доступа к серверу.
Если нам нужно применить ограничения динамически, мы можем использовать метод УстановитьБезопасныйРежим(). Разберем, как это работает. При активации безопасного режима платформа блокирует выполнение потенциально опасных операций: работу с файловой системой, COM-объектами, запуск внешних компонент и, что важно, ограничивает доступ к данным на уровне платформы. Подобная логика часто применяется, когда в системе реализована работа с временными правами пользователей, требующая оперативного изменения полномочий в рамках одного сеанса.
Проанализируем пример кода в модуле сеанса или модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Проверяем наличие текущего пользователя в нашем специальном регистре
НужноОграничитьДоступ = ПроверитьНаличиеВРегистреДоступа(ПараметрыСеанса.ТекущийПользователь);
Если НужноОграничитьДоступ Тогда
// Устанавливаем безопасный режим для текущего сеанса
УстановитьБезопасныйРежим(Истина);
Сообщить("Система запущена в режиме ограниченной функциональности.");
КонецЕсли;
КонецПроцедуры
Важный нюанс: установка безопасного режима не закрывает само окно выбора файла, но она делает практически невозможным выполнение вредоносного кода внутри внешней обработки, если та попытается обратиться к серверным ресурсам или файлам.
Чтобы пользователь даже не видел возможности открыть файл, мы можем программно управлять видимостью команд главного меню. Выясним, как это реализовать через механизм функциональных опций.
ДоступныВнешниеОбработки (тип Булево).При запуске системы мы вычисляем значение параметра сеанса:
// В модуле сеанса
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.ДоступКОбработкам ГДЕ Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Результат = Запрос.Выполнить();
ПараметрыСеанса.ДоступныВнешниеОбработки = Не Результат.Пустой();
КонецПроцедуры
Если значение будет Ложь, платформа автоматически скроет связанные элементы интерфейса. Это наиболее «дружелюбный» для пользователя способ, так как он убирает лишние кнопки.
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), в ней уже есть готовые инструменты. В БСП существует подсистема «Работа с внешними обработками». Рассмотрим, как использовать ее возможности:
В настройках программы можно включить «Проверку подписей внешних обработок» или полностью запретить их интерактивное открытие. В этом случае легитимные обработки должны быть добавлены в справочник ДополнительныеОтчетыИОбработки. Для управления этим списком администраторам будет полезен инструмент для групповой выгрузки и загрузки дополнительных отчетов и обработок. Поскольку запуск из справочника контролируется кодом конфигурации, вы можете легко встроить туда проверку по вашему регистру сведений в процедуре ПередОткрытием. Кроме того, перед публикацией внешних файлов рекомендуется проводить автоматизированный анализ отчетов и обработок на наличие ошибок, чтобы гарантировать стабильность системы.
Иногда требуется контролировать появление окон внешних обработок, если другие методы недоступны. Это менее элегантный, но рабочий метод. Мы можем периодически проверять список открытых окон.
Разберем пример реализации в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Запускаем проверку каждые 5 секунд
ПодключитьОбработчикОжидания("КонтрольВнешнихОкон", 5);
КонецПроцедуры
Процедура КонтрольВнешнихОкон() Экспорт
// Получаем список всех открытых окон
Окна = ПолучитьОкна();
Для Каждого Окно Из Окна Цикл
// Проверяем, является ли форма внешней обработкой
// Имя формы внешней обработки обычно начинается с "ВнешняяОбработка."
Если Найти(Окно.Содержимое.ИмяФормы, "ExternalDataProcessor") > 0 Тогда
Окно.Закрыть();
Сообщить("Открытие внешних файлов запрещено администратором!");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод позволяет «выбивать» окна внешних обработок сразу после их появления, если они не прошли проверку безопасности.
Проанализировав все варианты, можно сделать вывод: единой «волшебной кнопки» не существует, защита должна быть комплексной. Для максимальной безопасности мы рекомендуем сочетать:
Помните, что любая защита внутри 1С может быть преодолена, если у злоумышленника есть прямой доступ к базе данных (SQL) или права администратора системы. Поэтому программные запреты — это прежде всего защита от случайных ошибок и инструмент соблюдения внутреннего регламента компании.