Как в 1С 7.7 автоматически открывать окна на весь экран (максимизировать)?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как решить эту задачу программно. Мы изучим особенности работы оконного интерфейса 1С 7.7, проанализируем разницу между обычными (MDI) и модальными окнами, а также рассмотрим несколько эффективных способов автоматического максимизирования окон при их открытии.

Понимание архитектуры окон в 1С 7.7

Прежде чем переходить к написанию кода, давайте разберемся, почему окна в «семерке» ведут себя именно так. Платформа 1С 7.7 построена на базе интерфейса MDI (Multiple Document Interface — многодокументный интерфейс). В такой архитектуре есть одно главное окно программы (внешняя рамка приложения), внутри которого открываются дочерние окна — журналы документов, справочники, отчеты и документы.

Окна в 1С 7.7 делятся на два основных типа:

  1. Обычные MDI-окна. Это стандартные формы справочников, документов и отчетов. Они могут свободно перемещаться внутри главного окна программы, минимизироваться и максимизироваться штатными средствами Windows.
  2. Модальные окна. Такие окна блокируют работу со всей остальной программой до тех пор, пока пользователь их не закроет. Штатно модальные окна в 1С 7.7 жестко зафиксированы в своих размерах и по умолчанию не имеют стандартной системной кнопки «Развернуть» в правом верхнем углу.

Давайте рассмотрим детальные технические способы программного управления размерами для обоих типов окон.

Способ 1. Использование Windows Script Host (WScript.Shell) для обычных окон

Если вам необходимо развернуть стандартное (не модальное) окно при открытии, а устанавливать дополнительные внешние компоненты в базу по каким-то причинам нельзя, можно воспользоваться встроенными возможностями операционной системы Windows. С помощью объекта WScript.Shell мы можем сымитировать нажатие системной комбинации клавиш, которая отвечает за максимизацию активного окна.

Обычно для этого используется системное меню окна. Если нажать комбинацию клавиш Alt + Пробел (для главного окна) или Alt + - (минус) для дочернего MDI-окна, откроется системное меню. В этом меню пункт «Развернуть» обычно находится на определенной позиции, к которой можно перейти стрелками клавиатуры и нажать Enter.

Рассмотрим пример кода, который можно разместить непосредственно в модуле формы (например, справочника или журнала) в процедуре ПриОткрытии():


Процедура ПриОткрытии()
    // Запускаем отложенный вызов максимизации
    Форма.ОбработкаОжидания("глРазвернутьОкноWSH", 1);
КонецПроцедуры

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

Теперь в Глобальном модуле конфигурации определим процедуру, которая будет вызвана операционной системой:


Процедура глРазвернутьОкноWSH() Экспорт
    // Сразу отключаем обработку ожидания, чтобы она не зацикливалась
    Форма.ОбработкаОжидания("", 0);
    
    Попытка
        WshShell = СоздатьОбъект("WScript.Shell");
        // Отправляем системную клавишу Alt (%)
        WshShell.SendKeys("%"); 
        // Имитируем нажатие стрелки влево, затем 5 раз вниз для перехода на пункт "Развернуть" и Enter
        WshShell.SendKeys("{LEFT}{DOWN 5}{ENTER}");
    Исключение
        // Если объект WScript.Shell заблокирован политиками безопасности
        Сообщить("Не удалось программно развернуть окно: " + ОписаниеОшибки(), "!");
    КонецПопытки;
КонецПроцедуры

Плюсы метода:

Минусы метода:

Способ 2. Использование внешней компоненты FormEx (Универсальное и надежное решение)

Для профессионального и гарантированного управления окнами в 1С 7.7 традиционно используется внешняя компонента FormEx. Это проверенное временем решение расширяет возможности встроенного языка платформы и позволяет напрямую управлять свойствами окон операционной системы без использования эмуляции клавиатуры.

Для начала работы вам понадобится файл библиотеки FormEx.dll. Его необходимо разместить в каталоге базы данных или в каталоге исполняемых файлов платформы (BIN).

Пропишем загрузку компоненты при старте системы в процедуре ПриНачалеРаботыСистемы() в Глобальном модуле:


Процедура ПриНачалеРаботыСистемы()
    Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") <> 1 Тогда
        Предупреждение("Компонента FormEx.dll не найдена! Программное управление окнами будет недоступно.");
    КонецЕсли;
КонецПроцедуры

После того как компонента успешно загружена, нам становится доступен объект Окна, с помощью которого мы можем максимизировать любую форму (включая модальные окна, которые штатно изменить невозможно).

Разберем пример программного развертывания формы при ее открытии. В модуле формы пишем следующий код:


Процедура ПриОткрытии()
    // Проверяем, загружена ли компонента FormEx
    Попытка
        Сервис = СоздатьОбъект("Сервис");
        // Проверяем, открыта ли форма в модальном режиме
        Если Форма.МодальныйРежим() = 1 Тогда
            // Для модальных окон используем специальный объект "Окна" из FormEx
            ОкнаКомпоненты = СоздатьОбъект("Окна");
            ОкнаКомпоненты.Максимизировать(Форма);
        Иначе
            // Для обычных окон также применяем метод компоненты
            ОкнаКомпоненты = СоздатьОбъект("Окна");
            ОкнаКомпоненты.Максимизировать(Форма);
        КонецЕсли;
    Исключение
        // Обработка ситуации, если компонента не загружена
    КонецПопытки;
КонецПроцедуры

Важное примечание: Если вы используете метод Максимизировать() без передачи параметров, компонента FormEx развернет главное окно программы 1С:Предприятие. Если же передать туда контекст текущей формы (переменную Форма), будет максимизировано конкретное дочернее или модальное окно.

Плюсы метода:

Проблема «пустого пространства» при максимизации и как ее решить

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

Чтобы интерфейс автоматически масштабировался вслед за изменением размеров окна, необходимо использовать механизм привязок элементов. В штатной платформе 1С 7.7 этого механизма нет, но его легко реализовать с помощью все той же компоненты FormEx или библиотеки 1С++.

Давайте посмотрим, как программно настроить автоматическое растягивание таблицы и привязку кнопок к правому и нижнему краю с помощью класса РасширениеФормы из FormEx:


Процедура ПриОткрытии()
    // Разворачиваем окно на весь экран
    ОкнаКомпоненты = СоздатьОбъект("Окна");
    ОкнаКомпоненты.Максимизировать(Форма);
    
    // Настраиваем привязки элементов управления, чтобы они не группировались в углу
    Попытка
        Расширение = СоздатьОбъект("РасширениеФормы");
        Расширение.УстановитьКонтекст(Форма);
        
        // Привязываем таблицу (например, с идентификатором "ТаблицаТоваров")
        // Параметры метода указывают, как будут вести себя левая, верхняя, правая и нижняя границы
        // Значение 2 означает растяжение вслед за границей формы
        Расширение.УстановитьПривязку("ТаблицаТоваров", 0, 0, 2, 2);
        
        // Привязываем кнопку "Закрыть" (кнопка должна оставаться в правом нижнем углу)
        // Значение 1 означает смещение элемента без изменения его геометрических размеров
        Расширение.УстановитьПривязку("КнопкаЗакрыть", 1, 1, 1, 1);
    Исключение
        // Компонента FormEx не поддерживает расширение форм в текущей версии
    КонецПопытки;
КонецПроцедуры

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

← На главную