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

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

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

Вариант 1. Управление окнами из кода 1С через COM-объект AutoItX

Разберем по шагам наиболее удобный способ вызова функций AutoIt непосредственно из программного кода 1С. Для этого используется официальная динамическая библиотека AutoItX3.dll, предоставляющая COM/ActiveX-интерфейс.

  1. Зарегистрируем библиотеку в операционной системе Windows от имени администратора с помощью утилиты regsvr32 AutoItX3.dll (для 32-разрядного клиента 1С) или regsvr32 AutoItX3_x64.dll (для 64-разрядного клиента 1С).
  2. Создадим COM-объект в коде 1С и вызовем методы перемещения и позиционирования окна.

Посмотрим на пример программного открытия формы и установки ее координат:


// Открываем форму с уникальным заголовком для точного поиска
ПараметрыФормы = Новый Структура;
УникальныйЗаголовок = "Окно мониторинга " + Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0");

ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Заголовок", УникальныйЗаголовок);

// Важно открыть окно в отдельном режиме
ФормаОкна = ПолучитьФорму("Обработка.МониторЗаказов.Форма.Форма", ПараметрыОткрытия);
ФормаОкна.РежимОткрытияОкна = РежимОткрытияОкнаФормы.ОтдельноеОкно;
ФормаОкна.Заголовок = УникальныйЗаголовок;
ФормаОкна.Открыть();

// Инициализируем COM-объект AutoIt
Попытка
    AutoIt = Новый COMОбъект("AutoItX3.Control");
    
    // Настраиваем режим поиска заголовков (2 - совпадение по подстроке)
    AutoIt.Opt("WinTitleMatchMode", 2);
    
    // Ожидаем появления окна до 3 секунд
    Если AutoIt.WinWait(УникальныйЗаголовок, "", 3) = 1 Тогда
        // WinMove: Заголовок, Текст, X, Y, [Ширина], [Высота]
        AutoIt.WinMove(УникальныйЗаголовок, "", 100, 100, 800, 600);
        AutoIt.WinActivate(УникальныйЗаголовок, "");
    КонецЕсли;
Исключение
    Сообщить("Ошибка инициализации AutoIt: " + ОписаниеОшибки());
КонецПопытки;

Вариант 2. Использование внешнего скрипта AutoIt для отслеживания окон 1С

Если задача заключается во внешней автоматизации (например, при пакетном обновлении конфигураций или фоновом контроле окон), скрипт пишется на языке AutoIt и запускается в виде отдельного процесса. Проанализируем пример скрипта, который перехватывает системные окна 1С по классам Windows:


#include <Constants.au3>

_Main()

Func _Main()
    $WinTitle = "[CLASS:V8TopLevelFrame]" ; Главное окно 1С / Конфигуратора
    
    While 1
        If WinExists($WinTitle) Then
            ; Поиск дочернего MDI-фрейма формы 1С
            $hCtrl = ControlGetHandle($WinTitle, "", "[CLASS:V8MDILocalFrame]")
            If $hCtrl Then
                ; Перемещаем и задаем размер главному окну
                WinMove($WinTitle, "", 0, 0, 1024, 768)
                ExitLoop
            EndIf
        EndIf
        Sleep(1000)
    WEnd
    
    TrayTip("Готово", "Окно 1С успешно найдено и позиционировано", 5, $TIP_ICONASTERISK)
EndFunc

Ограничения и сложности использования AutoIt с 1С

Выясним, с какими техническими трудностями можно столкнуться при использовании внешних утилит для управления окнами платформы:

  1. Нестандартные элементы управления 1С: Платформа 1С отрисовывает большинство элементов интерфейса внутри собственного графического контейнера. Внутренние кнопки, поля ввода и табличные части не являются отдельными Win32-контролами, поэтому методы вроде ControlClick часто не срабатывают стандартным образом. Позиционировать надежно можно только окна верхнего уровня.
  2. Совпадение разрядностей: Разрядность AutoItX3.dll должна строго соответствовать разрядности клиента 1С (x86 или x64), иначе при создании COMОбъект возникнет исключение.
  3. Ограничение платформ: Метод работает исключительно в среде Windows на тонком или толстом клиенте. В веб-клиенте, на Linux и macOS данный подход неприменим.
  4. Масштабирование DPI: При системном масштабировании экрана (125%, 150%) передаваемые экранные координаты могут смещаться.

Вариант 3. Штатные средства платформы 1С:Предприятие 8.3

Рассмотрим, как решить задачу позиционирования и компоновки окон стандартными возможностями платформы без использования внешних библиотек.

1. Управление режимом открытия формы

В управляемом интерфейсе форма по умолчанию открывается как вкладка. Чтобы сделать ее независимой, используем свойство РежимОткрытияОкна:


ПараметрыФормы = Новый Структура;
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый; // или ОтдельноеОкно
ФормаДокумента.Открыть();

2. Автоматическое сохранение положения окон

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

3. Разделение рабочей области и составные формы

Вместо открытия нескольких независимых окон часто эффективнее объединить их в единую форму обработки. Используя элементы Группа формы (горизонтальная) или Страницы, можно разместить несколько динамических списков или табличных частей на одном экране. Это обеспечивает кроссплатформенность решения и одинаковое поведение на любых мониторах и клиентах.

← На главную