Разработка и Конфигурация · 10 мин
Модуль управляемого приложения в 1С: назначение, события и примеры
Что такое модуль управляемого приложения в 1С, какие события он содержит, чем отличается от обычного модуля и как правильно писать в нём код.
Модуль управляемого приложения — это глобальный программный модуль конфигурации 1С, который выполняется на клиенте при работе в режиме управляемого приложения. Он хранит процедуры и функции, доступные во всём клиентском контексте, а также обработчики событий жизненного цикла приложения: запуск, завершение, обработка ошибок и внешних событий.
Этот модуль появляется в конфигурации автоматически, когда у конфигурации включён режим запуска «Управляемое приложение» или «Управляемое приложение и обычное приложение». Если режим запуска — только «Обычное приложение», вместо него используется модуль обычного приложения, и их логика не взаимозаменяема.
Основная задача модуля — инициализация клиентского сеанса: проверка условий запуска, открытие начальных форм, подключение оборудования, обработка нажатий на оповещения. Вся логика, размещённая здесь, исполняется исключительно на стороне клиента, поэтому обращения к базе данных напрямую из него недоступны.
Где находится модуль и как его открыть
Модуль управляемого приложения открывается в конфигураторе через дерево объектов конфигурации. Щёлкните правой кнопкой по корневому узлу «Конфигурация» и выберите пункт «Открыть модуль управляемого приложения». Если пункт неактивен, проверьте свойство конфигурации «Режим использования модальности» и «Основной режим запуска» — управляемый режим должен быть включён.
Физически текст модуля хранится в составе конфигурации и выгружается вместе с ней. При поставке конфигурации модуль может быть закрыт паролем — типичная ситуация для типовых решений, где исходный код защищён поставщиком.
Какие события обрабатывает модуль
Модуль содержит предопределённые обработчики событий жизненного цикла клиентского приложения. Платформа вызывает их автоматически, разработчику нужно лишь дописать тело процедуры.
- ПередНачаломРаботыСистемы — выполняется до открытия главного окна. Здесь уместны проверки условий запуска, подключение внешних компонент, запрос подтверждения у пользователя. Параметр «Отказ» позволяет прервать запуск.
- ПриНачалеРаботыСистемы — вызывается после открытия главного окна. Используется для открытия начальных форм, подключения обработчиков ожидания, показа оповещений.
- ПередЗавершениемРаботыСистемы — позволяет запросить подтверждение выхода и отменить завершение через параметр «Отказ».
- ПриЗавершенииРаботыСистемы — финальное событие, отменить выход из него нельзя.
- ОбработкаВнешнегоСобытия — реакция на события внешнего оборудования, например сканера штрихкодов.
- ОбработкаПолученияФормыВыбораПользователейИБ и другие вспомогательные обработчики.
Порядок вызова строго фиксирован платформой: сначала «ПередНачаломРаботыСистемы», затем «ПриНачалеРаботыСистемы». Если в первом обработчике установить Отказ = Истина, второй не выполнится и сеанс завершится.
Процедура ПередНачаломРаботыСистемы(Отказ)
Если НЕ СерверныеФункции.ЗапускРазрешен() Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикОжидания("ПроверитьНовыеСообщения", 300);
КонецПроцедурыЧем отличается от модуля обычного приложения и общих модулей
Модуль обычного приложения выполняется в толстом клиенте обычного режима и имеет доступ к интерфейсным возможностям старого интерфейса (панели, рабочий стол). Модуль управляемого приложения работает в тонком, веб- и толстом клиенте управляемого режима, но не может управлять старым интерфейсом.
Общие модули, в отличие от модуля приложения, не содержат предопределённых событий жизненного цикла сеанса. Они служат библиотеками процедур и функций. Глобальные общие модули с флагом «Клиент (управляемое приложение)» близки по контексту исполнения, но не вызываются платформой автоматически.
| Модуль | Контекст исполнения | События запуска | Когда использовать |
|---|---|---|---|
| Управляемого приложения | Клиент (управляемый режим) | Да | Инициализация сеанса, глобальные клиентские обработчики |
| Обычного приложения | Толстый клиент, обычный режим | Да | Устаревшие решения на обычных формах |
| Общий модуль | Задаётся флагами | Нет | Переиспользуемая бизнес-логика |
| Модуль сеанса | Только сервер | УстановкаПараметровСеанса | Инициализация параметров сеанса, права |
Какие директивы компиляции применимы
Все процедуры и функции модуля управляемого приложения по умолчанию компилируются в клиентском контексте. Явно указывать директивы можно только для клиентских контекстов: &НаКлиенте. Директивы &НаСервере в этом модуле недопустимы — попытка их использовать приведёт к ошибке компиляции.
Если из клиентского обработчика нужно обратиться к данным базы, вызовите серверную процедуру общего модуля с флагом «Сервер» или «Вызов сервера». Прямой запрос к данным из модуля приложения невозможен — платформа выдаст ошибку о недоступности контекста.
Практические сценарии использования
Проверка условий перед запуском
Типовая задача — запретить запуск, если не выполнено условие: устарела версия платформы, отсутствует лицензия на расширение, не заполнены обязательные настройки. Логика размещается в «ПередНачаломРаботыСистемы», а при невыполнении условия пользователю показывается предупреждение и устанавливается Отказ = Истина.
Открытие рабочего стола или начальной страницы
Если после входа нужно открыть конкретную форму — например, рабочее место кассира, — это делается в «ПриНачалеРаботыСистемы» через ОткрытьФорму(). Учтите, что форма откроется поверх стандартной начальной страницы; при необходимости начальную страницу настраивают в свойствах конфигурации или через настройки пользователя.
Подключение обработчиков ожидания
Для периодических клиентских задач — проверка новых сообщений, обновление курсов, напоминания — в «ПриНачалеРаботыСистемы» подключают обработчик ожидания с интервалом в секундах. Слишком маленький интервал (меньше нескольких секунд) перегружает клиентский сеанс и сервер вызовами.
- 1Откройте конфигуратор и найдите модуль управляемого приложения через контекстное меню корня конфигурации
- 2Добавьте процедуру ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы с нужной логикой
- 3Если нужны данные базы — создайте серверный общий модуль и вызывайте его из обработчика
- 4Обновите конфигурацию базы данных (F7) и запустите сеанс в режиме предприятия
- 5Проверьте поведение: формы открываются, проверки срабатывают, ошибок в журнале регистрации нет
Ограничения и риски при работе с модулем
Модуль управляемого приложения компилируется при каждом запуске клиента, поэтому его объём влияет на скорость старта. Не размещайте здесь сотни строк бизнес-логики — выносите её в общие модули, оставляя в модуле приложения только обработчики событий и короткие вызовы.
Изменение модуля в типовой конфигурации на поддержке приведёт к проблемам при обновлении: платформа потребует снять объект с поддержки или потеряет ваши правки. Правильный путь — использовать расширения конфигурации, где события запуска доступны через аннотации &Перед, &После и &Вместо.
Как проверить, что код работает корректно
После изменений обновите конфигурацию базы данных и запустите сеанс под тестовым пользователем. Проверьте: приложение стартует без ошибок, ожидаемые формы открываются, обработчики ожидания срабатывают с заданным интервалом. Ошибки времени выполнения фиксируются в журнале регистрации и в окне сообщений.
Для отладки поставьте точку останова в обработчике и запустите отладку клиентского приложения из конфигуратора (Отладка → Начать отладку). Убедитесь, что в настройках отладки включён нужный тип клиента — тонкий, толстый или веб-клиент.
Как проверить результат
Приложение открывается за обычное время, сообщений об ошибках нет
Ошибка компиляции модуля или аварийное завершение при старте
Процедура вызывается с заданным интервалом, видно по отладке
Обработчик не вызывается или срабатывает ежесекундно из-за неверного интервала
При нарушении условия сеанс не начинается, пользователь видит понятное сообщение
Сеанс блокируется молча или, наоборот, запускается при нарушенном условии
Часто задаваемые вопросы
Можно ли в модуле управляемого приложения выполнить запрос к базе данных?
Нет, модуль исполняется только на клиенте, где прямой доступ к данным запрещён. Создайте общий модуль с флагом «Сервер» и «Вызов сервера», поместите запрос туда и вызывайте серверную функцию из клиентского обработчика.
Чем модуль управляемого приложения отличается от модуля сеанса?
Модуль сеанса работает на сервере и содержит событие УстановкаПараметровСеанса — оно вызывается раньше всех клиентских событий. Модуль управляемого приложения работает на клиенте и отвечает за интерфейсную инициализацию: формы, оповещения, обработчики ожидания.
Почему обработчик ПриНачалеРаботыСистемы не вызывается?
Чаще всего в ПередНачаломРаботыСистемы установлен Отказ = Истина, и сеанс прерывается до вызова следующего события. Также проверьте, что конфигурация базы данных обновлена, а режим запуска соответствует управляемому приложению.
Как изменить поведение запуска в типовой конфигурации без снятия с поддержки?
Используйте расширение конфигурации: в его модуле управляемого приложения можно расширить обработчики событий аннотациями &Перед, &После и &Вместо. Основная конфигурация остаётся на поддержке, а ваши доработки хранятся отдельно.
Влияет ли размер модуля на скорость запуска программы?
Да. Модуль компилируется при каждом старте клиентского сеанса, поэтому большой объём кода замедляет запуск. Держите в модуле только обработчики событий и краткие вызовы, а основную логику размещайте в общих модулях.
Что важно запомнить
Модуль управляемого приложения — клиентский глобальный модуль с событиями запуска и завершения сеанса. Код в нём исполняется только на клиенте, поэтому доступ к данным базы организуется через серверные общие модули. Держите модуль компактным, тестируйте изменения на копии и используйте расширения для доработки типовых конфигураций.