Как запретить редактирование отдельных реквизитов документа для разных пользователей в 1С?

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

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

Ограничения механизма RLS

Проанализируем сначала возможность использования механизма RLS (ограничение доступа на уровне записей). Довольно распространенное заблуждение — попытка ограничить изменение конкретных колонок или реквизитов через стандартные шаблоны прав.

В платформе 1С ограничение доступа на уровне полей работает исключительно на операцию Чтение. Право на Изменение (запись) выдается только на объект или запись целиком. Таким образом, средствами одного только RLS запретить интерактивное или программное редактирование конкретного реквизита при сохранении прав на изменение остальных полей документа невозможно.

Двухуровневая схема защиты данных

Для надежного разграничения доступа применяется связка из двух контуров: визуального интерфейсного ограничения на управляемой форме и обязательного серверного контроля при записи объекта.

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

  1. Интерфейсный уровень (модуль формы): динамическое отключение доступности или установка режима «Только просмотр» для полей и групп формы.
  2. Серверный контроль (модуль объекта): проверка неизменности защищенных реквизитов в событии ПередЗаписью при установленном флаге блокировки.

Управление доступностью на управляемой форме

Рассмотрим по шагам реализацию интерфейсной части. На управляемой форме целесообразно объединять реквизиты каждого специалиста в отдельные группы (панели). Это позволяет переключать доступность не для каждого поля по отдельности, а для всей группы сразу.

В модуле формы создадим процедуру управления элементами, которую вызовем в обработчиках ПриСозданииНаСервере, ПриЧтенииСозданииНаСервере, а также в событии ПриИзменении соответствующего флага:


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

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

Использование свойства ТолькоПросмотр = Истина предпочтительнее, чем Доступность = Ложь, поскольку поля остаются визуально читаемыми и контрастными, но их редактирование блокируется.

Контроль целостности данных в модуле объекта

Посмотрим на реализацию серверной защиты. В событии ПередЗаписью модуля объекта необходимо сравнить текущие значения реквизитов в памяти (ЭтотОбъект) со значениями, которые уже записаны в базе данных (Ссылка).


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

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

Альтернативные архитектурные решения

Рассмотрим подробнее типовые подходы к разделению зон ответственности, применяемые в конфигурациях на базе Библиотеки стандартных подсистем (БСП) и типовых решениях (например, 1С:ЗУП при согласовании кадровых и расчетных данных документа):

  1. Подсистема БСП «Запрет редактирования реквизитов объектов»: позволяет централизованно блокировать ключевые поля формы документа после его утверждения или проведения. Для снятия блокировки выводится специальная кнопка, требующая отдельной роли.
  2. Использование статусов и бизнес-процессов: документ переводится по стадиям (маршруту согласования), и доступность блоков формы регулируется в зависимости от текущего статуса документа и назначенных пользователю ролей.
  3. Вынесение отметок в регистр сведений: если служебные флаги проверки не влияют на проведение самого документа, их хранение можно организовать в независимом подчиненном регистре сведений. Это исключает конфликтные блокировки таблицы документа при одновременной работе разных пользователей.
← На главную