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

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

Как заблокировать форму 1С

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

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

Каждый вариант реализуется по-своему: одни настройки выполняются в конфигураторе без программирования, другие требуют нескольких строк кода в модуле формы, третьи — настройки прав доступа в пользовательском режиме. Ниже разобраны основные сценарии с конкретными действиями для платформы 1С:Предприятие 8.3.

Определяем, какая именно блокировка нужна

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

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

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

Как выбрать действие

Пользователь не должен изменять документ, но может его видетьОткройте форму с параметром ТолькоПросмотр или установите свойство в коде
Пользователь не должен открывать объект вовсеНастройте роли и права доступа, при необходимости RLS
Нужно запретить действия на форме на время операцииИспользуйте БлокироватьОкноВладельца или отключите элементы формы
Нужно защитить объект от одновременного редактированияИспользуйте объектную блокировку ЗаблокироватьДанныеДляРедактирования

Блокировка формы в режиме «только просмотр»

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

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

// В модуле формы

&НаСервере

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

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

ТолькоПросмотр = Истина;

КонецЕсли;

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

// При открытии формы извне

ПараметрыФормы = Новый Структура("ТолькоПросмотр", Истина);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);

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

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

Если блокировать всю форму не нужно, можно отключить конкретные поля и кнопки. Для этого у элементов формы используются свойства Доступность и ТолькоПросмотр. Разница между ними: недоступный элемент нельзя ни редактировать, ни интерактивно использовать (например, скопировать значение), а элемент в режиме только для чтения позволяет выделять и копировать содержимое.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Элементы.Комментарий.ТолькоПросмотр = Истина;

Элементы.КнопкаПровести.Доступность = Ложь;

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

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

Для Каждого Элемент Из Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

Элемент.Доступность = Ложь;

КонецЕсли;

КонецЦикла;

Типичные ошибки
01
Отключают элементы перед длительной операцией, но не возвращают доступность при ошибке — форма остаётся заблокированной до переоткрытия
02
Блокируют только кнопку проведения, забывая про клавиши быстрого доступа и команду в меню Ещё — пользователь обходит ограничение
03
Путают Доступность и ТолькоПросмотр: при Доступность = Ложь нельзя даже скопировать значение поля, что мешает пользователям

Блокировка окна на время выполнения операции

Когда выполняется длительная операция — обмен данными, печать большого пакета, обработка табличной части — пользователь может успеть нажать кнопки повторно и вызвать конфликт. Чтобы этого избежать, форму блокируют на время выполнения. Для модальных вызовов (вопросы, предупреждения, открытие подчинённой формы) используется параметр БлокироватьОкноВладельца в методах ПоказатьВопрос, ОткрытьФормуМодально и аналогах.

// Открываем форму обработки, блокируя текущую

ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);

ОткрытьФорму("Обработка.ЗагрузкаДанных.Форма", ПараметрыФормы, ЭтотОбъект,

, , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Для длительных серверных операций в управляемом приложении принят другой подход: запуск фонового задания с отображением индикатора. Пока задание выполняется, кнопку запуска отключают, а по завершении через ОжидатьЗавершение (или обработчик ожидания) возвращают интерфейс в исходное состояние. Это современная альтернатива устаревшему методу БлокироватьОкноВладельца как способа «заморозить» форму.

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

Блокировка доступа через права и роли

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

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

Для более тонкой блокировки — например, пользователь видит документы только своего подразделения — применяется механизм RLS (ограничение доступа на уровне записей). Шаблоны ограничений задаются в роли на закладке «Шаблоны ограничений». В типовых конфигурациях на управляемых формах (Бухгалтерия, ЗУП, Управление торговлей) настройка доступа обычно выполняется через группы доступа и профили в разделе администрирования, без изменения конфигурации.

Защита объекта от одновременного редактирования

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

Для сценариев, где требуется явно «захватить» объект на время редактирования, используется метод ЗаблокироватьДанныеДляРедактирования. Пока блокировка удерживается, другой сеанс при попытке редактирования получит сообщение, что объект заблокирован, с указанием пользователя и компьютера, установившего блокировку.

&НаСервере

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

Попытка

ЗаблокироватьДанныеДляРедактирования(Объект.Ссылка, , УникальныйИдентификатор);

Исключение

Сообщить("Объект редактируется другим пользователем");

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

КонецПопытки;

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

Такая блокировка автоматически снимается при закрытии формы или завершении сеанса. Управлять всеми блокировками в базе можно через консоль кластера серверов 1С (для клиент-серверного варианта) или через типовые обработки мониторинга: там видно, кто и что заблокировал, и при необходимости сеанс можно завершить принудительно.

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

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

Откройте форму под целевым пользователем
Норма

Поля недоступны для ввода или объект не открывается с сообщением о нарушении прав

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

Пользователь по-прежнему может изменить и записать объект

Попробуйте записать объект из другого сеанса
Норма

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

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

Запись проходит, конфликт не фиксируется

Проверьте обходные пути: отчёт, внешняя обработка, подбор
Норма

Доступ закрыт на уровне прав во всех сценариях

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

Через другую форму объект доступен для изменения

Проверка результата и частые ограничения

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

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

Итог

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

Блокировка формы — это набор разных механизмов: ТолькоПросмотр для запрета изменений, отключение элементов для управления интерфейсом, блокировка окна для длительных операций, роли и RLS для реальной защиты данных, ЗаблокироватьДанныеДляРедактирования — от конфликтов сеансов. Выбирайте механизм под задачу и проверяйте результат под тестовым пользователем.

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

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

В обработчике ПриСозданииНаСервере проверьте свойство Проведен объекта и установите ТолькоПросмотр = Истина. Для надёжности продублируйте контроль в подписке на событие записи, чтобы изменить документ нельзя было и программно.

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

Чаще всего у пользователя осталась другая роль, дающая те же права — права в 1С складываются по принципу «разрешено, если разрешено хотя бы одной ролью». Проверьте полный список ролей пользователя и перезапустите его сеанс после изменений.

Как снять «зависшую» блокировку объекта?

Блокировка снимается автоматически при завершении сеанса, который её установил. Если сеанс завис, администратор завершает его через консоль кластера серверов 1С или через функции мониторинга сеансов в типовой конфигурации.

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

Да, частично. Ограничение доступа настраивается через профили и группы доступа в типовых конфигурациях без доработок. Режимы «ТолькоПросмотр» и блокировка элементов требуют изменения кода формы, то есть доработки конфигурации или расширения.

Чем расширение конфигурации лучше прямой доработки для блокировки формы?

Расширение не изменяет основную конфигурацию, поэтому обновления типового релиза проходят без снятия с поддержки и слияния изменений. Для блокировки формы в расширении добавляют заимствованную форму и переопределяют нужные обработчики.

Блокирует ли платформа форму при работе двух пользователей автоматически?

Форму — нет, оба пользователя могут открыть один объект одновременно. Но при записи сработает контроль версий: тот, кто сохраняет вторым, получит ошибку о конфликте и должен будет перечитать данные. Явную блокировку формы при открытии нужно программировать через ЗаблокироватьДанныеДляРедактирования.