К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как запретить редактирование формы в 1С

Способы запретить редактирование формы в 1С: свойство ТолькоПросмотр, роли и RLS, подписки на события. Пошаговые инструкции, проверка результата и типичные ошибки.

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

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

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

Определите, какой именно запрет вам нужен

Прежде чем что-то настраивать, ответьте на три вопроса. Кого ограничиваем: всех пользователей, отдельную группу или всех, кроме ответственного? Когда действует запрет: всегда или при выполнении условия (проведён, утверждён, закрыт период)? Что запрещаем: изменение всего объекта или отдельных реквизитов?

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

Маршрут решения

Как выбрать способ запрета

Запрет постоянный, для группы пользователейНастройте роли: уберите право Изменение и Добавление у объекта
Запрет зависит от состояния объекта (проведён, согласован)Установите ТолькоПросмотр в форме и добавьте проверку в подписке ПередЗаписью
Нужно закрыть только часть полейУстановите ТолькоПросмотр у отдельных элементов формы
Нужно закрыть старые периоды для всехИспользуйте дату запрета редактирования в настройках программы

Способ 1: свойство формы «Только просмотр»

Самый простой вариант — перевести всю форму в режим просмотра. В управляемой форме это делается программно в обработчике ПриСозданииНаСервере или ПриОткрытии:

&НаСервере

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

Если Объект.Проведен Тогда

ЭтотОбъект.ТолькоПросмотр = Истина;

КонецЕсли;

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

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

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

Способ 2: запрет редактирования отдельных полей

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

Пример блокировки ключевых реквизитов после проведения:

&НаКлиенте

Процедура УстановитьДоступностьПолей()

Элементы.Организация.ТолькоПросмотр = Объект.Проведен;

Элементы.Договор.ТолькоПросмотр = Объект.Проведен;

Элементы.СуммаДокумента.ТолькоПросмотр = Объект.Проведен;

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

Вызывайте такую процедуру из ПриОткрытии и из обработчиков событий, меняющих условие (например, после записи). Если заблокированных полей много, удобнее перебрать элементы циклом по списку имён, чем писать строку на каждое поле.

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

Способ 3: права доступа и роли

Единственный способ надёжно запретить редактирование на уровне всей системы — убрать у роли пользователя права на изменение объекта. В конфигураторе откройте роль, найдите нужный объект (документ, справочник) и снимите права «Добавление», «Изменение», оставив «Чтение» и «Просмотр».

Для типовых конфигураций на БСП менять роли в конфигураторе не обязательно: используйте профили групп доступа в разделе администрирования. Создайте профиль, в котором нужный объект доступен только на чтение, и назначьте его группе пользователей. Это безопаснее прямой доработки конфигурации — настройки не слетят при обновлении.

Если нужно различие «свои документы можно, чужие нельзя», используется механизм RLS (ограничение доступа на уровне записей) — в типовых решениях он включается через настройки групп доступа и шаблоны ограничений. RLS работает на уровне запросов к базе, поэтому обойти его через форму или обработку нельзя.

Способ 4: подписка на событие для условного запрета

Когда запрет зависит от состояния объекта и должен срабатывать при любой попытке записи — из формы, обработки или обмена — используйте подписку на событие ПередЗаписью. В конфигураторе создайте подписку, укажите источник (например, нужный документ или группу объектов) и обработчик в общем модуле с флагом «Сервер»:

Процедура ЗапретРедактированияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

Если Источник.ОбменДанными.Загрузка Тогда

Возврат;

КонецЕсли;

Если Источник.Статус = Перечисления.СтатусыДокументов.Утвержден Тогда

Отказ = Истина;

ВызватьИсключение "Документ утверждён, редактирование запрещено";

КонецЕсли;

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

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

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

Способ 5: дата запрета редактирования

