Блокировка редактирования формы в 1С: от прав до программного кода
Содержание
Самый быстрый способ закрыть форму от правок — одна строка в модуле формы: ЭтаФорма.ТолькоПросмотр = Истина;. Все поля разом станут серыми и некликабельными, но данные при этом остаются в базе и под защитой прав. Если же нужно надёжно запретить изменение данных, а не только спрятать курсор из полей, работает только одно — права в роли.
Эти два уровня важно не путать. Свойство формы — это удобство интерфейса: оно мешает случайно поменять уже закрытый период или проведённый документ. Права и ограничение доступа на уровне записей (RLS) — это настоящая защита: пользователь без права на запись не изменит объект никаким способом, даже через внешнюю обработку .
Ниже разберём пять уровней блокировки — от настроек роли до кода в модуле объекта — и покажем, где какой уместен. Примеры даны для управляемых форм платформы 8.3 (интерфейс «Такси»).
С чего начать: выбор уровня блокировки
Прежде чем писать код, определитесь, что именно нужно закрыть и от кого. От ответа зависит способ.
ТолькоПросмотр по условию в ПриСозданииНаСервере плюс проверка в ПередЗаписью модуля объекта.ТолькоПросмотр или Доступность у конкретного элемента формы.Общее правило: интерфейсная блокировка и защита данных — разные задачи. Если данные критичны, одного ТолькоПросмотр недостаточно, нужны права.
Запрет через права и роли — самый надёжный уровень
Права — единственный способ, который нельзя обойти работой в пользовательском режиме. Пользователь физически не сможет записать объект, если у его роли нет на это права.
Для настройки откройте нужную роль в конфигураторе: Общие → Роли → <ИмяРоли>. На закладке прав найдите объект (справочник, документ, регистр) и снимите флажки:
- 🔒 Редактирование — запрещает изменение существующих объектов.
- ➕ Добавление — запрещает создание новых.
- 🗑 Удаление — запрещает пометку на удаление и удаление.
- ✏️ Интерактивное изменение проведённых (для документов) — запрещает менять проведённый документ, оставляя возможность править непроведённые.
Если право «Редактирование» снято, форма объекта откроется сама по себе в режиме только для просмотра — платформа сделает это автоматически, писать код не нужно.
В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) права удобнее настраивать не в конфигураторе, а в пользовательском режиме через профили групп доступа: Администрирование → Настройки пользователей и прав → Профили групп доступа. Это не правит саму конфигурацию и сохраняется при обновлении.
Если пользователю нужен только просмотр и ничего больше, оставьте у роли одно право — «Просмотр», а «Редактирование», «Добавление» и «Удаление» снимите. Пользователь сможет открывать объекты и отчёты, но ни создать, ни изменить, ни пометить на удаление не сумеет. Такую «смотровую» роль удобно выдавать проверяющим, стажёрам и внешним аудиторам.
Отдельно стоит право на реквизиты. Платформа 8.3 позволяет запретить редактирование конкретного реквизита объекта независимо от права на сам объект — для этого у реквизита настраивается своя строка прав в роли. Так можно разрешить менять документ, но закрыть, например, поле «Организация». Это тоньше, чем блокировка элемента на форме: запрет действует на уровне данных и работает во всех формах, где этот реквизит выводится.
Свойство ТолькоПросмотр: закрыть форму целиком
Когда право на запись оставить нужно (пользователь иногда правит объект), но в конкретной ситуации форму надо открыть только на просмотр, используют свойство формы ТолькоПросмотр.
Самый простой вариант — задать его декларативно в редакторе формы: выделите корень формы, в палитре свойств поставьте ТолькоПросмотр = Истина. Тогда форма всегда открывается заблокированной.
Чаще блокировку включают программно по условию. Разместите код в обработчике ПриСозданииНаСервере модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Проведен Тогда
ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Здесь ТолькоПросмотр без префикса ЭтаФорма — это свойство самой формы, доступное в её модуле напрямую. После установки все поля, таблицы и кнопки записи становятся недоступными для ввода.
ТолькоПросмотр блокирует только интерактивный ввод в поля. Команды формы при этом остаются активны. Если на форме есть кнопка, которая что-то меняет и записывает программно, она продолжит работать — её нужно отключать отдельно (см. раздел про обход).
Программная блокировка по условию в модуле формы
Статическая блокировка всей формы покрывает не все случаи. Часто нужно, чтобы форма переходила в режим просмотра динамически — например, после того как пользователь нажал «Утвердить», или при открытии записи за прошлый период.
Переключать ТолькоПросмотр можно в любой момент из клиентского кода. Удобное место — обработчик команды или ПриИзменении реквизита:
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
ТолькоПросмотр = (Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Закрыт"));
КонецПроцедуры
Если форму нужно блокировать в зависимости от данных, которые читаются из базы, расчёт выполняют на сервере и передают результат на клиент. Для этого подойдёт обработчик ПриЧтенииНаСервере — он срабатывает при открытии существующего объекта:
&НаСервере
Процедура ПриЧтенииНаСервереПослеСоздания(ТекущийОбъект)
Если ТекущийОбъект.Дата < НачалоГода(ТекущаяДата()) Тогда
ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Такой подход гибче свойства формы, заданного в редакторе: условие можно собрать из любых данных — статуса, даты, автора, настроек пользователя.
Условная блокировка: по дате, статусу и проведению
Самый частый сценарий на практике — закрыть документ после проведения или после закрытия периода. Разберём оба.
После проведения. Если достаточно запретить ручную правку проведённых документов для целой роли, снимите у неё право «Интерактивное изменение проведённых». Платформа сама откроет проведённый документ в режиме просмотра, а при снятии проведения разрешит правку. Это штатный механизм, кода не требует.
По дате запрета. В типовых конфигурациях изменение данных за закрытый период ограничивают не правами, а механизмом Даты запрета изменения: Администрирование → Настройки пользователей и прав → Даты запрета изменения. Здесь дату можно задать общую, по организациям или по пользователям. При попытке записать документ раньше установленной даты платформа не даст сохранить и покажет сообщение. Для собственной конфигурации этот механизм подключается как подсистема БСП.
Дата запрета удобна тем, что не привязана к конкретной форме: она закрывает весь слой данных старше указанного числа независимо от того, как пользователь пытается их изменить.
По своему статусу. Для самописных документов с полем «Статус» блокировку собирают вручную — комбинацией свойства формы (чтобы закрыть ввод визуально) и проверки при записи (чтобы закрыть ввод физически). Первое мы показали выше, второе — в следующем разделе.
Блокировка отдельных полей и элементов формы
Нередко нужно закрыть не всю форму, а один-два элемента: оставить пользователю правку комментария, но запретить менять сумму и контрагента.
Для этого у каждого элемента формы есть два разных свойства — важно не путать их:
| Свойство | Что делает с полем | Когда применять |
|---|---|---|
ТолькоПросмотр | Значение видно, выглядит обычным, но ввод запрещён | Поле информативно, его надо показать, но не менять |
Доступность | Поле становится серым (неактивным) | Поле сейчас неприменимо и его лучше «погасить» |
Устанавливают их из кода по имени элемента:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Контрагент.ТолькоПросмотр = Истина;
Элементы.СуммаДокумента.ТолькоПросмотр = Истина;
Элементы.Комментарий.ТолькоПросмотр = Ложь;
КонецПроцедуры
Для таблицы значений (табличной части) ТолькоПросмотр у поля запрещает правку ячеек. Чтобы вдобавок запретить добавление и удаление строк, снимите у таблицы соответствующие кнопки командной панели или настройте её свойства ИзменятьСоставСтрок, ИзменятьПорядокСтрок.
Если полей много и блокировать нужно по группам, завяжите блокировку на группу формы: установите ТолькоПросмотр у группы — свойство унаследуют все вложенные элементы. Так меньше строк кода и проще поддерживать.
Почему интерфейсной блокировки мало: защита данных
Главная ошибка — считать, что ТолькоПросмотр защищает данные. Это не так. Свойство закрывает только ручной ввод в поля открытой формы. Изменить объект по-прежнему можно программно: через внешнюю обработку, через групповую обработку справочников и документов, через командную кнопку на той же форме.
Поэтому для настоящей защиты применяют один из двух подходов (а лучше оба).
Права и RLS. Если у роли нет права «Редактирование» объекта — запись не пройдёт ни из формы, ни из обработки. Чтобы закрыть не весь объект, а отдельные записи (свою организацию, свой склад), настраивают ограничение доступа на уровне записей (RLS) в роли через шаблоны ограничений. Это гарантия на уровне платформы.
Права закрывают и обходные пути скопом. Пользователь без права «Редактирование» не изменит объект ни групповой обработкой справочников и документов, ни внешней обработкой, ни через командную кнопку на форме — платформа отклонит запись в любом случае. Именно поэтому для защиты критичных данных правильнее настроить права один раз, чем расставлять блокировки по десяткам форм.
Проверка в модуле объекта. Когда запрет зависит от бизнес-логики, которую нельзя выразить правами, контроль ставят в обработчик ПередЗаписью модуля объекта — он срабатывает при любой записи, из любой точки:
Процедура ПередЗаписью(Отказ)
Если ЭтотОбъект.Проведен И НЕ ОбменДанными.Загрузка Тогда
Если Не РольДоступна("ПолныеПрава") Тогда
Отказ = Истина;
Сообщить("Проведённый документ менять нельзя. Снимите проведение.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Условие НЕ ОбменДанными.Загрузка обязательно: без него запрет сработает и при загрузке данных из обмена или при программном переносе, что сломает интеграции. Любую проверку в ПередЗаписью оборачивайте этим условием, если не хотите заблокировать обмен.
Для типовых конфигураций код в модуль объекта напрямую не вписывают — он затрётся при обновлении. Правильный путь — расширение конфигурации (доступно с платформы 8.3.6): создайте расширение, добавьте в него обработчик нужного объекта и свою логику. Конфигурация поставщика при этом остаётся на поддержке.
Частые ошибки при блокировке формы
Коротко о том, на чём обычно спотыкаются.
- ⚠️ Путают
ТолькоПросмотрформы и права. Закрыли форму свойством, считают данные защищёнными — а их спокойно меняют групповой обработкой. Критичные данные закрывайте правами. - ⚠️ Забывают про команды.
ТолькоПросмотр = Истинане отключает кнопки. Если на форме есть команда, записывающая объект, её доступность нужно гасить отдельно:Элементы.КнопкаЗаписать.Доступность = Ложь;. - ⚠️ Правят модуль типовой конфигурации напрямую. После обновления изменения теряются, конфигурация снимается с поддержки. Используйте расширение.
- ⚠️ Ставят проверку в
ПередЗаписьюбезНЕ ОбменДанными.Загрузка. Блокировка срабатывает на обмене и загрузке — встают интеграции. - ⚠️ Блокируют реквизит в
ПриСозданииНаСервере, но не переустанавливают при смене условия. Если статус меняется на той же открытой форме, блокировку нужно пересчитывать вПриИзменении, иначе она «залипнет» в исходном состоянии.
Частые вопросы
Чем `ТолькоПросмотр` отличается от `Доступность` у поля?
ТолькоПросмотр оставляет поле обычным на вид, но запрещает ввод — значение хорошо читается. Доступность = Ложь делает поле серым и неактивным, сигналя, что оно сейчас неприменимо. Для «показать, но не менять» берут ТолькоПросмотр, для «погасить ненужное» — Доступность.Можно ли запретить редактирование формы только одному пользователю?
ПриСозданииНаСервере проверять текущего пользователя функцией ПользователиКлиент.ТекущийПользователь() (в БСП) или сравнением с ПараметрыСеанса.Почему форма проведённого документа и так открывается только на просмотр?
Как закрыть форму от правок в типовой конфигурации, не снимая её с поддержки?
Блокирует ли `ТолькоПросмотр` запись из кода?
ПередЗаписью модуля объекта.