При разработке информационных систем на платформе 1С:Предприятие часто возникает необходимость выполнить определенные действия или показать пользователю важную информацию сразу после запуска приложения. Одной из таких задач является автоматическое открытие формы, например, для дополнительной авторизации, выбора параметров работы или отображения стартового меню. В этой статье мы подробно разберем, как реализовать открытие формы при старте системы, а также как настроить ее внешний вид, скрывая стандартные элементы управления и предотвращая нежелательное закрытие.
Для того чтобы открыть форму сразу при запуске приложения, мы используем специальную процедуру платформы 1С, которая выполняется в самом начале работы системы. Эта процедура называется ПриНачалеРаботыСистемы() и располагается в модуле управляемого приложения.
ПриНачалеРаботыСистемы(): Внутри этого модуля создайте или дополните процедуру ПриНачалеРаботыСистемы(). Эта процедура автоматически вызывается платформой один раз при каждом новом сеансе пользователя.ОткрытьФорму(): Для непосредственного открытия формы мы воспользуемся глобальной функцией ОткрытьФорму(). Эта функция принимает в качестве основного параметра строковое имя открываемой формы. Важно, чтобы форма была частью вашей конфигурации. Если вы используете внешнюю обработку, ее сначала необходимо добавить в конфигурацию или загрузить программно.Рассмотрим пример кода:
Процедура ПриНачалеРаботыСистемы()
// Пример открытия формы обработки, расположенной в вашей конфигурации.
// Обработка называется "ИмяНашейОбработки", а форма внутри нее - "Форма".
// Убедитесь, что такая обработка и форма существуют.
ОткрытьФорму("Обработка.ИмяНашейОбработки.Форма");
// Если вам нужно открыть форму справочника, документа и т.д., синтаксис будет аналогичным:
// ОткрытьФорму("Справочник.Пользователи.Форма.ФормаЭлемента");
КонецПроцедуры
Важный момент: Мы используем ОткрытьФорму(), которая является предпочтительным способом открытия форм в управляемом приложении. Существует также функция ПолучитьФорму(), которая возвращает объект формы, и затем вы можете вызвать метод Открыть() у этого объекта. Однако, ОткрытьФорму() более гибка для передачи параметров и часто используется для "быстрого" открытия. Для автоматического открытия нужных окон и ссылок без изменения конфигурации можно использовать инструмент для автоматического открытия окон при запуске 1С.
Часто форма, открываемая при старте, требует от пользователя ввода данных, например, пароля или выбора какого-либо значения. После ввода данных необходимо получить результат обратно в вызывающий модуль (в нашем случае, в модуль управляемого приложения). Мы разберем, как это сделать без использования устаревших модальных окон.
В ранних версиях 1С:Предприятия (до 8.3.3) для получения ответа от формы часто использовался метод ОткрытьФормуМодально(), который блокировал весь интерфейс до закрытия формы. Однако, в управляемом приложении, особенно при работе в тонком или веб-клиенте, использование модальных окон является нежелательной практикой и может быть недоступно (например, при РежимИспользованияМодальности = НеИспользовать). Современный подход заключается в немодальном открытии форм и использовании объекта ОписаниеОповещения для асинхронной обработки результата.
Разберем по шагам, как получить ответ от немодально открытой формы:
ОписаниеОповещения: При вызове ОткрытьФорму() мы передадим ей объект ОписаниеОповещения. Этот объект содержит информацию о процедуре, которую нужно вызвать после закрытия открываемой формы, и о том, какой контекст передать в эту процедуру.Пример кода в Модуле управляемого приложения:
// В Модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
// 1. Создаем ОписаниеОповещения.
// Первый параметр - имя процедуры-обработчика, которая будет вызвана после закрытия формы.
// Второй параметр (необязательный) - это объект, в контексте которого будет вызван обработчик.
// Если обработчик находится в этом же модуле, можно указать "ЭтотОбъект".
Перем ОписаниеЗавершенияРаботы;
ОписаниеЗавершенияРаботы = Новый ОписаниеОповещения("ОбработчикЗавершенияСтартовойФормы", ЭтотОбъект);
// 2. Открываем нашу стартовую форму, передавая ОписаниеОповещения.
// Также мы можем передать параметры в форму, например, чтобы форма знала,
// какой вопрос задавать или какие данные предварительно заполнить.
Перем ПараметрыФормы;
ПараметрыФормы = Новый Структура("КлючПараметра", "НеобходимостьАвторизации");
ОткрытьФорму("Обработка.ИмяНашейОбработки.Форма", ПараметрыФормы, , , , , ОписаниеЗавершенияРаботы);
КонецПроцедуры
// Процедура-обработчик, которая будет вызвана после закрытия стартовой формы.
// Результат - это то, что форма вернула через ОповеститьОВыборе().
// ДополнительныеПараметры - это контекст, который мы передали в ОписаниеОповещения.
Процедура ОбработчикЗавершенияСтартовойФормы(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
// Пользователь закрыл форму без выбора или отменил действие.
// Возможно, нужно завершить работу системы, если авторизация обязательна.
ЗавершитьРаботуСистемы();
Возврат;
КонецЕсли;
// Здесь мы обрабатываем результат, полученный от формы.
// Например, если форма вернула пароль или выбранного менеджера:
Если ТипЗнч(Результат) = Тип("Структура") Тогда
// Результат может быть структурой с различными данными.
Если Результат.Свойство("АвторизованныйМенеджер") Тогда
// Например, устанавливаем параметр сеанса
// УстановитьПараметрСеанса("ТекущийМенеджер", Результат.АвторизованныйМенеджер);
Сообщить("Менеджер авторизован: " + Результат.АвторизованныйМенеджер);
// Далее можно продолжить работу системы
КонецЕсли;
Иначе
Сообщить("Форма вернула: " + Результат);
КонецЕсли;
КонецПроцедуры
При открытии формы часто требуется передать ей начальные данные. Это делается с помощью параметра ПараметрыФормы, который является структурой. В этой структуре могут быть как системные, так и пользовательские параметры.
ПриСозданииНаСервере(). Эта процедура вызывается один раз при создании экземпляра формы на сервере.Пример кода в модуле формы "Обработка.ИмяНашейОбработки.Форма":
// В модуле формы "Обработка.ИмяНашейОбработки.Форма"
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Параметры, переданные при открытии формы, доступны через свойство "Параметры".
// Мы можем прочитать их и использовать для инициализации элементов формы.
Если Параметры.Свойство("КлючПараметра") Тогда
Перем ЗначениеПараметра;
Параметры.Получить("КлючПараметра", ЗначениеПараметра);
Сообщить("Форма открыта с параметром: " + ЗначениеПараметра);
// Например, если форма ожидает пароль, мы можем заполнить поле с вопросом
// и ждать ввода.
Элементы.ПолеВводаПароля.Видимость = Истина;
// или Элементы.ПолеВопроса.Заголовок = "Введите пароль для авторизации:";
КонецЕсли;
// Если форма требует обязательного ввода, а пользователь пытается ее закрыть
// до ввода, мы можем это предотвратить в ПередЗакрытием (см. ниже).
// Также можно инициализировать данные, если это форма выбора.
КонецПроцедуры
// Например, при нажатии кнопки "Авторизоваться" или "Подтвердить"
&НаКлиенте
Процедура КомандаАвторизоваться(Команда)
// Проверяем введенные пользователем данные
Если Не ЗначениеЗаполнено(ПолеВводаПароля) Тогда
ПоказатьПредупреждение(, "Введите пароль!");
Возврат;
КонецЕсли;
// В реальной системе здесь будет проверка пароля на сервере.
// Например:
// Если ПроверитьПарольНаСервере(ПолеВводаПароля) Тогда
// // Если пароль верен, возвращаем данные.
// Перем ДанныеДляВозврата;
// ДанныеДляВозврата = Новый Структура("АвторизованныйМенеджер", "Иванов"); // Пример
// ОповеститьОВыборе(ДанныеДляВозврата); // Возвращаем результат
// Закрыть(); // Закрываем форму
// Иначе
// ПоказатьПредупреждение(, "Неверный пароль!");
// КонецЕсли;
// Для примера просто возвращаем что-то и закрываем форму
Перем ДанныеДляВозврата;
ДанныеДляВозврата = Новый Структура("АвторизованныйМенеджер", "Менеджер1");
ОповеститьОВыборе(ДанныеДляВозврата);
Закрыть();
КонецПроцедуры
// В процедуре перед закрытием формы
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
// Если авторизация обязательна, мы можем предотвратить закрытие формы
// до тех пор, пока пользователь не авторизуется или не нажмет специальную кнопку.
// В данном случае, если результат не был оповещен, считаем, что действие не завершено.
// Если форма была открыта с ОписаниеОповещения, но ОповеститьОВыборе() не было вызвано,
// значит пользователь просто закрыл окно. Если это критично, предотвращаем.
// Можно добавить флаг, например "Авторизован", и проверять его.
// Если Не ЭтотОбъект.Авторизован Тогда
// Отказ = Истина;
// ПоказатьПредупреждение(, "Для продолжения работы необходимо авторизоваться!");
// КонецЕсли;
// В данном примере, если мы возвращаем данные через ОповеститьОВыборе,
// то Закрыть() уже вызовет ПередЗакрытием, и отмена здесь может быть не нужна.
// Но если пользователь просто кликнул на крестик, а авторизация обязательна:
Если Не ЗначениеЗаполнено(ПолеВводаПароля) И (Вопрос("Вы уверены, что хотите завершить работу без авторизации?", РежимДиалогаВопрос.ДаНет, 0) = КодВозвратаДиалога.Нет) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Возврат значений из закрываемой формы: Для возврата данных из формы в вызывающий код используется метод ОповеститьОВыборе(). Этот метод принимает в качестве параметра значение, которое будет передано в процедуру-обработчик, указанную в ОписаниеОповещения. После вызова ОповеститьОВыборе() обычно следует вызов Закрыть() для закрытия текущей формы.
В сценарии, описанном в теме форума (розничные продажи, несколько менеджеров, авторизация для каждой продажи), параметры сеанса являются идеальным инструментом для хранения информации о текущем авторизованном менеджере. Параметры сеанса – это переменные, значения которых доступны в течение всего сеанса пользователя и могут быть использованы в любом месте конфигурации.
ТекущийМенеджер) с соответствующим типом (например, СправочникСсылка.Пользователи или Строка, если храните логин). Установите необходимые права доступа к этому параметру через роли.УстановкаПараметровСеанса. Однако, если значение получается из формы, открытой при старте, то установку можно произвести в процедуре-обработчике завершения работы стартовой формы (как мы рассмотрели выше).Пример установки параметра сеанса после авторизации:
// В Модуле управляемого приложения, внутри ОбработчикЗавершенияСтартовойФормы
// после успешной авторизации:
Процедура ОбработчикЗавершенияСтартовойФормы(Результат, ДополнительныеПараметры) Экспорт
// ... предыдущий код обработки результата ...
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("АвторизованныйМенеджер") Тогда
// Устанавливаем параметр сеанса.
// Предполагается, что 'Результат.АвторизованныйМенеджер' содержит ссылку на элемент справочника "Пользователи"
// или другую уникальную идентификацию менеджера.
УстановитьПараметрСеанса("ТекущийМенеджер", Результат.АвторизованныйМенеджер);
Сообщить("Параметр сеанса 'ТекущийМенеджер' установлен на: " + Результат.АвторизованныйМенеджер);
КонецЕсли;
// ... далее продолжение работы ...
КонецПроцедуры
После установки параметра сеанса, вы сможете обращаться к его значению в любом месте конфигурации, например, для автоматического заполнения поля "Менеджер" в новых документах продажи:
// Пример использования параметра сеанса в модуле объекта документа "Продажа"
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Если новый документ и поле "Менеджер" не заполнено, подставляем текущего из сеанса.
Если ЭтоНовый() И Не ЗначениеЗаполнено(Менеджер) И ЗначениеЗаполнено(ПараметрыСеанса.ТекущийМенеджер) Тогда
Менеджер = ПараметрыСеанса.ТекущийМенеджер;
КонецЕсли;
КонецПроцедуры
Примечание по хранению значений: Мы должны помнить, что параметры сеанса — это серверные переменные. Если значение нужно только для клиентской логики и не требует сохранения между обращениями к серверу, лучше использовать глобальные переменные модуля управляемого приложения. Это поможет избежать лишнего сетевого трафика.
Задача скрытия стандартных кнопок окна (закрыть, развернуть, свернуть) и предотвращение закрытия формы актуальна для специализированных рабочих мест, таких как рабочее место кассира (РМК), где требуется максимально контролируемый интерфейс.
В управляемых формах платформа автоматически формирует заголовок и стандартные кнопки управления окном. Полностью удалить кнопки "Закрыть", "Развернуть", "Свернуть" у самой формы управляемого приложения (не внутри формы, а именно у окна приложения или у окна самой формы как отдельного элемента ОС) стандартными средствами не получится для обычных форм, так как они являются частью системного оконного менеджера.
Однако, существуют способы, которые могут помочь в создании требуемого интерфейса:
Эти режимы идеально подходят для реализации РМК, где требуется максимально закрытый интерфейс.
Это дает вам полный контроль над тем, какие действия пользователь может выполнять непосредственно из формы.
Альтернатива: обычные формы: Если вам нужен полный контроль над каждым пикселем интерфейса и вы готовы пожертвовать некоторыми преимуществами управляемых форм (например, кроссплатформенностью в веб-клиенте), то можно рассмотреть создание обычных форм. Обычные формы предоставляют больше гибкости в дизайне, включая возможность создания форм без системных рамок и заголовков с помощью внешних компонентов или более сложного кода. Для реализации подобного интерфейса подойдёт способ запуска обычных форм на полный экран без заголовка окна.
Для того чтобы не дать пользователю закрыть форму, пока не будут выполнены определенные условия (например, пройдена авторизация), мы используем событие ПередЗакрытием формы.
Процедура ПередЗакрытием: Эта клиентская процедура вызывается перед тем, как форма будет закрыта. Она имеет параметр Отказ, который является булевым. Если мы установим Отказ = Истина, закрытие формы будет отменено.
Пример кода в модуле формы:
// В модуле формы "Обработка.ИмяНашейОбработки.Форма"
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
// Предположим, что форма авторизации должна быть закрыта
// только после успешного ввода пароля.
// Мы можем использовать некий флаг (например, реквизит формы "Авторизован"),
// который устанавливается в Истина после успешной авторизации.
// Если авторизация не пройдена (флаг Авторизован = Ложь или его нет)
// и пользователь пытается закрыть форму, мы запрашиваем подтверждение.
// Здесь мы используем простую проверку на заполненность поля ввода пароля
// как имитацию проверки авторизации.
Если Не ЗначениеЗаполнено(ПолеВводаПароля) Тогда
Если Вопрос("Вы уверены, что хотите завершить работу без авторизации? " +
"Это может привести к завершению работы системы.",
РежимДиалогаВопрос.ДаНет, 0) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина; // Отменяем закрытие формы
ПоказатьПредупреждение(, "Пожалуйста, авторизуйтесь или подтвердите завершение работы.");
Иначе
// Если пользователь подтвердил завершение без авторизации,
// мы можем принудительно завершить работу системы.
ЗавершитьРаботуСистемы();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важно: Процедура ПередЗакрытием() вызывается даже при программном закрытии формы методом Закрыть(). Поэтому, если вы вызываете ОповеститьОВыборе() и Закрыть() после успешного действия, убедитесь, что логика в ПередЗакрытием() не помешает этому. Возможно, потребуется установить дополнительный флаг, указывающий на то, что форма закрывается "легитимно", после выполнения всех необходимых действий.
Таким образом, мы рассмотрели комплексное решение: от автоматического открытия формы при старте системы и обработки пользовательского ввода до тонкой настройки внешнего вида формы и контроля над ее закрытием. Эти подходы позволяют создавать гибкие и функциональные пользовательские интерфейсы в 1С:Предприятии, адаптированные под специфические бизнес-задачи, такие как рабочие места операторов или кассиров.