Как открывать управляемую форму 1С всегда на определенном мониторе и в развернутом виде?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке специализированных рабочих мест (мониторы покупателя, табло очереди, экраны сборки заказов или дашборды) часто возникает задача: форма 1С должна открываться на дополнительном мониторе и автоматически разворачиваться на весь экран. Разберем, как устроена работа с позиционированием окон в платформе 1С:Предприятие 8.3, почему стандартные координаты могут сбрасываться и какими способами можно добиться стабильного результата.

Штатные механизмы платформы и свойство КлючСохраненияПоложенияОкна

Проанализируем базовые возможности платформы 1С. По умолчанию платформа запоминает координаты и размеры окон для каждого пользователя в системном хранилище настроек. Чтобы управлять этим процессом для конкретной формы, используется специальное свойство КлючСохраненияПоложенияОкна.

Рассмотрим, как задать ключ программно при открытии или создании формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Задаем уникальный строковый ключ для сохранения геометрии окна
    КлючСохраненияПоложенияОкна = "ОкноВторогоМонитора_Покупатель";
КонецПроцедуры

После того как пользователь один раз вручную перенесет форму на второй монитор, развернет ее и закроет, платформа свяжет текущее положение с указанным ключом. При последующих открытиях форма будет восстанавливать эти координаты.

Важные ограничения штатного механизма:

  1. В платформе 1С:Предприятие 8.3 для управляемых форм нет встроенных методов для явной программной установки экранных координат ($X, Y$, ширина, высота) или выбора номера монитора.
  2. Свойство КлючСохраненияПоложенияОкна работает индивидуально для каждого пользователя и не позволяет принудительно задать положение формы из кода для всех пользователей централизованно.
  3. Платформа автоматически корректирует или сбрасывает сохраненные координаты, если меняется конфигурация экранов (например, при подключении по RDP, TeamViewer, изменении разрешения или временном отключении монитора). Это штатный защитный механизм, предотвращающий открытие окна за пределами видимой зоны.

Обеспечение свободного перемещения: независимый режим окна

Чтобы форма могла свободно перемещаться за пределы основного рабочего пространства 1С на соседний экран, ее необходимо настроить на открытие в отдельном окне. Разберем, как это сделать:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем независимый режим открытия формы
    РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
КонецПроцедуры

Форма в независимом режиме получает собственное окно в операционной системе, что позволяет управлять ее положением независимо от главного окна конфигуратора или предприятия.

Точное позиционирование через внешние средства и Windows API

Если требуется гарантированно открыть форму в конкретном месте экрана вне зависимости от настроек пользователя и кэша, рассмотрим подход с использованием вызовов функций Windows API через внешние скрипты (PowerShell, VBScript) или вспомогательные утилиты.

Разберем по шагам алгоритм принудительного позиционирования:

  1. При открытии формы в коде 1С ей присваивается уникальный заголовок (например, содержащий уникальный идентификатор), чтобы скрипт мог однозначно найти нужное окно в системе.
  2. С помощью команды ЗапуститьПриложение вызывается фоновый скрипт или внешняя утилита.
  3. Скрипт находит дескриптор окна (HWND) по заголовку с помощью системной функции FindWindow.
  4. С помощью функции SetWindowPos или MoveWindow окно перемещается на координаты целевого монитора (например, со смещением по оси $X$, равным ширине первого экрана).
  5. С помощью функции ShowWindow с параметром SW_MAXIMIZE (код 3) окно разворачивается на весь экран.
  6. Заголовок формы возвращается к исходному пользовательскому виду.

Посмотрим на пример вызова внешней команды из 1С:


&НаКлиенте
Процедура ПослеОткрытия()
    // Запуск фонового скрипта позиционирования окна
    КомандаЗапуска = "powershell.exe -ExecutionPolicy Bypass -File ""C:\Scripts\MoveWindow.ps1"" -WindowTitle ""МониторПокупателя""";
    ЗапуститьПриложение(КомандаЗапуска, , Ложь);
КонецПроцедуры

Использование внешних компонент (Native API)

Для высоконагруженных и критичных рабочих мест наиболее надежным решением является использование внешней компоненты (Native API для C++ или C#). Компонента подключается в сеансе 1С, считывает конфигурацию подключенных дисплеев операционной системы и программно переносит окно нужной формы на указанный физический монитор без необходимости вызова внешних интерпретаторов командной строки.

← На главную