При проектировании специализированных рабочих мест (АРМ) на платформе «1С:Предприятие 8» разработчики часто сталкиваются с необходимостью максимально упростить интерфейс. Самым очевидным решением кажется использование свойства конфигурации или пользователя «Режим основного окна = Рабочее место». Этот режим позволяет скрыть панели разделов, историю, избранное и сделать интерфейс чистым, ориентированным на выполнение конкретных задач.
Однако здесь кроется серьезная архитектурная проблема: в режиме «Рабочее место» платформа принудительно блокирует отображение Панели открытых окон и отключает стандартные горячие клавиши переключения между ними (такие как Ctrl + Tab или Ctrl + F6). Пользователь открывает внешние отчеты или обработки, но физически не может переключиться назад на основную форму АРМ или между открытыми окнами.
В этой статье мы подробно разберем причины такого поведения платформы и рассмотрим три практических способа решения этой проблемы, которые помогут вернуть пользователям удобную навигацию.
Режим основного окна «Рабочее место» (наряду с режимами «Полноэкранное рабочее место» и «Киоск») проектировался разработчиками фирмы «1С» для узкоспециализированных терминалов (например, мониторов кассиров, ТСД или информационных табло). Логика платформы в данном режиме предполагает, что пользователь должен работать строго в рамках одного полноэкранного окна.
Любые попытки открыть модальные или вспомогательные окна приводят к потере контроля над интерфейсом, так как переключаться между ними стандартными средствами операционной системы или платформы в этом режиме запрещено на уровне ядра. Программными методами заставить платформу отобразить системную панель открытых окон внутри режима «Рабочее место» невозможно. Нам придется использовать обходные пути.
---
Самый простой и надежный способ — отказаться от жесткого режима «Рабочее место» в пользу стандартного «Обычного» режима запуска приложения. При этом мы программно настроим интерфейс так, что он визуально ничем не будет отличаться от рабочего места, но сохранит панель открытых окон.
Давайте разберем по шагам, как это реализовать в модуле управляемого приложения. Нам понадобится использовать объект НастройкиИнтер페이스КлиентскогоПриложения и сохранить измененную конфигурацию панелей для нашего пользователя.
Пропишем следующий код в процедуре ПриНачалеРаботыСистемы:
Процедура ПриНачалеРаботыСистемы()
// Получаем текущие настройки интерфейса системы
ТекущиеНастройки = РабочаяСредаКлиент.ПолучитьТекущиеНастройкиИнтерфейса();
// Принудительно отключаем видимость ненужных панелей
ТекущиеНастройки.ПанельРазделов.Видимость = Ложь;
ТекущиеНастройки.ПанельФункцийТекущегоРаздела.Видимость = Ложь;
ТекущиеНастройки.ПанельИнструментов.Видимость = Ложь;
// Оставляем видимой только Панель открытых окон и позиционируем ее, например, внизу
ТекущиеНастройки.ПанельОткрытых.Видимость = Истина;
ТекущиеНастройки.ПанельОткрытых.Положение = ПоложениеПанелиИнтерфейсаКлиентскогоПриложения.Низ;
// Записываем настройки в системное хранилище, чтобы применить их для сеанса пользователя
ХранилищеСистемныхНастроек.Сохранить(
"Общее/НастройкиИнтерфейсаКлиентскогоПриложения",
"",
ТекущиеНастройки
);
КонецПроцедуры
Этот способ позволяет гибко управлять рабочим пространством. Пользователь получит лаконичный интерфейс АРМ без лишних кнопок, но с удобной панелью внизу экрана для переключения между открытыми отчетами.
---
Если по соображениям безопасности или из-за требований заказчика вам принципиально важно сохранить режим «Рабочее место» (например, чтобы полностью скрыть заголовок программы и системное меню «Сервис и настройки»), переключение окон можно реализовать самостоятельно.
Мы можем использовать встроенный метод платформы ПолучитьОкна(), который возвращает коллекцию всех открытых в сеансе окон. Создадим на главной форме нашего АРМ динамическую панель (или таблицу), которая будет отображать список открытых отчетов.
Разберем пример реализации обновления списка окон на форме АРМ:
&НаКлиенте
Процедура ОбновитьСписокОткрытыхОкон()
// Очищаем коллекцию на форме, куда выводятся заголовки открытых окон
СписокОткрытыхОконФормы.Очистить();
// Получаем массив всех окон приложения
МассивОкон = ПолучитьОкна();
Для Каждого ТекущееОкно Из МассивОкон Цикл
// Исключаем из списка главное окно АРМ, чтобы пользователь не переключался на него дублирующим образом
Если Не ТекущееОкно.Главное И ТекущееОкно.Доступно Тогда
НоваяСтрока = СписокОткрытыхОконФормы.Добавить();
НоваяСтрока.ИдентификаторОкна = ТекущееОкно.ПолучитьИдентификатор();
НоваяСтрока.Заголовок = ТекущееОкно.Заголовок;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для того чтобы пользователь мог переключиться на выбранное окно, обработаем событие выбора в нашей таблице окон. Используем метод Активизировать():
&НаКлиенте
Процедура СписокОткрытыхОконФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.СписокОткрытыхОконФормы.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
МассивОкон = ПолучитьОкна();
Для Каждого Окно Из МассивОкон Цикл
Если Окно.ПолучитьИдентификатор() = ТекущиеДанные.ИдентификаторОкна Тогда
// Выводим нужное окно на передний план
Окно.Активизировать();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Чтобы список окон всегда оставался актуальным, мы можем подключить обработчик ожидания в форме АРМ с помощью метода ПодключитьОбработчикОжидания("ОбновитьСписокОткрытыхОкон", 2), который будет обновлять информацию каждые две секунды.
---
Еще один профессиональный архитектурный подход — перенос логики внешних обработок на одну общую форму АРМ с использованием элемента управления Группа - Страницы (вкладки). Это исключает открытие новых окон в принципе, что идеально укладывается в концепцию режима «Рабочее место».
Многие разработчики считают, что "1С не умеет вставлять форму в форму". Действительно, напрямую разместить одну управляемую форму внутри другой нельзя, но мы можем обойти это ограничение:
ИзменитьРеквизиты(). При переходе пользователя на определенную вкладку система динамически подгружает и отрисовывает элементы интерфейса нужного внешнего отчета.Посмотрим на пример кода динамического добавления реквизитов и элементов на созданную страницу формы:
&НаСервере
Процедура ДобавитьИнтерфейсОтчетаНаВкладку(ИмяОтчета, ИмяВкладки)
// Описываем новый реквизит для хранения данных отчета на форме АРМ
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Контекст_" + ИмяОтчета, Новый ОписаниеТипов("ТаблицаЗначений")));
// Интегрируем реквизит в структуру текущей формы
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создаем визуальный элемент (например, таблицу) и привязываем его к созданной вкладке
РодительскаяГруппа = Элементы[ИмяВкладки];
НоваяТаблицаФормы = Элементы.Добавить("Таблица_" + ИмяОтчета, Тип("ТаблицаФормы"), РодительскаяГруппа);
НоваяТаблицаФормы.ПутьКДанным = "Контекст_" + ИмяОтчета;
// Дополнительно программно создаем колонки и кнопки управления...
КонецПроцедуры
При таком подходе вся работа пользователя происходит в режиме "одного окна", интерфейс работает молниеносно, а переключение между задачами сводится к обычному клику по вкладкам формы.
Мы проанализировали ограничения платформы в режиме «Рабочее место» и разобрали три способа их обхода. Если вам критически важно быстро решить проблему с минимальным переписыванием кода — используйте Способ 1 с программной настройкой интерфейса в обычном режиме запуска. Если же требуется жесткий полноэкранный режим терминала без возможности выхода из него — реализуйте переключение через ПолучитьОкна() (Способ 2) или спроектируйте единую форму АРМ на вкладках (Способ 3).