Автоматическое разрешение редактирования ключевых реквизитов для выбранных пользователей — расширение из одного модуля
Проблема
В ERP / BAS ERP / КА 2 / УТ 11 есть механизм защиты «ключевых» реквизитов справочников и документов от случайного изменения. Реализован он через подсистему БСП «Запрет редактирования реквизитов объектов». Работает просто: при открытии формы реквизиты заблокированы, и чтобы их отредактировать, нужно каждый раз нажимать Ещё → Разрешить редактирование реквизитов.
Для рядового пользователя это правильная защита. Но для внедренца, администратора или ответственного за НСИ, которому по роду работы нужно регулярно менять эти настройки в десятках справочников, — это превращается в бесконечное и бессмысленное ритуальное нажатие одной и той же кнопки.
Хочется один раз настроить — и забыть.
Почему это нельзя решить стандартными средствами
Механизм блокировки не имеет никакой настройки «разрешить всегда для этого пользователя». Состояние «разрешено / заблокировано» живёт только внутри текущего сеанса открытой формы и сбрасывается при каждом новом открытии. Роль РедактированиеРеквизитовОбъектов даёт лишь право видеть кнопку разблокировки — но не убирает необходимость её нажимать.
Как работает механизм внутри (коротко)
Чтобы понять решение, нужно знать одну ключевую точку в цепочке вызовов.
При открытии любой формы с заблокированными реквизитами вызывается:
ПриСозданииНаСервере (модуль формы)
^92;^72; ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты()
^92;^72; ЗапретРедактированияРеквизитовОбъектовСлужебный.ПодготовитьФорму()
^92;^72; ЗапретРедактированияРеквизитовОбъектовПереопределяемый
.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты)
Последняя процедура — это переопределяемый модуль БСП. Она заполняет соответствие Объекты, в котором перечислены все справочники и документы, подключённые к подсистеме блокировки. Именно по этому соответствию система решает: применять блокировку к текущей форме или нет.
Если соответствие окажется пустым — блокировка не сработает ни для одной формы.
Решение
Перехватить ЗаблокироватьРеквизиты через расширение и для нужного пользователя просто не вызывать стандартный код блокировки.
Всё расширение состоит из одного заимствованного общего модуля — ЗапретРедактированияРеквизитовОбъектов. Ни одна форма не заимствуется. Ни один справочник не трогается. Конфигурация остаётся на поддержке.
Код расширения — полностью
&Вместо("ЗаблокироватьРеквизиты")
Процедура РасшЗаблокироватьРеквизиты(Форма, ГруппаДляКнопкиЗапрета, ЗаголовокКнопкиЗапрета, Объект)
Если Пользователи.ТекущийПользователь().Наименование = "ВашПользователь" Тогда
Возврат;
КонецЕсли;
ПродолжитьВызов(Форма, ГруппаДляКнопкиЗапрета, ЗаголовокКнопкиЗапрета, Объект);
КонецПроцедуры
Это весь код. Семь строк.
Почему именно ЗаблокироватьРеквизиты, а не переопределяемый модуль
Интуитивно кажется правильным перехватывать ПриОпределенииОбъектовСЗаблокированнымиРеквизитами — ту самую процедуру, которая заполняет карту объектов. Но есть нюанс: многие типовые формы подготавливают реквизит ПараметрыЗапретаРедактированияРеквизитов статически, прямо в метаданных формы. В этом случае ПодготовитьФорму пропускается — и вызов переопределяемого модуля не происходит вовсе.
ЗаблокироватьРеквизиты же вызывается всегда и из любой формы — это единственная по-настоящему универсальная точка входа.
Почему &Вместо, а не &После
Аннотация &После работает только в модулях форм. Для общих модулей в расширениях используется исключительно &Вместо с явным вызовом ПродолжитьВызов. Это важный нюанс, который легко пропустить.
Установка и настройка
- Создать расширение, заимствовать модуль
ЗапретРедактированияРеквизитовОбъектов - Добавить процедуру с кодом выше
- В строке проверки указать наименование нужного пользователя точно так, как оно записано в справочнике Пользователи базы (Все функции → Справочники → Пользователи)
- Подключить расширение
Для нескольких пользователей условие расширяется тривиально:
ИмяПользователя = Пользователи.ТекущийПользователь().Наименование;
Если ИмяПользователя = "Иванов"
ИЛИ ИмяПользователя = "Петрова"
ИЛИ ИмяПользователя = "Сидоров" Тогда
Возврат;
КонецЕсли;
Что получает пользователь
До установки расширения — при каждом открытии элемента справочника реквизиты заблокированы, кнопка требует подтверждения.
После — форма открывается сразу в режиме редактирования. Никаких дополнительных действий не требуется. Для всех остальных пользователей поведение абсолютно стандартное, ничего не меняется.
Совместимость
Расширение работает на любой конфигурации на базе БСП, где реализована подсистема «Запрет редактирования реквизитов объектов»:
- 1С:ERP Управление предприятием 2.x
- BAS ERP
- 1С:Комплексная автоматизация 2.x
- 1С:Управление торговлей 11.x
- и другие конфигурации на БСП аналогичных версий
Итог
Иногда самое элегантное решение — это минимальное вмешательство в одном правильном месте. Одна точка входа, один модуль, семь строк кода — и многократное ежедневное нажатие одной кнопки уходит в прошлое.
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.17.74
Вступайте в нашу телеграмм-группу Инфостарт