Блокировка окна владельца в управляемой форме 1С
Содержание
Блокировать окно владельца в 1С — значит открыть форму так, чтобы пользователь не мог кликать по окну, из которого она вызвана, пока не закроет вызванную. Это не про права и не про роли. Это режим открытия окна: свойство формы или параметр метода ОткрытьФорму().
Путаница возникает из-за слова «блокировать». Закрыть пользователю доступ к данным можно ролями, а запретить работу с родительской формой на время диалога — именно режимом открытия. Дальше разберём оба случая, но начнём с главного.
Что значит «владелец» и зачем блокировать его окно
Владелец формы — та форма, из которой другую форму открыли. Например, из документа «Реализация» открывают подбор номенклатуры: документ — владелец, подбор — подчинённая форма.
Блокировка нужна, когда нельзя позволить пользователю продолжить работу с владельцем, пока диалог не закончен:
- 🧾 подтверждение действия, после которого меняются данные документа;
- ⚙️ ввод параметров перед запуском обработки или отчёта;
- 🔍 выбор значения, без которого владелец не может записаться;
- ❗ показ сообщения, которое нельзя пропустить.
Если же форма просто справочная (инструкция, список остатков «для взгляда»), блокировка мешает. Пользователь захочет сверить данные в документе и увидит «замороженное» окно.
Три режима открытия окна: чем они отличаются
У управляемой формы есть свойство «Режим открытия окна». В списке три значения.
| Режим | Что блокируется | Когда брать |
|---|---|---|
| Независимый | Ничего. Окно живёт само по себе | Справочные формы, списки, отчёты |
| Блокировать окно владельца | Только форма-владелец | Диалоги, подбор, ввод параметров |
| Блокировать весь интерфейс | Всё окно программы целиком | Критичные подтверждения, которые нельзя обойти |
Разница между вторым и третьим режимом простая. «Блокировать окно владельца» запирает одну форму, остальные вкладки и окна в программе продолжают работать. «Блокировать весь интерфейс» не оставляет пользователю ничего, кроме открытой формы.
Для обычных диалогов хватает блокировки владельца. Полная блокировка раздражает: человеку нужно свериться с другим окном, а он не может.
Какой режим выбрать
Как включить блокировку в конфигураторе
Режим можно задать один раз для формы, и он будет действовать всегда, когда форму открывают без явного указания режима.
- Откройте конфигуратор и найдите объект, которому принадлежит форма (справочник, документ, обработка).
- Раскройте ветку «Формы» и откройте нужную форму двойным щелчком.
- Откройте палитру свойств формы. Если её не видно, включите отображение через меню «Вид».
- Найдите свойство «Режим открытия окна» и выберите «Блокировать окно владельца».
- Сохраните конфигурацию и обновите базу данных (F7 в конфигураторе, затем перезапуск 1С:Предприятия).
Для формы расширения порядок тот же, но правки делаются в расширении, а не в основной конфигурации. Тогда обновление типовой конфигурации их не затрёт.
Свойство формы действует только для управляемых форм. В обычных формах (интерфейс до 8.2) за модальность отвечает другое свойство, и в современных конфигурациях на «Такси» вы с ним почти не столкнётесь.
Настройка в расширении конфигурации
Типовые конфигурации (Бухгалтерия предприятия, ЗУП, Управление торговлей) обновляются, и правка формы в основной конфигурации усложняет переход на новый релиз. Режим открытия окна у типовой формы лучше менять в расширении.
- Создайте расширение конфигурации и добавьте в него нужную форму через «Взять в расширение».
- В расширении поменяйте свойство формы «Режим открытия окна» или переопределите вызов через перехват процедуры, которая открывает форму.
- Загрузите расширение и обновите конфигурацию базы данных.
Расширения доступны начиная с платформы 8.3.6. Если ваша платформа новее, никаких отличий в логике режима окна нет: свойство и параметр метода работают одинаково.
Блокировка из кода: ОткрытьФорму с режимом окна
Если одна и та же форма открывается из разных мест и режим нужен не везде, задавайте его в вызове. Метод ОткрытьФорму() принимает режим открытия окна отдельным параметром, значения берутся из перечисления РежимОткрытияОкнаФормы.
&НаКлиенте
Процедура ПодобратьТовар(Команда)
ПараметрыФормы = Новый Структура("Склад", Объект.Склад);
ОткрытьФорму(
"Справочник.Номенклатура.Форма.ФормаПодбора",
ПараметрыФормы,
ЭтотОбъект,
,
,
,
,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
Обратите внимание на третий параметр. Это владелец формы. Если передать вместо него пусто, блокировать будет нечего: форма не связана с исходным окном, и режим «блокировать окно владельца» не сработает так, как вы ждёте.
Для режима «блокировать весь интерфейс» подставьте РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс. Независимый режим — РежимОткрытияОкнаФормы.Независимый.
Как узнать, что пользователь закрыл форму
Блокировка не приостанавливает код. Метод ОткрытьФорму() вернёт управление сразу, а выполнение продолжится дальше. Результат диалога нужно получать через описание оповещения:
&НаКлиенте
Процедура ПодобратьТовар(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодбора", ЭтотОбъект);
ОткрытьФорму(
"Справочник.Номенклатура.Форма.ФормаПодбора",
,
ЭтотОбъект,
,
,
,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодбора(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // форму закрыли без выбора
КонецЕсли;
// здесь обрабатываем выбранное значение
КонецПроцедуры
Процедура обработки результата должна быть экспортной, иначе оповещение не найдёт её. В форме подбора результат возвращается методом Закрыть(Значение).
Поведение платформы при блокировке
Несколько правил, которые экономят время на отладке.
- Закрытие владельца закрывает и подчинённые формы, которые были открыты с указанием владельца.
- Заблокированное окно остаётся на экране. Пользователь видит его, но нажатия игнорируются.
- Блокировка действует на клиенте. Серверный код и фоновые задания она не останавливает.
- Модальные вызовы вроде
Вопрос()иВвестиЗначение()в новых конфигурациях заменены асинхроннымиПоказатьВопрос()иПоказатьВводЗначения(). Использование модальных вызовов регулируется настройкой конфигурации «Режим использования модальности». Если она выключена, старые вызовы выдадут ошибку.
Не пытайтесь «имитировать» модальность циклом ожидания в клиентском коде. Интерфейс подвиснет, а пользователь решит, что 1С упала.
Ещё одна деталь: режим окна и способ открытия формы не связаны. Форму можно открыть командой на панели, из гиперссылки или программно, а блокировка всё равно будет определяться свойством формы или параметром вызова. Поэтому при отладке начинайте не с места, где нажали кнопку, а с места, где форма реально открывается.
Если одна и та же форма вызывается из десятка мест, не правьте каждый вызов. Задайте нужный режим свойством формы, а в исключительных вызовах переопределяйте параметром. Так конфигурацию проще сопровождать, и новый разработчик не гадает, почему в одном месте окно блокируется, а в другом нет.
Пример из практики: подтверждение перед проведением
Задача: перед проведением документа пользователь должен выбрать причину корректировки. Без выбора документ проводить нельзя.
Рабочая схема выглядит так:
- В документе создаётся команда или обработчик, который открывает небольшую форму с выбором причины.
- Форма открывается с владельцем
ЭтотОбъекти режимом блокировки окна владельца. - Пока форма открыта, документ «заморожен»: поля менять нельзя, провести его случайно тоже.
- После закрытия вызывается процедура оповещения. Если причина выбрана, она записывается в реквизит и проведение продолжается. Если пользователь закрыл форму крестиком, ничего не происходит.
Почему здесь не нужна блокировка всего интерфейса? Пользователь может захотеть заглянуть в соседний документ или отчёт и проверить, какую причину указывали в прошлый раз. Если окна заперты полностью, он закроет диалог, потеряет введённое и начнёт заново.
Что проверить перед тем, как включать блокировку
- 📌 Форма открывается с указанием владельца, а не «в никуда».
- 📌 Результат диалога обрабатывается в процедуре оповещения, а не после вызова метода.
- 📌 У диалога есть явная кнопка закрытия или отмены. Заблокированное окно без выхода превращается в ловушку.
- 📌 Текст на форме объясняет, зачем окно владельца недоступно.
Когда блокировать окно владельца не нужно
Не каждую форму стоит делать модальной. Есть случаи, где блокировка вредит.
- Длинные формы с таблицами и отчётами. Пользователь сверяет данные между окнами и мешает себе сам.
- Формы, которые остаются открытыми часами: монитор очереди, список заданий. Блокировка владельца превращает рабочее место в неподвижную картинку.
- Диалоги, открываемые автоматически при запуске. Человек ещё не понял, где находится, а окно уже заблокировано.
- Цепочки диалогов. Если форма А блокирует владельца и открывает форму Б с блокировкой, а та открывает В, пользователь теряется. Три уровня уже много.
Хорошее правило: блокировка нужна, когда у пользователя нет осмысленного действия в окне-владельце, пока диалог не закончен. Если такое действие есть, оставляйте независимый режим.
Не путать с ограничением доступа: роли и права
Иногда под «блокировкой» имеют в виду другое: чтобы пользователь вообще не мог открыть форму или нажать кнопку. Это решается не режимом окна, а настройкой прав.
- В конфигураторе откройте нужную роль в ветке «Общие» → «Роли».
- Для объекта снимите флажки права «Просмотр» или «Редактирование».
- Назначьте роль пользователю в списке пользователей и обновите конфигурацию.
Для интерфейса доступны ещё два приёма: скрыть кнопку по функциональной опции или сделать её недоступной программно через свойство Доступность элемента формы. Защитой от изменений это не считается. Реальное ограничение даёт только роль: свойство формы можно обойти, роль — нет.
Отдельная история — запретить заходить в базу целиком на время обслуживания. Это блокировка начала сеансов: в консоли администрирования серверов 1С откройте свойства информационной базы и включите блокировку сеансов, при желании указав сообщение для пользователей.
Включение блокировки не завершает уже открытые сеансы, а их принудительное завершение оборвёт работу людей. Предупредите пользователей заранее и выберите время вне рабочего дня.
Если блокировка не работает: диагностика
ОткрытьФорму(): в нём должна стоять форма-владелец, например ЭтотОбъект. Затем убедитесь, что восьмым параметром передан именно режим блокировки, а не пропущен запятыми. Посчитайте запятые в вызове.БлокироватьВесьИнтерфейс, либо обработчик где-то переопределяет режим. Найдите все вызовы формы поиском по конфигурации.Вопрос() и подобные вызовы на ПоказатьВопрос() с описанием оповещения.Экспорт и проверьте, что оповещение создано с тем же контекстом, в котором лежит процедура.