Как запретить редактирование отдельных реквизитов справочника в 1С?

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

В процессе разработки на платформе 1С часто возникает задача ограничить возможность изменения конкретных полей (реквизитов) в справочниках или документах. Это может быть продиктовано требованиями безопасности, защитой от случайного изменения ключевых данных (например, артикула товара или ИНН контрагента) или логикой бизнес-процесса. Рассмотрим подробно все доступные механизмы решения этой задачи — от простых скриптов в форме до системных настроек прав доступа.

Способ 1. Визуальный запрет редактирования в форме

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

Для реализации этого метода нам понадобится обработчик события ПриСозданииНаСервере. Мы обращаемся к коллекции Элементы и устанавливаем свойство ТолькоПросмотр для нужного реквизита.


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

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

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

Способ 2. Контроль изменения в модуле объекта

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

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


// В модуле объекта
Процедура ПередЗаписью(Отказ)

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

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

Такой подход является "последним заслоном". Программисты часто называют это "защитой от дурака" или "защитой данных на уровне СУБД". Выясним причину, почему это важно: интерфейс может быть изменен в расширении или через групповое изменение реквизитов, но код модуля объекта сработает в любом случае.

Способ 3. Условное оформление формы (динамический запрет)

Иногда запрет должен зависеть от условий в самой строке данных или от состояния документа. Вместо того чтобы писать сложный код в ПриЧтенииНаСервере или ПриИзменении, мы можем использовать механизм Условного оформления. Рассмотрим, как настроить его программно.


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

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

Способ 4. Механизм БСП "Запрет редактирования реквизитов"

Если вы работаете в современной типовой конфигурации (например, 1С:ERP, УТ 11 или БП 3.0), в них уже встроена Библиотека стандартных подсистем (БСП). Рассмотрим профессиональный подход через подсистему "Запрет редактирования реквизитов объектов".

Посмотрите на преимущества этого способа:

  1. Пользователь видит кнопку "Разрешить редактирование" (если у него есть права).
  2. Поля заблокированы по умолчанию, что предотвращает случайную порчу данных.
  3. Система сама управляет доступностью связанных полей.

Для реализации в модуле менеджера справочника необходимо описать процедуру ПриОпределенииНастроекЗапретаРедактированияРеквизитов. Пример кода:


Процедура ПриОпределенииНастроекЗапретаРедактированияРеквизитов(Настройки) Экспорт
    
    // Указываем реквизиты, которые нельзя менять после записи
    Настройки.ВозвращаемыеРеквизиты.Добавить("ИНН");
    Настройки.ВозвращаемыеРеквизиты.Добавить("КодПоОКПО");
    
КонецПроцедуры

Способ 5. Настройка прав доступа на уровне полей (RLS)

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

Разберем по шагам, как это сделать:

  1. Откройте нужную Роль в Конфигураторе.
  2. Найдите в списке объектов ваш справочник.
  3. В правой части окна вы увидите список всех реквизитов.
  4. Снимите галочку Редактирование (или "Изменение") для конкретных полей.

Важно: Если у пользователя несколько ролей, и хотя бы в одной из них разрешено редактирование этого поля, он сможет его менять. Механизм прав в 1С работает по принципу "Разрешено все, что разрешено хотя бы одной ролью". Поэтому права нужно настраивать аккуратно во всех используемых ролях.

Резюме и рекомендации

Мы рассмотрели различные подходы к блокировке данных. Выбор конкретного метода зависит от вашей цели:

Совмещая эти методы, вы создадите надежную и понятную для пользователя систему контроля данных в 1С:Предприятие.

← На главную