Блокировка окна владельца в управляемой форме 1С

· 8 мин

Содержание

Блокировать окно владельца в 1С — значит открыть форму так, чтобы пользователь не мог кликать по окну, из которого она вызвана, пока не закроет вызванную. Это не про права и не про роли. Это режим открытия окна: свойство формы или параметр метода ОткрытьФорму().

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

Что значит «владелец» и зачем блокировать его окно

Владелец формы — та форма, из которой другую форму открыли. Например, из документа «Реализация» открывают подбор номенклатуры: документ — владелец, подбор — подчинённая форма.

Блокировка нужна, когда нельзя позволить пользователю продолжить работу с владельцем, пока диалог не закончен:

  • 🧾 подтверждение действия, после которого меняются данные документа;
  • ⚙️ ввод параметров перед запуском обработки или отчёта;
  • 🔍 выбор значения, без которого владелец не может записаться;
  • ❗ показ сообщения, которое нельзя пропустить.

Если же форма просто справочная (инструкция, список остатков «для взгляда»), блокировка мешает. Пользователь захочет сверить данные в документе и увидит «замороженное» окно.

Три режима открытия окна: чем они отличаются

У управляемой формы есть свойство «Режим открытия окна». В списке три значения.

РежимЧто блокируетсяКогда брать
НезависимыйНичего. Окно живёт само по себеСправочные формы, списки, отчёты
Блокировать окно владельцаТолько форма-владелецДиалоги, подбор, ввод параметров
Блокировать весь интерфейсВсё окно программы целикомКритичные подтверждения, которые нельзя обойти

Разница между вторым и третьим режимом простая. «Блокировать окно владельца» запирает одну форму, остальные вкладки и окна в программе продолжают работать. «Блокировать весь интерфейс» не оставляет пользователю ничего, кроме открытой формы.

Для обычных диалогов хватает блокировки владельца. Полная блокировка раздражает: человеку нужно свериться с другим окном, а он не может.

Какой режим выбрать

Какой режим открытия окна подходит?

Как включить блокировку в конфигураторе

Режим можно задать один раз для формы, и он будет действовать всегда, когда форму открывают без явного указания режима.

  1. Откройте конфигуратор и найдите объект, которому принадлежит форма (справочник, документ, обработка).
  2. Раскройте ветку «Формы» и откройте нужную форму двойным щелчком.
  3. Откройте палитру свойств формы. Если её не видно, включите отображение через меню «Вид».
  4. Найдите свойство «Режим открытия окна» и выберите «Блокировать окно владельца».
  5. Сохраните конфигурацию и обновите базу данных (F7 в конфигураторе, затем перезапуск 1С:Предприятия).

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

Свойство формы действует только для управляемых форм. В обычных формах (интерфейс до 8.2) за модальность отвечает другое свойство, и в современных конфигурациях на «Такси» вы с ним почти не столкнётесь.

Настройка в расширении конфигурации

Типовые конфигурации (Бухгалтерия предприятия, ЗУП, Управление торговлей) обновляются, и правка формы в основной конфигурации усложняет переход на новый релиз. Режим открытия окна у типовой формы лучше менять в расширении.

  1. Создайте расширение конфигурации и добавьте в него нужную форму через «Взять в расширение».
  2. В расширении поменяйте свойство формы «Режим открытия окна» или переопределите вызов через перехват процедуры, которая открывает форму.
  3. Загрузите расширение и обновите конфигурацию базы данных.

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

Блокировка из кода: ОткрытьФорму с режимом окна

Если одна и та же форма открывается из разных мест и режим нужен не везде, задавайте его в вызове. Метод ОткрытьФорму() принимает режим открытия окна отдельным параметром, значения берутся из перечисления РежимОткрытияОкнаФормы.

