При разработке специализированных рабочих мест (мониторы покупателя, табло очереди, экраны сборки заказов или дашборды) часто возникает задача: форма 1С должна открываться на дополнительном мониторе и автоматически разворачиваться на весь экран. Разберем, как устроена работа с позиционированием окон в платформе 1С:Предприятие 8.3, почему стандартные координаты могут сбрасываться и какими способами можно добиться стабильного результата.
Проанализируем базовые возможности платформы 1С. По умолчанию платформа запоминает координаты и размеры окон для каждого пользователя в системном хранилище настроек. Чтобы управлять этим процессом для конкретной формы, используется специальное свойство КлючСохраненияПоложенияОкна.
Рассмотрим, как задать ключ программно при открытии или создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Задаем уникальный строковый ключ для сохранения геометрии окна
КлючСохраненияПоложенияОкна = "ОкноВторогоМонитора_Покупатель";
КонецПроцедуры
После того как пользователь один раз вручную перенесет форму на второй монитор, развернет ее и закроет, платформа свяжет текущее положение с указанным ключом. При последующих открытиях форма будет восстанавливать эти координаты.
Важные ограничения штатного механизма:
КлючСохраненияПоложенияОкна работает индивидуально для каждого пользователя и не позволяет принудительно задать положение формы из кода для всех пользователей централизованно.Чтобы форма могла свободно перемещаться за пределы основного рабочего пространства 1С на соседний экран, ее необходимо настроить на открытие в отдельном окне. Разберем, как это сделать:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Устанавливаем независимый режим открытия формы
РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
КонецПроцедуры
Форма в независимом режиме получает собственное окно в операционной системе, что позволяет управлять ее положением независимо от главного окна конфигуратора или предприятия.
Если требуется гарантированно открыть форму в конкретном месте экрана вне зависимости от настроек пользователя и кэша, рассмотрим подход с использованием вызовов функций Windows API через внешние скрипты (PowerShell, VBScript) или вспомогательные утилиты.
Разберем по шагам алгоритм принудительного позиционирования:
ЗапуститьПриложение вызывается фоновый скрипт или внешняя утилита.HWND) по заголовку с помощью системной функции FindWindow.SetWindowPos или MoveWindow окно перемещается на координаты целевого монитора (например, со смещением по оси $X$, равным ширине первого экрана).ShowWindow с параметром SW_MAXIMIZE (код 3) окно разворачивается на весь экран.Посмотрим на пример вызова внешней команды из 1С:
&НаКлиенте
Процедура ПослеОткрытия()
// Запуск фонового скрипта позиционирования окна
КомандаЗапуска = "powershell.exe -ExecutionPolicy Bypass -File ""C:\Scripts\MoveWindow.ps1"" -WindowTitle ""МониторПокупателя""";
ЗапуститьПриложение(КомандаЗапуска, , Ложь);
КонецПроцедуры
Для высоконагруженных и критичных рабочих мест наиболее надежным решением является использование внешней компоненты (Native API для C++ или C#). Компонента подключается в сеансе 1С, считывает конфигурацию подключенных дисплеев операционной системы и программно переносит окно нужной формы на указанный физический монитор без необходимости вызова внешних интерпретаторов командной строки.