Разработка и Конфигурация · 11 мин
Как запретить редактирование формы в 1С
Способы запретить редактирование формы в 1С: свойство ТолькоПросмотр, роли и RLS, подписки на события. Пошаговые инструкции, проверка результата и типичные ошибки.
Запрет редактирования формы в 1С — типовая задача, которая возникает в трёх ситуациях: нужно ограничить конкретного пользователя или группу, закрыть изменения в отдельном документе после его проведения или утверждения, либо сделать всю форму доступной только для просмотра в определённых условиях. Универсальной кнопки «запретить» нет — используется комбинация прав доступа, свойств формы и программного кода.
Выбор способа зависит от того, что именно требуется. Если ограничение постоянное и касается всех пользователей без полных прав, достаточно настройки ролей. Если запрет условный — например, документ нельзя менять после установки статуса «Согласован» — понадобится код в модуле формы или подписка на событие. Если нужно закрыть от изменений только часть полей, настраивается доступность отдельных элементов.
Важно понимать разницу между запретом на уровне интерфейса и запретом на уровне данных. Свойство «Только просмотр» у формы защищает только от редактирования через эту форму: пользователь с достаточными правами сможет изменить объект через групповую обработку, другую форму или обмен данными. Надёжный запрет всегда строится на правах доступа и проверках на сервере.
Определите, какой именно запрет вам нужен
Прежде чем что-то настраивать, ответьте на три вопроса. Кого ограничиваем: всех пользователей, отдельную группу или всех, кроме ответственного? Когда действует запрет: всегда или при выполнении условия (проведён, утверждён, закрыт период)? Что запрещаем: изменение всего объекта или отдельных реквизитов?
От ответов зависит инструмент. Постоянный запрет для группы пользователей — это роли и права. Условный запрет — код в форме или подписка на событие. Запрет на отдельные поля — свойство «Только просмотр» или «Доступность» у конкретных элементов формы. Часто эти методы комбинируются: роль закрывает запись на уровне данных, а форма визуально блокируется, чтобы пользователь видел понятную картину.
Как выбрать способ запрета
Способ 1: свойство формы «Только просмотр»
Самый простой вариант — перевести всю форму в режим просмотра. В управляемой форме это делается программно в обработчике ПриСозданииНаСервере или ПриОткрытии:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Проведен Тогда
ЭтотОбъект.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
После этого все поля формы становятся недоступными для ввода, команды записи и проведения блокируются. Пользователь видит данные, но не может их изменить. Условие в примере — проведённость документа — замените на своё: статус, дата, ответственный, признак закрытия.
У способа есть ограничение: он защищает только данную форму. Объект остаётся изменяемым через другие механизмы — групповое изменение реквизитов, обработки, обмены. Поэтому «Только просмотр» формы всегда стоит дублировать серверной проверкой, если запрет критичен для учёта.
Способ 2: запрет редактирования отдельных полей
Когда менять объект можно, а отдельные реквизиты — нельзя, блокируйте конкретные элементы. У поля формы есть два подходящих свойства: ТолькоПросмотр (поле видно, выглядит обычно, но не редактируется) и Доступность (поле затеняется и недоступно).
Пример блокировки ключевых реквизитов после проведения:
&НаКлиенте
Процедура УстановитьДоступностьПолей()
Элементы.Организация.ТолькоПросмотр = Объект.Проведен;
Элементы.Договор.ТолькоПросмотр = Объект.Проведен;
Элементы.СуммаДокумента.ТолькоПросмотр = Объект.Проведен;
КонецПроцедуры
Вызывайте такую процедуру из ПриОткрытии и из обработчиков событий, меняющих условие (например, после записи). Если заблокированных полей много, удобнее перебрать элементы циклом по списку имён, чем писать строку на каждое поле.
Учтите: блокировка элементов — чисто визуальная мера. Реквизит остаётся доступным программно, поэтому критичные поля проверяйте дополнительно в модуле объекта в обработчике ПередЗаписью, сравнивая новое значение со значением из базы.
Способ 3: права доступа и роли
Единственный способ надёжно запретить редактирование на уровне всей системы — убрать у роли пользователя права на изменение объекта. В конфигураторе откройте роль, найдите нужный объект (документ, справочник) и снимите права «Добавление», «Изменение», оставив «Чтение» и «Просмотр».
Для типовых конфигураций на БСП менять роли в конфигураторе не обязательно: используйте профили групп доступа в разделе администрирования. Создайте профиль, в котором нужный объект доступен только на чтение, и назначьте его группе пользователей. Это безопаснее прямой доработки конфигурации — настройки не слетят при обновлении.
Если нужно различие «свои документы можно, чужие нельзя», используется механизм RLS (ограничение доступа на уровне записей) — в типовых решениях он включается через настройки групп доступа и шаблоны ограничений. RLS работает на уровне запросов к базе, поэтому обойти его через форму или обработку нельзя.
Способ 4: подписка на событие для условного запрета
Когда запрет зависит от состояния объекта и должен срабатывать при любой попытке записи — из формы, обработки или обмена — используйте подписку на событие ПередЗаписью. В конфигураторе создайте подписку, укажите источник (например, нужный документ или группу объектов) и обработчик в общем модуле с флагом «Сервер»:
Процедура ЗапретРедактированияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Источник.Статус = Перечисления.СтатусыДокументов.Утвержден Тогда
Отказ = Истина;
ВызватьИсключение "Документ утверждён, редактирование запрещено";
КонецЕсли;
КонецПроцедуры
Обратите внимание на первую проверку: пропуск записи в режиме загрузки необходим, иначе сломаются обмены и начальное заполнение. Если обмены тоже должны подчиняться запрету, уберите эту ветку, но сначала убедитесь, что механизмы синхронизации не будут массово падать с ошибками.
Текст исключения пользователь увидит при попытке записи — формулируйте его понятно, указывая причину запрета и, при необходимости, к кому обращаться за снятием блокировки (например, к роли с правом изменения утверждённых документов).
Способ 5: дата запрета редактирования
Для закрытия прошлых периодов в типовых конфигурациях есть штатный механизм «Даты запрета изменения данных». Он находится в разделе администрирования (в конфигурациях на БСП — «Настройки пользователей и прав» или «Синхронизация данных», в зависимости от версии). Установите дату — и все объекты раньше неё станут недоступны для изменения пользователям без специального права.
Механизм поддерживает исключения: можно разрешить редактирование закрытого периода отдельным пользователям или по отдельным разделам учёта. Это удобно, когда бухгалтерия закрыла месяц, но одному сотруднику нужно внести исправление по согласованию.
Дата запрета работает на уровне записи данных, то есть защищает и от обхода через обработки. Для самописных конфигураций без БСП аналог придётся реализовывать самостоятельно — через ту же подписку ПередЗаписью со сравнением даты объекта с константой.
Сравнение способов запрета
Быстро и просто, но защищает только одну форму. Подходит как визуальный слой
Гибко для части полей, но требует перечисления элементов и дублирующей проверки на сервере
Надёжный системный запрет, но не поддерживает условия по состоянию объекта
Работает при любой записи и с условиями, требует доработки конфигурации
Штатно закрывает периоды, но не подходит для условий вроде статуса документа
Проверка результата и типичные ошибки
После настройки проверьте запрет под учётной записью пользователя, на которого он рассчитан, — а не под администратором. Откройте объект, попробуйте изменить поля, записать, провести. Затем проверьте обходные пути: групповое изменение реквизитов, копирование документа, пометку удаления. Если запрет критичен, проверьте также запись через простую обработку или консоль кода.
Контрольные точки: форма открывается и данные видны (чтение не сломано), поля недоступны или запись отклоняется с понятным сообщением, у привилегированной роли (если предусмотрена) изменение по-прежнему работает. Если чтение тоже пропало — вы случайно сняли право «Чтение» вместе с «Изменением».
Как проверить результат
Данные видны, поля недоступны
Объект не открывается или редактируется свободно
Отказ с понятным сообщением о причине
Запись проходит или ошибка без объяснения
Серверная проверка блокирует запись
Данные меняются в обход формы
Изменение доступно ответственному
Запрет сработал и для администратора процесса
Частые вопросы
Как запретить редактирование только проведённых документов?
Установите в форме ТолькоПросмотр = Истина при условии Объект.Проведен и добавьте подписку ПередЗаписью, которая отклоняет запись, если документ в базе уже проведён. Проверять нужно значение из базы, так как пользователь мог отменить проведение в текущем сеансе.
Можно ли запретить редактирование без доработки конфигурации?
Да, если запрет постоянный: настройте профили групп доступа в типовой конфигурации, убрав права на изменение объекта, или используйте дату запрета редактирования для закрытия периодов. Условные запреты по статусу без кода не реализуются.
Почему запрет в форме не срабатывает у части пользователей?
Скорее всего, у них есть роль с полными правами или право на интерактивное изменение через другие механизмы. Проверьте состав ролей пользователя в разделе администрирования и убедитесь, что серверная проверка в подписке не содержит исключений по ролям, о которых вы забыли.
Как разрешить редактирование одному ответственному при общем запрете?
В подписке ПередЗаписью добавьте проверку роли: Если РольДоступна("ПолныеПрава") Тогда Возврат; или создайте отдельную роль «Редактирование утверждённых документов» и проверяйте её. В форме аналогично не устанавливайте ТолькоПросмотр для этой роли.
Что делать, если после запрета перестал работать обмен данными?
Причина почти всегда в подписке на событие без проверки режима загрузки. Добавьте в начало обработчика выход при Источник.ОбменДанными.Загрузка = Истина, либо настройте в плане обмена отправку с признаком загрузки и перепроверьте журнал регистрации на ошибки записи.
Как временно снять запрет для исправления ошибки в закрытом периоде?
Для даты запрета редактирования добавьте пользователю индивидуальное исключение в настройках дат запрета, внесите исправление и удалите исключение. Для кодовых запретов выдайте временную роль-исключение и отзовите её после правки, зафиксировав действие в журнале.
Что важно запомнить
Интерфейсный запрет (ТолькоПросмотр формы и элементов) делает работу удобной, но не защищает данные. Надёжный запрет строится на правах доступа и серверных проверках в подписке ПередЗаписью. Проверяйте результат под учётной записью целевого пользователя и не забывайте про исключения для обменов и ответственных сотрудников.