&НаКлиенте
Процедура ПодобратьТовар(Команда)

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

	ОткрытьФорму(
		"Справочник.Номенклатура.Форма.ФормаПодбора",
		ПараметрыФормы,
		ЭтотОбъект,
		,
		,
		,
		,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

Обратите внимание на третий параметр. Это владелец формы. Если передать вместо него пусто, блокировать будет нечего: форма не связана с исходным окном, и режим «блокировать окно владельца» не сработает так, как вы ждёте.

Для режима «блокировать весь интерфейс» подставьте РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс. Независимый режим — РежимОткрытияОкнаФормы.Независимый.

Как узнать, что пользователь закрыл форму

Блокировка не приостанавливает код. Метод ОткрытьФорму() вернёт управление сразу, а выполнение продолжится дальше. Результат диалога нужно получать через описание оповещения:

&НаКлиенте
Процедура ПодобратьТовар(Команда)

	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодбора", ЭтотОбъект);

	ОткрытьФорму(
		"Справочник.Номенклатура.Форма.ФормаПодбора",
		,
		ЭтотОбъект,
		,
		,
		,
		ОписаниеОповещения,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте
Процедура ПослеПодбора(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат; // форму закрыли без выбора
	КонецЕсли;

	// здесь обрабатываем выбранное значение

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

Процедура обработки результата должна быть экспортной, иначе оповещение не найдёт её. В форме подбора результат возвращается методом Закрыть(Значение).

Поведение платформы при блокировке

Несколько правил, которые экономят время на отладке.

  • Закрытие владельца закрывает и подчинённые формы, которые были открыты с указанием владельца.
  • Заблокированное окно остаётся на экране. Пользователь видит его, но нажатия игнорируются.
  • Блокировка действует на клиенте. Серверный код и фоновые задания она не останавливает.
  • Модальные вызовы вроде Вопрос() и ВвестиЗначение() в новых конфигурациях заменены асинхронными ПоказатьВопрос() и ПоказатьВводЗначения(). Использование модальных вызовов регулируется настройкой конфигурации «Режим использования модальности». Если она выключена, старые вызовы выдадут ошибку.

Не пытайтесь «имитировать» модальность циклом ожидания в клиентском коде. Интерфейс подвиснет, а пользователь решит, что 1С упала.

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

Если одна и та же форма вызывается из десятка мест, не правьте каждый вызов. Задайте нужный режим свойством формы, а в исключительных вызовах переопределяйте параметром. Так конфигурацию проще сопровождать, и новый разработчик не гадает, почему в одном месте окно блокируется, а в другом нет.

Пример из практики: подтверждение перед проведением

Задача: перед проведением документа пользователь должен выбрать причину корректировки. Без выбора документ проводить нельзя.

Рабочая схема выглядит так:

  1. В документе создаётся команда или обработчик, который открывает небольшую форму с выбором причины.
  2. Форма открывается с владельцем ЭтотОбъект и режимом блокировки окна владельца.
  3. Пока форма открыта, документ «заморожен»: поля менять нельзя, провести его случайно тоже.
  4. После закрытия вызывается процедура оповещения. Если причина выбрана, она записывается в реквизит и проведение продолжается. Если пользователь закрыл форму крестиком, ничего не происходит.

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

Что проверить перед тем, как включать блокировку

  • 📌 Форма открывается с указанием владельца, а не «в никуда».
  • 📌 Результат диалога обрабатывается в процедуре оповещения, а не после вызова метода.
  • 📌 У диалога есть явная кнопка закрытия или отмены. Заблокированное окно без выхода превращается в ловушку.
  • 📌 Текст на форме объясняет, зачем окно владельца недоступно.

Когда блокировать окно владельца не нужно

Не каждую форму стоит делать модальной. Есть случаи, где блокировка вредит.

  • Длинные формы с таблицами и отчётами. Пользователь сверяет данные между окнами и мешает себе сам.
  • Формы, которые остаются открытыми часами: монитор очереди, список заданий. Блокировка владельца превращает рабочее место в неподвижную картинку.
  • Диалоги, открываемые автоматически при запуске. Человек ещё не понял, где находится, а окно уже заблокировано.
  • Цепочки диалогов. Если форма А блокирует владельца и открывает форму Б с блокировкой, а та открывает В, пользователь теряется. Три уровня уже много.

Хорошее правило: блокировка нужна, когда у пользователя нет осмысленного действия в окне-владельце, пока диалог не закончен. Если такое действие есть, оставляйте независимый режим.

Не путать с ограничением доступа: роли и права

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

  1. В конфигураторе откройте нужную роль в ветке «Общие» → «Роли».
  2. Для объекта снимите флажки права «Просмотр» или «Редактирование».
  3. Назначьте роль пользователю в списке пользователей и обновите конфигурацию.

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

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

Включение блокировки не завершает уже открытые сеансы, а их принудительное завершение оборвёт работу людей. Предупредите пользователей заранее и выберите время вне рабочего дня.

Если блокировка не работает: диагностика

Диагностика: выберите симптом

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

Блокировка окна владельца защищает данные от изменений?
Нет. Она только мешает кликать по родительскому окну на время диалога. От изменений защищают роли и права.
Можно ли заблокировать окно владельца в обычной форме?
В обычных формах работает другая модель модальности. Для управляемого приложения используйте свойство «Режим открытия окна».
Сработает ли режим, если форму открыли из списка или командой меню?
Да, если у формы выставлено свойство, оно применяется всегда, когда режим не указан явно в вызове. Явный режим в вызове задаёт поведение для конкретного случая.
Чем отличается блокировка окна владельца от блокировки сеансов?
Первая действует на одну форму одного пользователя. Вторая запрещает новым пользователям заходить в информационную базу целиком.
Нужно ли переписывать код, если снять блокировку?
Нет. Достаточно сменить режим в свойстве формы или в параметре вызова. Логика получения результата через оповещение работает в любом режиме.