Как настроить запрет редактирования реквизита справочника без снятия конфигурации 1С с поддержки?

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

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

Рассмотрим подробно все основные способы решения этой задачи, их преимущества, технические особенности и возможные ограничения.

Способ 1. Запрет изменения через расширение конфигурации (событие ПередЗаписью)

Разберем базовый и самый надежный вариант защиты с помощью механизмов расширения платформы «1С:Предприятие 8.3». Кажется заманчивым просто сделать поле недоступным на форме в событии ПриСозданииНаСервере или ПриОткрытии. Однако такая защита является исключительно визуальной: пользователь сможет обойти её с помощью групповой обработки «Изменение выделенных элементов», внешних обработок или загрузок данных.

Для гарантированной защиты на уровне бизнес-логики проанализируем модуль объекта справочника. Добавим обработчик события ПередЗаписью в расширение с аннотацией &Вместо или &Перед. В этом событии сравним текущее значение реквизита объекта со значением, которое уже сохранено в базе данных.

Посмотрим на пример реализации проверки прав пользователя при записи объекта:


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

КонецПроцедуры

Такой подход гарантирует защиту данных при любом способе изменения реквизита — через форму элемента, формы списков или сторонние обработки.

Способ 2. Использование штатной подсистемы БСП «Запрет редактирования реквизитов объектов»

В конфигурации 1С:ERP и других типовых решениях на базе Библиотеки Стандартных Подсистем (БСП) присутствует встроенный механизм блокировки ключевых полей. Он выводит на форму стандартную кнопку «Разрешить редактирование реквизитов» и блокирует нужные поля от случайных правок.

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

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

Рассмотрим пример кода для модуля объекта справочника:


&После("ПолучитьБлокируемыеРеквизитыОбъекта")
Процедура Расш1_ПолучитьБлокируемыеРеквизитыОбъекта(ЗаблокированныеРеквизиты)
    ЗаблокированныеРеквизиты.Добавить("Ответственный");
КонецПроцедуры

Этот способ идеален с точки зрения единообразия интерфейса, так как полностью повторяет стандартное поведение типовой конфигурации 1С:ERP.

Способ 3. Ограничение прав на уровне ролей и RLS

Платформа «1С:Предприятие» позволяет ограничивать права на уровне отдельных реквизитов объекта метаданных. Мы можем снять права Изменение и Редактирование для конкретного поля справочника.

Выясним важную особенность платформы: права нескольких ролей одного пользователя объединяются по логическому принципу ИЛИ. Если пользователю назначена хотя бы одна типовая роль, дающая право на изменение данного реквизита, ограничение в новой роли не сработает.

Чтобы корректно настроить права через расширение, выполним следующие действия:

  1. Заимствуем в расширение именно ту типовую роль, которая предоставляет права на изменение справочника.
  2. В заимствованной роли снимаем флаг Редактирование напротив нужного реквизита.
  3. При необходимости настраиваем механизмы RLS (Record Level Security) для ограничения доступа на уровне отдельных записей и полей.

Использование RLS обеспечит полную защиту данных на уровне СУБД, однако следует учитывать возможную дополнительную нагрузку на систему при выполнении сложных запросов.

Способ 4. Настройка формы в режиме «1С:Предприятие» и версионирование

Если требуется быстро ограничить случайный ввод без программирования, проанализируем пользовательские настройки формы:

  1. Заходим под администратором в форму элемента справочника в режиме «1С:Предприятие».
  2. Открываем меню Еще — Изменить форму.
  3. Снимаем флаг доступности у нужного реквизита.
  4. Сохраняем настройку и применяем её для нужных пользователей через команду Установить эти настройки другим пользователям.

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

← На главную