Как поставить запрет на изменение предопределенного значения пользователя?
В 1С:Предприятие можно использовать предопределённые элементы справочников, перечислений и других объектов, которые создаются в конфигураторе и автоматически присутствуют в базе после создания. В некоторых случаях требуется запретить пользователю изменять такие элементы (например, менять наименование, удалять или переписывать реквизиты). Рассмотрим, как реализовать запрет изменения предопределённого значения пользователя максимально подробно.
1. Что такое предопределённое значение
Предопределённое значение — это элемент справочника, перечисления или другого объекта, созданный в конфигураторе и имеющий постоянный уникальный идентификатор. Обычно используется для хранения системных или начальных значений, которые не должны изменяться пользователем.
2. Основные способы запрета изменений
Способ 1: Ограничение прав доступа через роли
- Если элемент доступен только для чтения, а изменения запрещены на уровне ролей, пользователь не сможет его модифицировать.
Пример:
-
В конфигураторе откройте роль пользователя.
-
В разделе "Права на данные" установите:
-
Чтение — разрешено.
-
Изменение, удаление — запрещено для конкретного справочника.
-
Но это ограничение действует для всего справочника. Если нужно запретить только изменение предопределённого элемента, используйте программную проверку.
Способ 2: Запрет изменения программно в модуле объекта
В модуле объекта справочника можно программно проверить, предопределённый ли элемент, и запретить его изменение.
Пример:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если ЭтоПредопределенный() Тогда
Сообщить("Изменение предопределённого элемента запрещено.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
-
Метод ЭтоПредопределенный() возвращает Истина, если текущий объект — предопределённый.
-
Если пользователь попытается изменить элемент вручную или через код — сработает отказ от записи.
Способ 3: Запрет удаления предопределённого элемента
Чтобы запретить удаление:
В модуле объекта:
Процедура ПриУдалении(Отказ)
Если ЭтоПредопределенный() Тогда
Сообщить("Удаление предопределённого элемента запрещено.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
3. Запрет на изменение отдельных реквизитов
Если требуется разрешить изменение каких-то реквизитов, но запретить другие (например, нельзя менять наименование, но можно — комментарий), используйте следующий подход:
В модуле объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если ЭтоПредопределенный() Тогда
Если Наименование <> НаименованиеПриЗаписи Тогда
Сообщить("Изменение наименования предопределённого элемента запрещено.");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
НаименованиеПриЗаписи — заранее сохранённое значение, которое можно запомнить в ОбработкаНачалаРедактирования() или ОбработкаОткрытия.
4. Работа с формами — отключение редактирования на уровне формы
На управляемой форме можно сделать проверку и отключить поля редактирования, если выбран предопределённый элемент:
В модуле формы:
Процедура ПриИзмененииЭлемента()
Если Элемент.ЭтоПредопределенный() Тогда
ЭлементыФормы.Наименование.Доступность = Ложь;
ЭлементыФормы.Комментарий.Доступность = Истина;
Иначе
ЭлементыФормы.Наименование.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
5. Возможность контроля при вводе через внешний код
Важно помнить, что даже если форма и модуль объекта запрещают изменение, внешний код может обойти ограничения, если они не реализованы должным образом.
Чтобы полностью предотвратить изменения, используйте модуль менеджера или событие ПередЗаписью, которое вызывается при любом способе записи элемента (через формы, внешние обработки, загрузки и т.д.).
6. Особенности с типами данных
-
Предопределённые элементы доступны даже в режиме "Без пользователей".
-
Их значение фиксировано в конфигурации, поэтому важно не допустить синхронизацию с другой базой, где GUID элемента отличается.
7. Дополнительные рекомендации
-
Названия предопределённых элементов лучше делать такими, чтобы они явно сигнализировали о своей системной роли.
-
Можно создать расширение, которое запретит любые изменения определённых элементов, если вы работаете с типовой конфигурацией и не хотите её менять напрямую.
-
Для отладки удобно выводить GUID элемента — чтобы точно понять, является ли он предопределённым.
Таким образом, защита предопределённых элементов реализуется комбинацией программных проверок, управления правами, логикой форм и отказов от записи. Такой подход обеспечивает целостность данных и защиту от нежелательных изменений.