В работе с платформой 1С:Предприятие 7.7 разработчики и администраторы часто сталкиваются с проблемой «человеческого фактора», когда конечные пользователи (например, продавцы на торговых точках или операторы склада) работают в небольших свернутых окнах. Вместо того чтобы развернуть форму на весь экран и комфортно видеть всю информацию, они продолжают использовать полосы прокрутки, совершают ошибки и снижают скорость работы. Попытки обучить персонал нажимать кнопку «Развернуть» вручную помогают далеко не всегда.
В этой статье мы подробно разберем, как решить эту задачу программно. Мы изучим особенности работы оконного интерфейса 1С 7.7, проанализируем разницу между обычными (MDI) и модальными окнами, а также рассмотрим несколько эффективных способов автоматического максимизирования окон при их открытии.
Прежде чем переходить к написанию кода, давайте разберемся, почему окна в «семерке» ведут себя именно так. Платформа 1С 7.7 построена на базе интерфейса MDI (Multiple Document Interface — многодокументный интерфейс). В такой архитектуре есть одно главное окно программы (внешняя рамка приложения), внутри которого открываются дочерние окна — журналы документов, справочники, отчеты и документы.
Окна в 1С 7.7 делятся на два основных типа:
Давайте рассмотрим детальные технические способы программного управления размерами для обоих типов окон.
Если вам необходимо развернуть стандартное (не модальное) окно при открытии, а устанавливать дополнительные внешние компоненты в базу по каким-то причинам нельзя, можно воспользоваться встроенными возможностями операционной системы 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 заблокирован политиками безопасности
Сообщить("Не удалось программно развернуть окно: " + ОписаниеОшибки(), "!");
КонецПопытки;
КонецПроцедуры
Плюсы метода:
Минусы метода:
Для профессионального и гарантированного управления окнами в 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 не поддерживает расширение форм в текущей версии
КонецПопытки;
КонецПроцедуры
С использованием такого подхода интерфейс вашего приложения будет выглядеть гармонично, профессионально и современно на экранах с абсолютно любым разрешением, а ваши сотрудники смогут сосредоточиться на выполнении своих задач, не отвлекаясь на ручную настройку рабочей области.