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