При разработке интерфейсов и автоматизации рабочих мест в 1С:Предприятии нередко возникает задача отображения нескольких окон с точным позиционированием их на экране. Рассмотрим, как можно решить эту задачу с помощью сторонней библиотеки AutoIt, разберем ограничения такого подхода и выясним, какими штатными механизмами платформы 1С можно воспользоваться без привлечения сторонних утилит.
Разберем по шагам наиболее удобный способ вызова функций AutoIt непосредственно из программного кода 1С. Для этого используется официальная динамическая библиотека AutoItX3.dll, предоставляющая COM/ActiveX-интерфейс.
regsvr32 AutoItX3.dll (для 32-разрядного клиента 1С) или regsvr32 AutoItX3_x64.dll (для 64-разрядного клиента 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: " + ОписаниеОшибки());
КонецПопытки;
Если задача заключается во внешней автоматизации (например, при пакетном обновлении конфигураций или фоновом контроле окон), скрипт пишется на языке 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
Выясним, с какими техническими трудностями можно столкнуться при использовании внешних утилит для управления окнами платформы:
ControlClick часто не срабатывают стандартным образом. Позиционировать надежно можно только окна верхнего уровня.AutoItX3.dll должна строго соответствовать разрядности клиента 1С (x86 или x64), иначе при создании COMОбъект возникнет исключение.Рассмотрим, как решить задачу позиционирования и компоновки окон стандартными возможностями платформы без использования внешних библиотек.
1. Управление режимом открытия формы
В управляемом интерфейсе форма по умолчанию открывается как вкладка. Чтобы сделать ее независимой, используем свойство РежимОткрытияОкна:
ПараметрыФормы = Новый Структура;
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый; // или ОтдельноеОкно
ФормаДокумента.Открыть();
2. Автоматическое сохранение положения окон
Платформа 1С автоматически запоминает координаты, ширину и высоту открытых окон для каждого пользователя в системном хранилище настроек. Если пользователь один раз расположит окна нужным образом, платформа восстановит их позиции при последующих запусках.
3. Разделение рабочей области и составные формы
Вместо открытия нескольких независимых окон часто эффективнее объединить их в единую форму обработки. Используя элементы Группа формы (горизонтальная) или Страницы, можно разместить несколько динамических списков или табличных частей на одном экране. Это обеспечивает кроссплатформенность решения и одинаковое поведение на любых мониторах и клиентах.