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