Как заблокировать поиск по Ctrl+F на форме в 1С и предотвратить открытие карточки клиента

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При проектировании рабочих мест для операторов в крупных конфигурациях (например, 1С:ERP Управление предприятием 2 или 1С:Комплексная автоматизация) часто возникает задача максимально ограничить доступ к конфиденциальным данным. Одной из неочевидных лазеек для пользователей является стандартный поиск платформы. Если пользователь находится в списке заказов, выделяет ячейку с контрагентом и нажимает Ctrl+F, открывается окно поиска, из которого через контекстное меню или кнопку открытия можно беспрепятственно "провалиться" в саму карточку клиента. Даже если непосредственное редактирование справочника запрещено, простой просмотр карточки (с адресами, телефонами и условиями работы) часто должен быть жестко ограничен.

В этой статье мы подробно разберем, как решить эту проблему на платформе 1С:Предприятие 8.3 (Управляемые формы). Мы рассмотрим как быстрые интерфейсные "костыли" (блокировка клавиш), так и фундаментально правильные подходы к обеспечению безопасности данных.

Метод 1. Перехват горячих клавиш Ctrl+F через свойства таблицы

Самый быстрый способ нейтрализовать вызов окна поиска по сочетанию клавиш — переопределить это сочетание на уровне элементов управляемой формы. Давайте разберем, как это сделать без написания сложного кода.

Выполним следующие шаги:

  1. Откроем нужную управляемую форму в конфигураторе.
  2. В дереве элементов формы найдем таблицу (например, таблицу динамического списка заказов покупателей).
  3. Перейдем в палитру свойств этого элемента управления.
  4. Найдем свойство СочетаниеКлавиш (Shortcut).
  5. Принудительно назначим туда комбинацию Ctrl+F.

В чем заключается хитрость? Когда мы явно назначаем сочетание клавиш конкретному элементу (в данном случае — таблице), платформа переопределяет стандартное глобальное поведение. Теперь при нажатии Ctrl+F платформа не будет открывать стандартное окно поиска по текущей колонке, а просто выполнит фокусировку (активизацию) на самой таблице. Поскольку фокус уже находится на ней, визуально для пользователя ничего не произойдет.

Метод 2. Использование команды-заглушки

Если нам требуется заблокировать сочетание клавиш глобально для всей формы (а не только внутри одной таблицы), мы можем использовать механизм пустых команд. Проанализируем этот алгоритм:

  1. На вкладке Команды управляемой формы создадим новую команду и назовем ее, например, КомандаЗаглушкаПоиска.
  2. В свойствах этой команды найдем параметр СочетаниеКлавиш и укажем значение Ctrl+F.
  3. Обработчик команды при этом заполнять не нужно (оставляем его пустым либо не создаем вовсе).

В результате при нажатии горячих клавиш в любой области формы будет срабатывать наша пустая команда, перехватывая управление у платформенного механизма поиска.

Метод 3. Скрытие поисковых элементов управления в списке

Блокировка клавиатуры не защитит систему, если пользователь решит воспользоваться стандартным меню формы. Чтобы полностью исключить интерактивную возможность запуска поиска, настроим элементы отображения динамического списка:

  1. В свойствах таблицы формы установим параметры ПоложениеСтрокиПоиска (SearchStringPosition) и ПоложениеУправленияПоиском (SearchControlPosition) в значение Нет.
  2. Перейдем в свойства командной панели таблицы (или командной панели формы) и откроем окно настроек Состав команд.
  3. Снимем флажки напротив стандартных команд платформы: Найти (Find), Расширенный поиск (Extended search) и Отменить поиск (Cancel search).

После этого кнопки поиска исчезнут как с панели инструментов, так и из контекстного меню (вызываемого правой кнопкой мыши) и стандартного подменю "Еще".

Метод 4. Настройка свойств ячейки (колонки) для предотвращения открытия

Если наша главная цель — сделать так, чтобы пользователь видел наименование клиента в списке заказов, но физически не мог открыть его карточку (двойным кликом или кнопкой открытия), настроим свойства поля ввода в соответствующей колонке таблицы:

  1. Выберем поле формы, отображающее ссылку на клиента (например, СписокКонтрагент).
  2. В палитре свойств установим следующие параметры:
    • КнопкаВыбора = Ложь (убирает кнопку с троеточием);
    • КнопкаВыпадающегоСписка = Ложь;
    • КнопкаОткрыть = Ложь (скрывает значок лупы для открытия ссылки);
    • БыстрыйВыбор = Ложь;
    • РедактированиеТекста = Ложь.
  3. Свойство ТолькоПросмотр при этом оставляем в значении Ложь. Это позволит пользователю выделять ячейку и копировать текст, но заблокирует любые попытки "провалиться" внутрь объекта.

