При разработке в крупных конфигурациях, таких как 1С:ERP Управление предприятием 2.5, часто возникает задача ограничить действия пользователя сразу после входа в систему. Например, это может быть требование заполнить важные личные данные, ознакомиться с приказом или пройти опрос. Для реализации такой логики необходимо, чтобы форма открывалась в режиме, который не позволяет пользователю переключиться на другие окна или функции системы до выполнения определенных действий. Разберем подробно, как это сделать правильно, избежав конфликтов со стандартными механизмами БСП (Библиотеки стандартных подсистем).
Основная сложность заключается в том, что в современных конфигурациях процесс запуска — это сложная цепочка событий. Если просто вставить код открытия формы в начало процедуры запуска, мы можем столкнуться с ситуацией, когда системные окна (например, ввод пароля для интеграции с документооборотом, сообщения об обновлении версии или рекламные баннеры) перекроют нашу форму или возникнет конфликт прав доступа. Выясним причину, по которой стандартный подход автора темы не сработал. Чаще всего это связано с тем, что система еще не завершила инициализацию параметров сеанса или параметров работы клиента.
Для корректной работы мы будем использовать механизм расширений. Это позволит нам не снимать основную конфигурацию с поддержки и сохранить чистоту кода. Нам потребуется расширить модуль управляемого приложения.
Рассмотрим процедуру ПриНачалеРаботыСистемы. В расширении нам следует использовать аннотацию &После (&After), чтобы наш код выполнялся тогда, когда основные системные механизмы уже отработали. Проанализируем пример кода, который позволит нам вызвать нашу форму:
&После("ПриНачалеРаботыСистемы")
Процедура ИмяПрефикс_ПриНачалеРаботыСистемы()
// Проверяем наличие роли у текущего пользователя
Если РольДоступна("ИмяВашейРоли") Тогда
// Важно: проверяем, не находится ли система в режиме обновления
Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().НеобходимоЗавершитьРаботуСистемы Тогда
Возврат;
КонецЕсли;
// Параметры открытия формы
ПараметрыФормы = Новый Структура;
// Открытие формы в режиме блокировки всего интерфейса
ОткрытьФорму("Обработка.ИмяВашейОбработки.Форма.ФормаЭкран",
ПараметрыФормы,
,
,
ВариантОткрытияОкна.ОтдельноеОкно,
,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецЕсли;
КонецПроцедуры
Если при запуске 1С:ERP открываются другие окна (например, ввод пароля в 1С:Документооборот), ваша форма может "потеряться" или не открыться вовсе из-за того, что интерфейс уже занят другим модальным процессом. Посмотрим на решение через ПодключитьОбработчикОжидания. Этот метод позволяет немного "отложить" запуск нашей формы, давая системе завершить все фоновые и стартовые процессы.
В процедуре ПриНачалеРаботыСистемы вместо прямого вызова ОткрытьФорму выполним следующую команду:
ПодключитьОбработчикОжидания("ИмяПрефикс_ОткрытьБлокирующееОкно", 0.1, Истина);
Затем в этом же модуле опишем саму процедуру открытия:
&НаКлиенте
Процедура ИмяПрефикс_ОткрытьБлокирующееОкно() Экспорт
// Проверка условий (роли, параметры)
Если НЕ РольДоступна("ИмяРасширения_НужнаяРоль") Тогда
Возврат;
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.НастройкаОтправкиSMS", , , , ВариантОткрытияОкна.ОтдельноеОкно, , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
Разберем ситуацию, упомянутую в обсуждении: база открывается для выполнения обработчиков обновления. Если в этот момент принудительно открыть форму с режимом БлокироватьВесьИнтерфейс, процесс обновления может зависнуть, так как модальное окно заблокирует выполнение скриптов или не даст системе корректно завершить сеанс обновления.
Важный момент: всегда используйте проверку НеобходимоЗавершитьРаботуСистемы. В конфигурациях на базе БСП это стандартный флаг, который сообщает, что пользователю сейчас не разрешена работа в обычном режиме. Также полезно проверить параметр ЭтоПервыйЗапускПослеОбновления, если ваша логика не должна мешать работе администратора.
Часто программисты забывают, что если роль или обработка добавлены в расширение, то и права на них должны быть четко прописаны внутри этого же расширения. Проанализируем ситуацию: если роль ИмяВашейРоли создана в основной конфигурации, а вы проверяете её в коде расширения — это сработает. Однако, если вы создали новую роль внутри расширения, обязательно убедитесь, что:
Тонкого клиента и на чтение/просмотр вашей Обработки.РольДоступна(), и роль находится в расширении, необходимо учитывать префикс, если он был назначен при создании расширения.Для успешной реализации блокирующего окна в 1С:ERP 2.5 необходимо:
ПриНачалеРаботыСистемы в расширении с аннотацией &После.ПодключитьОбработчикОжидания для предотвращения конфликтов с другими стартовыми окнами (например, окнами 1С:Документооборот).РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс.СтандартныеПодсистемыКлиент, чтобы не заблокировать процесс технического обслуживания или обновления конфигурации.Соблюдение этих правил гарантирует, что ваше решение будет работать стабильно, не вызывая "зависаний" системы у пользователей и администраторов.