Запрет редактирования реквизита в 1С 8.3: от роли до кода в расширении

· 9 мин

Содержание

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

Для типовых конфигураций (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) правильный путь — расширение конфигурации : оно не снимает базу с поддержки и переживает обновления. Пользовательские настройки формы поле не блокируют, их любой сотрудник откатывает за пару кликов.

Какой способ блокировки поля выбрать

Начните с вопроса: от кого и от чего защищаем реквизит. От случайной правки в карточке хватит формы. От осознанного изменения через обработку, загрузку или групповое изменение нужна проверка в модуле объекта.

СпособГде настраиваетсяЧто блокируетОбходится ли
🔐 Право на реквизит в ролиКонфигуратор, рольИзменение реквизита во всех формах и в коде без привилегированного режимаНет, если ни одна роль пользователя не даёт права
📝 ТолькоПросмотр у элементаФорма объектаВвод в этом поле этой формыДа: другая форма, обработка, групповое изменение
🎨 Условное оформлениеФорма объектаПоле или ячейку при выполнении условияДа, как и предыдущий
🧩 Расширение с кодомРасширение конфигурацииЧто напишете: форма, запись, проверкаЗависит от того, где стоит проверка
🛡️ Проверка ПередЗаписьюМодуль объекта или расширениеЗапись изменённого значения откуда угодноТолько через ОбменДанными.Загрузка
🙈 Функциональная опцияКонфигураторСкрывает поле, а не блокирует—

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

Блокировка через роли и права на реквизиты

Платформа умеет раздавать права не только на объект целиком, но и на отдельные реквизиты справочника, документа и их табличных частей. Для реквизита есть два права: «Просмотр» и «Редактирование».

Как настроить:

  1. Откройте Конфигуратор → Конфигурация → Открыть конфигурацию.
  2. В дереве раскройте Общие → Роли и откройте нужную роль.
  3. Слева выберите объект, например справочник Контрагенты, и раскройте его — появится список реквизитов и табличных частей.
  4. Выделите реквизит и в правой части снимите флажок «Редактирование». Флажок «Просмотр» оставьте, иначе поле просто исчезнет.
  5. Сохраните и выполните Конфигурация → Обновить конфигурацию базы данных (F7).

После этого поле, связанное с реквизитом, в формах станет недоступно для ввода само, без кода.

Главная ловушка — права в 1С складываются. Если у пользователя пять ролей и хотя бы одна даёт «Редактирование» на этот реквизит, поле останется открытым. Запретить право отдельной ролью нельзя: роли только добавляют разрешения.

Отсюда следствия:

  • 🧑‍💼 Пользователь с ролью «Полные права» всегда редактирует всё, ограничения ролей на него не действуют.
  • 🧩 Роль в расширении может только добавить права, а не отнять. Чтобы снять право в типовой роли, придётся менять саму конфигурацию.
  • 📦 Изменение типовой роли требует включить возможность изменений на поддержке. При каждом обновлении роль придётся сравнивать и объединять заново.
  • 🔍 Ограничение доступа на уровне записей (RLS) поля не блокирует: оно режет строки, а не реквизиты.

Правку типовых ролей делайте только на копии базы и с выгрузкой .cf до изменений. Неудачное объединение при следующем обновлении может снять с пользователей нужные права.

Настройка формы: «Только просмотр» и «Доступность»

Если нужно закрыть поле в одной карточке и база не на поддержке (или конфигурация своя), достаточно свойства элемента формы.

  1. В Конфигураторе откройте форму объекта, например Справочники → Номенклатура → Формы → ФормаЭлемента.
  2. На вкладке «Элементы» найдите поле. Удобно искать по имени через строку поиска над деревом.
  3. Откройте палитру свойств (Alt+Enter) и установите флажок ТолькоПросмотр.

Чем отличаются два похожих свойства:

СвойствоКак выглядитМожно скопировать значениеОткрывается ли ссылка
ТолькоПросмотрПоле обычное, ввод невозможенДаДа
Доступность = ЛожьПоле сероеНетНет