Метод 5. Безопасное и надежное решение через событие "ОбработкаПолученияФормы"

Давайте согласимся с коллегами по форуму: блокировка клавиш — это полумера. Продвинутый пользователь всегда сможет обойти интерфейсные ограничения с помощью горячих клавиш F4, Ctrl+Shift+F4 или контекстного меню. Самым надежным и архитектурно правильным решением является контроль открытия форм на стороне сервера.

Для реализации этого механизма используем предопределенное событие ОбработкаПолученияФормы в модуле менеджера справочника (например, Справочник.Контрагенты или Справочник.Партнеры). Этот метод гарантирует перехват запроса на открытие формы из любой точки системы.

Рассмотрим пример программного кода, который следует разместить в модуле менеджера целевого справочника:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)
    
    // Проверяем, что запрашивается именно карточка (форма объекта)
    Если ВидФормы = "ФормаОбъекта" Тогда
        
        // Проверяем роль текущего пользователя
        Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("РазрешитьПросмотрДетальнойИнформацииКлиентов") Тогда
            
            // Отменяем стандартное построение формы
            СтандартнаяОбработка = Ложь;
            
            // Перенаправляем пользователя на облегченную форму-заглушку
            ВыбраннаяФорма = "Справочник.Партнеры.Форма.ФормаОграниченияДоступа";
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

При таком подходе, даже если пользователь нажмет Ctrl+F, F4 или попытается открыть карточку программно из другой формы, платформа перенаправит его на созданную нами форму-заглушку (где будет написано "Доступ к просмотру данных ограничен") либо просто выдаст ошибку доступа.

Метод 6. Программный отказ в событии "ПриСозданииНаСервере"

Если создание специальной формы-заглушки кажется вам избыточным, можно прописать жесткий отказ непосредственно в модуле формы самого справочника. Разберем этот пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем права текущего пользователя при создании формы на сервере
    Если Не РольДоступна("ПолныеПрава") И Не РольДоступна("РазрешитьПросмотрДетальнойИнформацииКлиентов") Тогда
        
        // Вызываем исключение или устанавливаем флаг Отказ
        Отказ = Истина;
        ВызватьИсключение "У вас недостаточно прав для просмотра карточки данного контрагента!";
        
    КонецЕсли;
    
КонецПроцедуры

Метод 7. Ограничение прав на реквизиты (Поля) справочника

Еще один профессиональный подход, упоминаемый в обсуждении — это тонкая настройка ролей в конфигураторе. Вместо использования тяжеловесного и ресурсоемкого механизма RLS (ограничение доступа на уровне записей), который может замедлить работу ERP-системы, мы можем использовать разграничение прав на уровне полей (свойств реквизитов):

  1. Создадим или отредактируем роль для целевых пользователей.
  2. Для справочника клиентов снимем права на просмотр всех реквизитов (таких как ИНН, телефоны, адреса, договора), оставив права доступа только на реквизиты Ссылка и Наименование.

При такой настройке пользователь сможет видеть контрагента в списках документов, но при попытке открыть саму карточку платформа автоматически скроет от него все конфиденциальные поля, оставив доступным только название.

Разработка расширения для типовой ERP 2 без снятия с поддержки

Поскольку мы работаем с конфигурацией 1С:ERP 2, крайне важно сохранить ее на поддержке для облегчения последующих обновлений. Настоятельно рекомендуем внедрять все описанные выше программные доработки через Расширения конфигурации.

Для этого выполним следующие действия:

  1. Создадим новое расширение в базе данных.
  2. Заимствуем в расширение нужный справочник (например, Справочник.Партнеры).
  3. Добавим в расширении обработчик события ОбработкаПолученияФормы или заимствуем модуль формы объекта для прописания логики отказа в ПриСозданииНаСервере.

Этот способ позволит вам гибко управлять правами и интерфейсом пользователей без внесения изменений в основную конфигурацию поставщика.

← На главную