При проектировании рабочих мест для операторов в крупных конфигурациях (например, 1С:ERP Управление предприятием 2 или 1С:Комплексная автоматизация) часто возникает задача максимально ограничить доступ к конфиденциальным данным. Одной из неочевидных лазеек для пользователей является стандартный поиск платформы. Если пользователь находится в списке заказов, выделяет ячейку с контрагентом и нажимает Ctrl+F, открывается окно поиска, из которого через контекстное меню или кнопку открытия можно беспрепятственно "провалиться" в саму карточку клиента. Даже если непосредственное редактирование справочника запрещено, простой просмотр карточки (с адресами, телефонами и условиями работы) часто должен быть жестко ограничен.
В этой статье мы подробно разберем, как решить эту проблему на платформе 1С:Предприятие 8.3 (Управляемые формы). Мы рассмотрим как быстрые интерфейсные "костыли" (блокировка клавиш), так и фундаментально правильные подходы к обеспечению безопасности данных.
Самый быстрый способ нейтрализовать вызов окна поиска по сочетанию клавиш — переопределить это сочетание на уровне элементов управляемой формы. Давайте разберем, как это сделать без написания сложного кода.
Выполним следующие шаги:
Ctrl+F.В чем заключается хитрость? Когда мы явно назначаем сочетание клавиш конкретному элементу (в данном случае — таблице), платформа переопределяет стандартное глобальное поведение. Теперь при нажатии Ctrl+F платформа не будет открывать стандартное окно поиска по текущей колонке, а просто выполнит фокусировку (активизацию) на самой таблице. Поскольку фокус уже находится на ней, визуально для пользователя ничего не произойдет.
Если нам требуется заблокировать сочетание клавиш глобально для всей формы (а не только внутри одной таблицы), мы можем использовать механизм пустых команд. Проанализируем этот алгоритм:
КомандаЗаглушкаПоиска.Ctrl+F.В результате при нажатии горячих клавиш в любой области формы будет срабатывать наша пустая команда, перехватывая управление у платформенного механизма поиска.
Блокировка клавиатуры не защитит систему, если пользователь решит воспользоваться стандартным меню формы. Чтобы полностью исключить интерактивную возможность запуска поиска, настроим элементы отображения динамического списка:
ПоложениеСтрокиПоиска (SearchStringPosition) и ПоложениеУправленияПоиском (SearchControlPosition) в значение Нет.Найти (Find), Расширенный поиск (Extended search) и Отменить поиск (Cancel search).После этого кнопки поиска исчезнут как с панели инструментов, так и из контекстного меню (вызываемого правой кнопкой мыши) и стандартного подменю "Еще".
Если наша главная цель — сделать так, чтобы пользователь видел наименование клиента в списке заказов, но физически не мог открыть его карточку (двойным кликом или кнопкой открытия), настроим свойства поля ввода в соответствующей колонке таблицы:
СписокКонтрагент).Ложь (убирает кнопку с троеточием);Ложь;Ложь (скрывает значок лупы для открытия ссылки);Ложь;Ложь.Ложь. Это позволит пользователю выделять ячейку и копировать текст, но заблокирует любые попытки "провалиться" внутрь объекта.Давайте согласимся с коллегами по форуму: блокировка клавиш — это полумера. Продвинутый пользователь всегда сможет обойти интерфейсные ограничения с помощью горячих клавиш F4, Ctrl+Shift+F4 или контекстного меню. Самым надежным и архитектурно правильным решением является контроль открытия форм на стороне сервера.
Для реализации этого механизма используем предопределенное событие ОбработкаПолученияФормы в модуле менеджера справочника (например, Справочник.Контрагенты или Справочник.Партнеры). Этот метод гарантирует перехват запроса на открытие формы из любой точки системы.
Рассмотрим пример программного кода, который следует разместить в модуле менеджера целевого справочника:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)
// Проверяем, что запрашивается именно карточка (форма объекта)
Если ВидФормы = "ФормаОбъекта" Тогда
// Проверяем роль текущего пользователя
Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("РазрешитьПросмотрДетальнойИнформацииКлиентов") Тогда
// Отменяем стандартное построение формы
СтандартнаяОбработка = Ложь;
// Перенаправляем пользователя на облегченную форму-заглушку
ВыбраннаяФорма = "Справочник.Партнеры.Форма.ФормаОграниченияДоступа";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При таком подходе, даже если пользователь нажмет Ctrl+F, F4 или попытается открыть карточку программно из другой формы, платформа перенаправит его на созданную нами форму-заглушку (где будет написано "Доступ к просмотру данных ограничен") либо просто выдаст ошибку доступа.
Если создание специальной формы-заглушки кажется вам избыточным, можно прописать жесткий отказ непосредственно в модуле формы самого справочника. Разберем этот пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем права текущего пользователя при создании формы на сервере
Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("РазрешитьПросмотрДетальнойИнформацииКлиентов") Тогда
// Вызываем исключение или устанавливаем флаг Отказ
Отказ = Истина;
ВызватьИсключение "У вас недостаточно прав для просмотра карточки данного контрагента!";
КонецЕсли;
КонецПроцедуры
Еще один профессиональный подход, упоминаемый в обсуждении — это тонкая настройка ролей в конфигураторе. Вместо использования тяжеловесного и ресурсоемкого механизма RLS (ограничение доступа на уровне записей), который может замедлить работу ERP-системы, мы можем использовать разграничение прав на уровне полей (свойств реквизитов):
Ссылка и Наименование.При такой настройке пользователь сможет видеть контрагента в списках документов, но при попытке открыть саму карточку платформа автоматически скроет от него все конфиденциальные поля, оставив доступным только название.
Поскольку мы работаем с конфигурацией 1С:ERP 2, крайне важно сохранить ее на поддержке для облегчения последующих обновлений. Настоятельно рекомендуем внедрять все описанные выше программные доработки через Расширения конфигурации.
Для этого выполним следующие действия:
Справочник.Партнеры).ОбработкаПолученияФормы или заимствуем модуль формы объекта для прописания логики отказа в ПриСозданииНаСервере.Этот способ позволит вам гибко управлять правами и интерфейсом пользователей без внесения изменений в основную конфигурацию поставщика.