Запрет редактирования реквизита в 1С 8.3: от роли до кода в расширении
Содержание
Заблокировать поле в 1С 8.3 можно тремя способами: снять право «Редактирование» на реквизит в роли, выставить у элемента формы свойство ТолькоПросмотр (в Конфигураторе или кодом в расширении) или запретить изменение значения при записи объекта. Первый способ работает на уровне платформы, второй — только в конкретной форме, третий надёжнее всех, потому что срабатывает при любом способе изменения данных.
Для типовых конфигураций (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) правильный путь — расширение конфигурации : оно не снимает базу с поддержки и переживает обновления. Пользовательские настройки формы поле не блокируют, их любой сотрудник откатывает за пару кликов.
Какой способ блокировки поля выбрать
Начните с вопроса: от кого и от чего защищаем реквизит. От случайной правки в карточке хватит формы. От осознанного изменения через обработку, загрузку или групповое изменение нужна проверка в модуле объекта.
| Способ | Где настраивается | Что блокирует | Обходится ли |
|---|---|---|---|
| 🔐 Право на реквизит в роли | Конфигуратор, роль | Изменение реквизита во всех формах и в коде без привилегированного режима | Нет, если ни одна роль пользователя не даёт права |
📝 ТолькоПросмотр у элемента | Форма объекта | Ввод в этом поле этой формы | Да: другая форма, обработка, групповое изменение |
| 🎨 Условное оформление | Форма объекта | Поле или ячейку при выполнении условия | Да, как и предыдущий |
| 🧩 Расширение с кодом | Расширение конфигурации | Что напишете: форма, запись, проверка | Зависит от того, где стоит проверка |
🛡️ Проверка ПередЗаписью | Модуль объекта или расширение | Запись изменённого значения откуда угодно | Только через ОбменДанными.Загрузка |
| 🙈 Функциональная опция | Конфигуратор | Скрывает поле, а не блокирует | — |
Рабочая схема для типовой базы: расширение, в нём ТолькоПросмотр для удобства пользователя плюс проверка при записи для защиты данных. Одна форма без проверки — это не запрет, а подсказка.
Блокировка через роли и права на реквизиты
Платформа умеет раздавать права не только на объект целиком, но и на отдельные реквизиты справочника, документа и их табличных частей. Для реквизита есть два права: «Просмотр» и «Редактирование».
Как настроить:
- Откройте
Конфигуратор → Конфигурация → Открыть конфигурацию. - В дереве раскройте
Общие → Ролии откройте нужную роль. - Слева выберите объект, например справочник
Контрагенты, и раскройте его — появится список реквизитов и табличных частей. - Выделите реквизит и в правой части снимите флажок «Редактирование». Флажок «Просмотр» оставьте, иначе поле просто исчезнет.
- Сохраните и выполните
Конфигурация → Обновить конфигурацию базы данных(F7).
После этого поле, связанное с реквизитом, в формах станет недоступно для ввода само, без кода.
Главная ловушка — права в 1С складываются. Если у пользователя пять ролей и хотя бы одна даёт «Редактирование» на этот реквизит, поле останется открытым. Запретить право отдельной ролью нельзя: роли только добавляют разрешения.
Отсюда следствия:
- 🧑💼 Пользователь с ролью «Полные права» всегда редактирует всё, ограничения ролей на него не действуют.
- 🧩 Роль в расширении может только добавить права, а не отнять. Чтобы снять право в типовой роли, придётся менять саму конфигурацию.
- 📦 Изменение типовой роли требует включить возможность изменений на поддержке. При каждом обновлении роль придётся сравнивать и объединять заново.
- 🔍 Ограничение доступа на уровне записей (RLS) поля не блокирует: оно режет строки, а не реквизиты.
Правку типовых ролей делайте только на копии базы и с выгрузкой .cf до изменений. Неудачное объединение при следующем обновлении может снять с пользователей нужные права.
Настройка формы: «Только просмотр» и «Доступность»
Если нужно закрыть поле в одной карточке и база не на поддержке (или конфигурация своя), достаточно свойства элемента формы.
- В Конфигураторе откройте форму объекта, например
Справочники → Номенклатура → Формы → ФормаЭлемента. - На вкладке «Элементы» найдите поле. Удобно искать по имени через строку поиска над деревом.
- Откройте палитру свойств (Alt+Enter) и установите флажок
ТолькоПросмотр.
Чем отличаются два похожих свойства:
| Свойство | Как выглядит | Можно скопировать значение | Открывается ли ссылка |
|---|---|---|---|
ТолькоПросмотр | Поле обычное, ввод невозможен | Да | Да |
Доступность = Ложь | Поле серое | Нет | Нет |
Для блокировки почти всегда лучше ТолькоПросмотр: бухгалтер видит значение, может его выделить и открыть, например, карточку контрагента из поля ссылки.
Что пользователь может сделать сам: через Ещё → Изменить форму он скрывает и переставляет поля. Сделать поле нередактируемым в этом окне нельзя, а любые изменения сбрасываются кнопкой «Стандартные настройки». Поэтому пользовательская настройка интерфейса
— способ убрать лишнее с глаз, но не защита.
Блокировка поля через расширение конфигурации
Расширения появились в платформе 8.3.6. Это основной способ заблокировать поле в типовой 1С без снятия с поддержки.
Шаг 1. Создайте расширение и заимствуйте форму
Конфигуратор → Конфигурация → Расширения конфигурации → Добавить.- Откройте конфигурацию расширения, затем в основной конфигурации найдите нужную форму.
- Правой кнопкой по форме → «Добавить в расширение». Форма появится в расширении с тем же составом элементов.
Шаг 2. Повесьте обработчик на создание формы
В заимствованной форме откройте свойства самой формы, событие ПриСозданииНаСервере, и добавьте обработчик с вызовом «после» типового. Платформа создаст процедуру с префиксом расширения. Внутри задайте нужные элементы:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Роль Расш1_ИзменениеИНН создана в этом же расширении и пустая:
// она служит флажком «кому можно»
Если Не РольДоступна("Расш1_ИзменениеИНН") Тогда
Элементы.ИНН.ТолькоПросмотр = Истина;
Элементы.КПП.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Пустая роль в расширении — удобный приём. Права она не даёт, но её можно назначить нужным сотрудникам через профиль групп доступа, а код проверит её наличие функцией РольДоступна().
Шаг 3. Проверьте, не перебивает ли типовой код
Типовые формы часто сами управляют доступностью полей: в ПриЧтенииНаСервере, в процедурах вроде «УстановитьДоступностьЭлементов» или при изменении других реквизитов. Если поле после открытия формы снова становится редактируемым, найдите в модуле формы все строки с ТолькоПросмотр и Доступность для этого элемента и повесьте свой код «после» той процедуры, которая вызывается последней.
Шаг 4. Запретите запись, а не только ввод
Блокировка в форме не остановит обработку, загрузку из файла или групповое изменение реквизитов. Их остановит проверка в модуле объекта. Заимствуйте справочник и добавьте в расширение обработчик:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Или ЭтоНовый() Тогда
Возврат;
КонецЕсли;
Если РольДоступна("Расш1_ИзменениеИНН") Тогда
Возврат;
КонецЕсли;
СтароеЗначение = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ИНН");
Если СтароеЗначение <> ИНН Тогда
ОбщегоНазначения.СообщитьПользователю(
"Изменять ИНН может только ответственный сотрудник.", ЭтотОбъект, "ИНН", , Отказ);
КонецЕсли;
КонецПроцедуры
Аннотация &После работает, только если процедура ПередЗаписью есть в модуле типового объекта. Если её там нет, назначьте собственный обработчик события в свойствах заимствованного объекта. У документа у этого события три параметра: Отказ, РежимЗаписи, РежимПроведения.
Расширение подключается с флагом «Безопасный режим». Код выше работает и в нём. После загрузки расширения в рабочую базу пользователям нужно перезапустить 1С, чтобы изменения применились.
Встроенный запрет редактирования реквизитов в типовых конфигурациях
У типовых конфигураций на БСП есть свой механизм — подсистема «Запрет редактирования реквизитов объектов». Он закрывает ключевые реквизиты у объектов, которые уже используются в учёте. В карточке такое поле открыть нельзя, а в меню Ещё появляется команда «Разрешить редактирование реквизитов».
Как это выглядит на практике:
- 🔒 Поле заблокировано, рядом нет явной причины.
- 📋 Команда «Разрешить редактирование реквизитов» открывает окно со списком заблокированных полей и предупреждением о последствиях.
- ✅ После подтверждения поле открывается до закрытия формы.
Чтобы добавить в этот механизм свой реквизит, в модуле менеджера объекта есть функция ПолучитьБлокируемыеРеквизитыОбъекта(): она возвращает массив имён реквизитов. Заимствуйте модуль менеджера в расширение и дополните результат своим реквизитом. Объект должен быть подключён к подсистеме — это видно по наличию команды в меню Ещё.
Плюс этого пути: пользователь видит привычный интерфейс типовой конфигурации, а не самодельный запрет.
Функциональные опции: когда поле нужно спрятать
Функциональная опция в 1С не блокирует реквизит, а скрывает его из всех форм, меню и отчётов, если опция выключена. Это не запрет редактирования, но иногда именно это и нужно: поле, которым не пользуются, не может быть заполнено ошибочно.
Как связать реквизит с опцией в своей конфигурации:
- Создайте константу типа Булево, например
ИспользоватьСрокГодности. - В
Общие → Функциональные опциидобавьте опцию, хранение — эта константа. - На вкладке «Состав» опции отметьте реквизит.
- Обновите конфигурацию базы данных.
Пока константа равна Ложь, поле не показывается. В типовых конфигурациях такие опции включаются в разделе Администрирование → Функциональность (в Бухгалтерии 3.0) или в соответствующем разделе настроек других решений.
Подходит, если поле лишнее для всех. Если одним сотрудникам оно нужно, а другим нет, опция не поможет: она действует на всю базу или на значение параметра, а не на пользователя.
Особенности блокировки в табличных частях
С табличной частью действуют те же инструменты, но есть нюансы.
Колонка целиком. У колонки есть свои свойства ТолькоПросмотр и Доступность. Кодом это Элементы.ТоварыЦена.ТолькоПросмотр = Истина, где ТоварыЦена — имя элемента колонки, а не реквизита. Право «Редактирование» на реквизит табличной части в роли тоже работает.
Отдельные строки. Заблокировать ячейку только в части строк свойством элемента нельзя: оно действует на всю колонку. Для этого нужно условное оформление с параметром ТолькоПросмотр:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЦена.Имя);
Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Скидка");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Отбор.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
КонецПроцедуры
Здесь цена закрывается в строках, где уже дана скидка. Условие меняйте под свою задачу.
Запрет менять строки вообще. Чтобы пользователь не добавлял и не удалял строки, у таблицы формы есть свойство ИзменятьСоставСтрок. Чтобы запретить начало редактирования строки по условию, используют событие таблицы ПередНачаломИзменения с Отказ = Истина.
Как и с обычными полями, оформление защищает только форму. Если цена в табличной части важна для учёта, сверяйте её в ПередЗаписью объекта.
Частые ошибки при блокировке полей
- 🧍 Проверка под администратором. Под пользователем с «Полными правами» запрет по ролям не виден. Проверяйте под учётной записью обычного сотрудника.
- 🔁 Изменение типовой формы без расширения. Включили изменения на поддержке, поставили флажок — при обновлении правка потерялась или конфликтует. В типовой базе форму меняют только расширением.
- 🗂️ Закрыли поле в одной форме из нескольких. У объекта бывает несколько форм: основная, упрощённая, форма быстрого ввода. Проверьте свойство «Основная форма объекта» и список форм в дереве.
- ✍️ Проверка при записи без учёта загрузки. Без условия
ОбменДанными.Загрузказапрет сломает синхронизацию с другими базами: изменённые в источнике данные не загрузятся. - 🧪 Внедрение сразу в рабочую базу. Расширение с ошибкой в коде формы не даст открыть карточку. Сначала проверка на копии.
Можно ли заблокировать поле без Конфигуратора?
Ещё → Изменить форму поле можно только скрыть, и пользователь вернёт его кнопкой «Стандартные настройки». Готовое расширение администратор загружает без Конфигуратора, в разделе администрирования, но создают его в Конфигураторе.Блокирует ли поле дата запрета изменения?
Как разрешить изменять поле одному сотруднику?
РольДоступна() в коде формы и записи, а саму роль включите в профиль групп доступа этого сотрудника.