При адаптации типовых решений 1С, таких как 1С:ERP Управление предприятием, регулярно возникает задача ограничить пользователям возможность изменения отдельных ключевых реквизитов (например, Ответственный, Организация или Статус). При этом ключевым требованием является сохранение конфигурации на полной поддержке поставщика для упрощения процесса последующих обновлений.
Рассмотрим подробно все основные способы решения этой задачи, их преимущества, технические особенности и возможные ограничения.
Разберем базовый и самый надежный вариант защиты с помощью механизмов расширения платформы «1С:Предприятие 8.3». Кажется заманчивым просто сделать поле недоступным на форме в событии ПриСозданииНаСервере или ПриОткрытии. Однако такая защита является исключительно визуальной: пользователь сможет обойти её с помощью групповой обработки «Изменение выделенных элементов», внешних обработок или загрузок данных.
Для гарантированной защиты на уровне бизнес-логики проанализируем модуль объекта справочника. Добавим обработчик события ПередЗаписью в расширение с аннотацией &Вместо или &Перед. В этом событии сравним текущее значение реквизита объекта со значением, которое уже сохранено в базе данных.
Посмотрим на пример реализации проверки прав пользователя при записи объекта:
&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
// Проверяем, является ли объект новым
Если ЭтоНовый() Тогда
Возврат;
КонецЕсли;
// Проверяем наличие специальной роли у пользователя
Если РольДоступна("ПолныеПрава") Или РольДоступна("Расш1_ПравоИзмененияОтветственного") Тогда
Возврат;
КонецЕсли;
// Сравниваем новое значение реквизита со значением в базе данных
СтароеЗначение = Ссылка.Ответственный;
НовоеЗначение = ЭтотОбъект.Ответственный;
Если СтароеЗначение <> НовоеЗначение Тогда
Отказ = Истина;
ВызватьИсключение "У вас недостаточно прав для изменения реквизита ""Ответственный""!";
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует защиту данных при любом способе изменения реквизита — через форму элемента, формы списков или сторонние обработки.
В конфигурации 1С:ERP и других типовых решениях на базе Библиотеки Стандартных Подсистем (БСП) присутствует встроенный механизм блокировки ключевых полей. Он выводит на форму стандартную кнопку «Разрешить редактирование реквизитов» и блокирует нужные поля от случайных правок.
Разберем по шагам подключение реквизита к этой подсистеме через расширение конфигурации без снятия с поддержки:
ПолучитьБлокируемыеРеквизитыОбъекта и добавляем имя нужного реквизита.ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты() в событии ПриСозданииНаСервере.Рассмотрим пример кода для модуля объекта справочника:
&После("ПолучитьБлокируемыеРеквизитыОбъекта")
Процедура Расш1_ПолучитьБлокируемыеРеквизитыОбъекта(ЗаблокированныеРеквизиты)
ЗаблокированныеРеквизиты.Добавить("Ответственный");
КонецПроцедуры
Этот способ идеален с точки зрения единообразия интерфейса, так как полностью повторяет стандартное поведение типовой конфигурации 1С:ERP.
Платформа «1С:Предприятие» позволяет ограничивать права на уровне отдельных реквизитов объекта метаданных. Мы можем снять права Изменение и Редактирование для конкретного поля справочника.
Выясним важную особенность платформы: права нескольких ролей одного пользователя объединяются по логическому принципу ИЛИ. Если пользователю назначена хотя бы одна типовая роль, дающая право на изменение данного реквизита, ограничение в новой роли не сработает.
Чтобы корректно настроить права через расширение, выполним следующие действия:
Редактирование напротив нужного реквизита.Использование RLS обеспечит полную защиту данных на уровне СУБД, однако следует учитывать возможную дополнительную нагрузку на систему при выполнении сложных запросов.
Если требуется быстро ограничить случайный ввод без программирования, проанализируем пользовательские настройки формы:
Еще — Изменить форму.Установить эти настройки другим пользователям.Важное ограничение: данный метод является исключительно декоративным. Пользователи с доступом к групповым обработкам или настройкам формы смогут обходить это ограничение. В качестве дополнительной меры контроля рекомендуется включить подсистему Версионирование объектов в разделе администрирования, чтобы фиксировать историю всех изменений и оперативно выявлять несанкционированное редактирование данных.