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