Для блокировки почти всегда лучше ТолькоПросмотр: бухгалтер видит значение, может его выделить и открыть, например, карточку контрагента из поля ссылки.

Что пользователь может сделать сам: через Ещё → Изменить форму он скрывает и переставляет поля. Сделать поле нередактируемым в этом окне нельзя, а любые изменения сбрасываются кнопкой «Стандартные настройки». Поэтому пользовательская настройка интерфейса — способ убрать лишнее с глаз, но не защита.

Блокировка поля через расширение конфигурации

Расширения появились в платформе 8.3.6. Это основной способ заблокировать поле в типовой 1С без снятия с поддержки.

Шаг 1. Создайте расширение и заимствуйте форму

  1. Конфигуратор → Конфигурация → Расширения конфигурации → Добавить.
  2. Откройте конфигурацию расширения, затем в основной конфигурации найдите нужную форму.
  3. Правой кнопкой по форме → «Добавить в расширение». Форма появится в расширении с тем же составом элементов.

Шаг 2. Повесьте обработчик на создание формы

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

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    // Роль Расш1_ИзменениеИНН создана в этом же расширении и пустая:
    // она служит флажком «кому можно»
    Если Не РольДоступна("Расш1_ИзменениеИНН") Тогда
        Элементы.ИНН.ТолькоПросмотр = Истина;
        Элементы.КПП.ТолькоПросмотр = Истина;
    КонецЕсли;

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

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

Шаг 3. Проверьте, не перебивает ли типовой код

Типовые формы часто сами управляют доступностью полей: в ПриЧтенииНаСервере, в процедурах вроде «УстановитьДоступностьЭлементов» или при изменении других реквизитов. Если поле после открытия формы снова становится редактируемым, найдите в модуле формы все строки с ТолькоПросмотр и Доступность для этого элемента и повесьте свой код «после» той процедуры, которая вызывается последней.

Шаг 4. Запретите запись, а не только ввод

Блокировка в форме не остановит обработку, загрузку из файла или групповое изменение реквизитов. Их остановит проверка в модуле объекта. Заимствуйте справочник и добавьте в расширение обработчик:

&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ)

    Если ОбменДанными.Загрузка Или ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

    Если РольДоступна("Расш1_ИзменениеИНН") Тогда
        Возврат;
    КонецЕсли;

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

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

Аннотация &После работает, только если процедура ПередЗаписью есть в модуле типового объекта. Если её там нет, назначьте собственный обработчик события в свойствах заимствованного объекта. У документа у этого события три параметра: Отказ, РежимЗаписи, РежимПроведения.

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

Встроенный запрет редактирования реквизитов в типовых конфигурациях

У типовых конфигураций на БСП есть свой механизм — подсистема «Запрет редактирования реквизитов объектов». Он закрывает ключевые реквизиты у объектов, которые уже используются в учёте. В карточке такое поле открыть нельзя, а в меню Ещё появляется команда «Разрешить редактирование реквизитов».

Как это выглядит на практике:

  • 🔒 Поле заблокировано, рядом нет явной причины.
  • 📋 Команда «Разрешить редактирование реквизитов» открывает окно со списком заблокированных полей и предупреждением о последствиях.
  • ✅ После подтверждения поле открывается до закрытия формы.

Чтобы добавить в этот механизм свой реквизит, в модуле менеджера объекта есть функция ПолучитьБлокируемыеРеквизитыОбъекта(): она возвращает массив имён реквизитов. Заимствуйте модуль менеджера в расширение и дополните результат своим реквизитом. Объект должен быть подключён к подсистеме — это видно по наличию команды в меню Ещё.

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

Функциональные опции: когда поле нужно спрятать

Функциональная опция в 1С не блокирует реквизит, а скрывает его из всех форм, меню и отчётов, если опция выключена. Это не запрет редактирования, но иногда именно это и нужно: поле, которым не пользуются, не может быть заполнено ошибочно.

