Блокировка редактирования формы в 1С: от прав до программного кода

· 9 мин

Содержание

Самый быстрый способ закрыть форму от правок — одна строка в модуле формы: ЭтаФорма.ТолькоПросмотр = Истина;. Все поля разом станут серыми и некликабельными, но данные при этом остаются в базе и под защитой прав. Если же нужно надёжно запретить изменение данных, а не только спрятать курсор из полей, работает только одно — права в роли.

Эти два уровня важно не путать. Свойство формы — это удобство интерфейса: оно мешает случайно поменять уже закрытый период или проведённый документ. Права и ограничение доступа на уровне записей (RLS) — это настоящая защита: пользователь без права на запись не изменит объект никаким способом, даже через внешнюю обработку .

Ниже разберём пять уровней блокировки — от настроек роли до кода в модуле объекта — и покажем, где какой уместен. Примеры даны для управляемых форм платформы 8.3 (интерфейс «Такси»).

С чего начать: выбор уровня блокировки

Прежде чем писать код, определитесь, что именно нужно закрыть и от кого. От ответа зависит способ.

Что нужно запретить?

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

Запрет через права и роли — самый надёжный уровень

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

Для настройки откройте нужную роль в конфигураторе: Общие → Роли → <ИмяРоли>. На закладке прав найдите объект (справочник, документ, регистр) и снимите флажки:

  • 🔒 Редактирование — запрещает изменение существующих объектов.
  • ➕ Добавление — запрещает создание новых.
  • 🗑 Удаление — запрещает пометку на удаление и удаление.
  • ✏️ Интерактивное изменение проведённых (для документов) — запрещает менять проведённый документ, оставляя возможность править непроведённые.

Если право «Редактирование» снято, форма объекта откроется сама по себе в режиме только для просмотра — платформа сделает это автоматически, писать код не нужно.

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

Если пользователю нужен только просмотр и ничего больше, оставьте у роли одно право — «Просмотр», а «Редактирование», «Добавление» и «Удаление» снимите. Пользователь сможет открывать объекты и отчёты, но ни создать, ни изменить, ни пометить на удаление не сумеет. Такую «смотровую» роль удобно выдавать проверяющим, стажёрам и внешним аудиторам.

Отдельно стоит право на реквизиты. Платформа 8.3 позволяет запретить редактирование конкретного реквизита объекта независимо от права на сам объект — для этого у реквизита настраивается своя строка прав в роли. Так можно разрешить менять документ, но закрыть, например, поле «Организация». Это тоньше, чем блокировка элемента на форме: запрет действует на уровне данных и работает во всех формах, где этот реквизит выводится.

Свойство ТолькоПросмотр: закрыть форму целиком

Когда право на запись оставить нужно (пользователь иногда правит объект), но в конкретной ситуации форму надо открыть только на просмотр, используют свойство формы ТолькоПросмотр.

Самый простой вариант — задать его декларативно в редакторе формы: выделите корень формы, в палитре свойств поставьте ТолькоПросмотр = Истина. Тогда форма всегда открывается заблокированной.

Чаще блокировку включают программно по условию. Разместите код в обработчике ПриСозданииНаСервере модуля формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если Объект.Проведен Тогда
        ТолькоПросмотр = Истина;
    КонецЕсли;

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

Здесь ТолькоПросмотр без префикса ЭтаФорма — это свойство самой формы, доступное в её модуле напрямую. После установки все поля, таблицы и кнопки записи становятся недоступными для ввода.

ТолькоПросмотр блокирует только интерактивный ввод в поля. Команды формы при этом остаются активны. Если на форме есть кнопка, которая что-то меняет и записывает программно, она продолжит работать — её нужно отключать отдельно (см. раздел про обход).

Программная блокировка по условию в модуле формы

Статическая блокировка всей формы покрывает не все случаи. Часто нужно, чтобы форма переходила в режим просмотра динамически — например, после того как пользователь нажал «Утвердить», или при открытии записи за прошлый период.