Для закрытия прошлых периодов в типовых конфигурациях есть штатный механизм «Даты запрета изменения данных». Он находится в разделе администрирования (в конфигурациях на БСП — «Настройки пользователей и прав» или «Синхронизация данных», в зависимости от версии). Установите дату — и все объекты раньше неё станут недоступны для изменения пользователям без специального права.

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

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

Сравнение способов запрета

ТолькоПросмотр формы

Быстро и просто, но защищает только одну форму. Подходит как визуальный слой

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

Гибко для части полей, но требует перечисления элементов и дублирующей проверки на сервере

Роли и права

Надёжный системный запрет, но не поддерживает условия по состоянию объекта

Подписка ПередЗаписью

Работает при любой записи и с условиями, требует доработки конфигурации

Дата запрета

Штатно закрывает периоды, но не подходит для условий вроде статуса документа

Проверка результата и типичные ошибки

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

Контрольные точки: форма открывается и данные видны (чтение не сломано), поля недоступны или запись отклоняется с понятным сообщением, у привилегированной роли (если предусмотрена) изменение по-прежнему работает. Если чтение тоже пропало — вы случайно сняли право «Чтение» вместе с «Изменением».

Контрольные точки

Как проверить результат

Открытие объекта под обычным пользователем
Норма

Данные видны, поля недоступны

Тревожный признак

Объект не открывается или редактируется свободно

Попытка записи
Норма

Отказ с понятным сообщением о причине

Тревожный признак

Запись проходит или ошибка без объяснения

Обход через обработку или обмен
Норма

Серверная проверка блокирует запись

Тревожный признак

Данные меняются в обход формы

Работа привилегированной роли
Норма

Изменение доступно ответственному

Тревожный признак

Запрет сработал и для администратора процесса

Типичные ошибки
01
Запрет только в форме — объект меняется через групповую обработку и обмены
02
Снятие права Чтение вместе с Изменением — пользователь вообще не видит данные
03
Забытая проверка ОбменДанными.Загрузка в подписке — ломаются синхронизации
04
Условие по устаревшему значению — в ПередЗаписью сравнивать нужно со значением из базы, а не с реквизитом объекта
05
Доработка типовой роли вместо профиля доступа — настройки теряются при обновлении конфигурации

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

Как запретить редактирование только проведённых документов?

Установите в форме ТолькоПросмотр = Истина при условии Объект.Проведен и добавьте подписку ПередЗаписью, которая отклоняет запись, если документ в базе уже проведён. Проверять нужно значение из базы, так как пользователь мог отменить проведение в текущем сеансе.

Можно ли запретить редактирование без доработки конфигурации?

Да, если запрет постоянный: настройте профили групп доступа в типовой конфигурации, убрав права на изменение объекта, или используйте дату запрета редактирования для закрытия периодов. Условные запреты по статусу без кода не реализуются.

Почему запрет в форме не срабатывает у части пользователей?

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

Как разрешить редактирование одному ответственному при общем запрете?

В подписке ПередЗаписью добавьте проверку роли: Если РольДоступна("ПолныеПрава") Тогда Возврат; или создайте отдельную роль «Редактирование утверждённых документов» и проверяйте её. В форме аналогично не устанавливайте ТолькоПросмотр для этой роли.

Что делать, если после запрета перестал работать обмен данными?

Причина почти всегда в подписке на событие без проверки режима загрузки. Добавьте в начало обработчика выход при Источник.ОбменДанными.Загрузка = Истина, либо настройте в плане обмена отправку с признаком загрузки и перепроверьте журнал регистрации на ошибки записи.

Как временно снять запрет для исправления ошибки в закрытом периоде?

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

Итог

Что важно запомнить

Интерфейсный запрет (ТолькоПросмотр формы и элементов) делает работу удобной, но не защищает данные. Надёжный запрет строится на правах доступа и серверных проверках в подписке ПередЗаписью. Проверяйте результат под учётной записью целевого пользователя и не забывайте про исключения для обменов и ответственных сотрудников.