Как связать реквизит с опцией в своей конфигурации:

  1. Создайте константу типа Булево, например ИспользоватьСрокГодности.
  2. В Общие → Функциональные опции добавьте опцию, хранение — эта константа.
  3. На вкладке «Состав» опции отметьте реквизит.
  4. Обновите конфигурацию базы данных.

Пока константа равна Ложь, поле не показывается. В типовых конфигурациях такие опции включаются в разделе Администрирование → Функциональность (в Бухгалтерии 3.0) или в соответствующем разделе настроек других решений.

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

Особенности блокировки в табличных частях

С табличной частью действуют те же инструменты, но есть нюансы.

Колонка целиком. У колонки есть свои свойства ТолькоПросмотр и Доступность. Кодом это Элементы.ТоварыЦена.ТолькоПросмотр = Истина, где ТоварыЦена — имя элемента колонки, а не реквизита. Право «Редактирование» на реквизит табличной части в роли тоже работает.

Отдельные строки. Заблокировать ячейку только в части строк свойством элемента нельзя: оно действует на всю колонку. Для этого нужно условное оформление с параметром ТолькоПросмотр:

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    Элемент = УсловноеОформление.Элементы.Добавить();

    ПолеОформления = Элемент.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыЦена.Имя);

    Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Объект.Товары.Скидка");
    Отбор.ВидСравнения   = ВидСравненияКомпоновкиДанных.Больше;
    Отбор.ПравоеЗначение = 0;

    Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

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

Здесь цена закрывается в строках, где уже дана скидка. Условие меняйте под свою задачу.

Запрет менять строки вообще. Чтобы пользователь не добавлял и не удалял строки, у таблицы формы есть свойство ИзменятьСоставСтрок. Чтобы запретить начало редактирования строки по условию, используют событие таблицы ПередНачаломИзменения с Отказ = Истина.

Как и с обычными полями, оформление защищает только форму. Если цена в табличной части важна для учёта, сверяйте её в ПередЗаписью объекта.

Диагностика: выберите симптом

Частые ошибки при блокировке полей

  • 🧍 Проверка под администратором. Под пользователем с «Полными правами» запрет по ролям не виден. Проверяйте под учётной записью обычного сотрудника.
  • 🔁 Изменение типовой формы без расширения. Включили изменения на поддержке, поставили флажок — при обновлении правка потерялась или конфликтует. В типовой базе форму меняют только расширением.
  • 🗂️ Закрыли поле в одной форме из нескольких. У объекта бывает несколько форм: основная, упрощённая, форма быстрого ввода. Проверьте свойство «Основная форма объекта» и список форм в дереве.
  • ✍️ Проверка при записи без учёта загрузки. Без условия ОбменДанными.Загрузка запрет сломает синхронизацию с другими базами: изменённые в источнике данные не загрузятся.
  • 🧪 Внедрение сразу в рабочую базу. Расширение с ошибкой в коде формы не даст открыть карточку. Сначала проверка на копии.
Можно ли заблокировать поле без Конфигуратора?
В пользовательском режиме — нет. Через Ещё → Изменить форму поле можно только скрыть, и пользователь вернёт его кнопкой «Стандартные настройки». Готовое расширение администратор загружает без Конфигуратора, в разделе администрирования, но создают его в Конфигураторе.
Блокирует ли поле дата запрета изменения?
Нет. Дата запрета закрывает весь документ или объект за прошлый период, а не отдельный реквизит. Для одного поля нужны роли, форма или проверка при записи.
Как разрешить изменять поле одному сотруднику?
Создайте пустую роль в расширении, проверяйте её функцией РольДоступна() в коде формы и записи, а саму роль включите в профиль групп доступа этого сотрудника.
Что будет с расширением при обновлении типовой конфигурации?
Оно останется подключённым. Если в новом релизе переименовали элемент формы или процедуру, на которую ссылается расширение, платформа сообщит об ошибке при подключении. Тогда поправьте имена в расширении.
Чем ТолькоПросмотр формы отличается от ТолькоПросмотр поля?
Свойство формы закрывает все поля разом, свойство элемента — только одно. Для блокировки конкретного реквизита ставьте его у элемента.