Переключать ТолькоПросмотр можно в любой момент из клиентского кода. Удобное место — обработчик команды или ПриИзменении реквизита:

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)

    ТолькоПросмотр = (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Закрыт"));

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

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

&НаСервере
Процедура ПриЧтенииНаСервереПослеСоздания(ТекущийОбъект)

    Если ТекущийОбъект.Дата < НачалоГода(ТекущаяДата()) Тогда
        ТолькоПросмотр = Истина;
    КонецЕсли;

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

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

Условная блокировка: по дате, статусу и проведению

Самый частый сценарий на практике — закрыть документ после проведения или после закрытия периода. Разберём оба.

После проведения. Если достаточно запретить ручную правку проведённых документов для целой роли, снимите у неё право «Интерактивное изменение проведённых». Платформа сама откроет проведённый документ в режиме просмотра, а при снятии проведения разрешит правку. Это штатный механизм, кода не требует.

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

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

По своему статусу. Для самописных документов с полем «Статус» блокировку собирают вручную — комбинацией свойства формы (чтобы закрыть ввод визуально) и проверки при записи (чтобы закрыть ввод физически). Первое мы показали выше, второе — в следующем разделе.

Блокировка отдельных полей и элементов формы

Нередко нужно закрыть не всю форму, а один-два элемента: оставить пользователю правку комментария, но запретить менять сумму и контрагента.

Для этого у каждого элемента формы есть два разных свойства — важно не путать их:

СвойствоЧто делает с полемКогда применять
ТолькоПросмотрЗначение видно, выглядит обычным, но ввод запрещёнПоле информативно, его надо показать, но не менять
ДоступностьПоле становится серым (неактивным)Поле сейчас неприменимо и его лучше «погасить»

Устанавливают их из кода по имени элемента:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Элементы.Контрагент.ТолькоПросмотр = Истина;
    Элементы.СуммаДокумента.ТолькоПросмотр = Истина;
    Элементы.Комментарий.ТолькоПросмотр  = Ложь;

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

Для таблицы значений (табличной части) ТолькоПросмотр у поля запрещает правку ячеек. Чтобы вдобавок запретить добавление и удаление строк, снимите у таблицы соответствующие кнопки командной панели или настройте её свойства ИзменятьСоставСтрок, ИзменятьПорядокСтрок.

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

Почему интерфейсной блокировки мало: защита данных

Главная ошибка — считать, что ТолькоПросмотр защищает данные. Это не так. Свойство закрывает только ручной ввод в поля открытой формы. Изменить объект по-прежнему можно программно: через внешнюю обработку, через групповую обработку справочников и документов, через командную кнопку на той же форме.

Поэтому для настоящей защиты применяют один из двух подходов (а лучше оба).

Права и RLS. Если у роли нет права «Редактирование» объекта — запись не пройдёт ни из формы, ни из обработки. Чтобы закрыть не весь объект, а отдельные записи (свою организацию, свой склад), настраивают ограничение доступа на уровне записей (RLS) в роли через шаблоны ограничений. Это гарантия на уровне платформы.

Права закрывают и обходные пути скопом. Пользователь без права «Редактирование» не изменит объект ни групповой обработкой справочников и документов, ни внешней обработкой, ни через командную кнопку на форме — платформа отклонит запись в любом случае. Именно поэтому для защиты критичных данных правильнее настроить права один раз, чем расставлять блокировки по десяткам форм.

Проверка в модуле объекта. Когда запрет зависит от бизнес-логики, которую нельзя выразить правами, контроль ставят в обработчик ПередЗаписью модуля объекта — он срабатывает при любой записи, из любой точки:

Процедура ПередЗаписью(Отказ)

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

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

Условие НЕ ОбменДанными.Загрузка обязательно: без него запрет сработает и при загрузке данных из обмена или при программном переносе, что сломает интеграции. Любую проверку в ПередЗаписью оборачивайте этим условием, если не хотите заблокировать обмен.

Для типовых конфигураций код в модуль объекта напрямую не вписывают — он затрётся при обновлении. Правильный путь — расширение конфигурации (доступно с платформы 8.3.6): создайте расширение, добавьте в него обработчик нужного объекта и свою логику. Конфигурация поставщика при этом остаётся на поддержке.

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

Коротко о том, на чём обычно спотыкаются.

  • ⚠️ Путают ТолькоПросмотр формы и права. Закрыли форму свойством, считают данные защищёнными — а их спокойно меняют групповой обработкой. Критичные данные закрывайте правами.
  • ⚠️ Забывают про команды. ТолькоПросмотр = Истина не отключает кнопки. Если на форме есть команда, записывающая объект, её доступность нужно гасить отдельно: Элементы.КнопкаЗаписать.Доступность = Ложь;.
  • ⚠️ Правят модуль типовой конфигурации напрямую. После обновления изменения теряются, конфигурация снимается с поддержки. Используйте расширение.
  • ⚠️ Ставят проверку в ПередЗаписью без НЕ ОбменДанными.Загрузка. Блокировка срабатывает на обмене и загрузке — встают интеграции.
  • ⚠️ Блокируют реквизит в ПриСозданииНаСервере, но не переустанавливают при смене условия. Если статус меняется на той же открытой форме, блокировку нужно пересчитывать в ПриИзменении, иначе она «залипнет» в исходном состоянии.

Частые вопросы

Чем `ТолькоПросмотр` отличается от `Доступность` у поля?
ТолькоПросмотр оставляет поле обычным на вид, но запрещает ввод — значение хорошо читается. Доступность = Ложь делает поле серым и неактивным, сигналя, что оно сейчас неприменимо. Для «показать, но не менять» берут ТолькоПросмотр, для «погасить ненужное» — Доступность.
Можно ли запретить редактирование формы только одному пользователю?
Через права — да, если завести для него отдельную роль или профиль группы доступа без права «Редактирование». Через свойство формы — да, если в ПриСозданииНаСервере проверять текущего пользователя функцией ПользователиКлиент.ТекущийПользователь() (в БСП) или сравнением с ПараметрыСеанса.
Почему форма проведённого документа и так открывается только на просмотр?
Это штатное поведение платформы при снятом праве «Интерактивное изменение проведённых» у роли. Чтобы отредактировать такой документ, его сначала распроводят — тогда форма снова станет доступной для ввода.
Как закрыть форму от правок в типовой конфигурации, не снимая её с поддержки?
Создайте расширение конфигурации, добавьте в него нужную форму или объект и разместите логику блокировки в обработчике расширения. Сама конфигурация поставщика не меняется и обновляется штатно.
Блокирует ли `ТолькоПросмотр` запись из кода?
Нет. Свойство закрывает только интерактивный ввод в поля. Программная запись объекта (из обработки, команды, обмена) проходит. Чтобы запретить и её, нужны права либо проверка в ПередЗаписью модуля объекта.