При разработке интерфейсов для специализированных рабочих мест (например, POS-терминалов, мониторов склада или сенсорных киосков) часто используется свойство формы "РежимРабочегоСтола". При этом ожидается, что форма развернется на весь экран и полностью скроет элементы управления операционной системы. Однако на обычных формах разработчики часто сталкиваются с неприятной особенностью платформы: в верхней части экрана все равно резервируется пустое неиспользуемое место под заголовок окна (часто черного или серого цвета).
В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько эффективных способов полностью избавиться от заголовка окна, чтобы форма занимала экран на все 100%. Мы проанализируем как классические решения с использованием внешних утилит, так и более элегантные варианты с прямым вызовом WinAPI и переходом на современные возможности платформы 1С.
В обычных формах 1С принудительное отключение отрисовки системного заголовка на уровне встроенного языка не предусмотрено. Даже если у формы установлено состояние окна "Максимизированное" и включен режим рабочего стола, операционная система Windows продолжает резервировать место под рамку и заголовок (так называемую Non-Client Area окна). Платформа 1С «законными» методами не позволяет управлять стилем этого системного контейнера. Чтобы решить задачу, нам придется прибегнуть к возможностям операционной системы.
Простой и надежный способ, который обсуждался на форуме — использование бесплатного инструмента автоматизации AutoIt. Суть метода заключается в том, чтобы найти дескриптор окна 1С по его уникальному классу и заголовку, а затем физически сдвинуть окно по координате Y вверх на высоту заголовка (примерно на 18-20 пикселей), одновременно увеличив высоту окна на эту же величину.
Рассмотрим, как реализовать этот алгоритм шаг за шагом:
V8NewLocalFrameBaseWnd с заголовком вашей обработки (например, "ВнешняяОбработка1") и корректировать его положение..exe.Код скрипта AutoIt выглядит следующим образом:
#include <WinAPI.au3>
; Находим дескриптор окна по его классу и заголовку
$hWnd = _WinAPI_FindWindow('V8NewLocalFrameBaseWnd', 'ВнешняяОбработка1')
; Сдвигаем окно вверх на 18 пикселей и компенсируем высоту
_WinAPI_SetWindowPos($hWnd, 0, 0, -18, @DesktopWidth, @DesktopHeight + 18, 0)
В модуле обычной формы 1С в обработчике события ПриОткрытии пропишем выгрузку и запуск этого файла:
Процедура ПриОткрытии()
// Получаем двоичные данные из макета
ДвоичныеДанные = ПолучитьМакет("DelHead");
// Формируем путь во временном каталоге
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".exe");
// Записываем файл на диск и запускаем его
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);
КонецПроцедуры
Важное примечание: Этот способ отлично работает, но имеет один недостаток. Антивирусные программы или встроенный защитник Windows могут ложно срабатывать на автоматически создаваемые и запускаемые из временных папок exe-файлы, скомпилированные в AutoIt. Чтобы избежать этого, рассмотрим альтернативные методы.
Чтобы не использовать сторонние исполняемые файлы, мы можем вызывать функции Windows API напрямую из кода 1С. Для этого применяется внешняя библиотека-обертка DynamicWrapperX (зарегистрированная в системе как ActiveX-компонент dynwrapx.dll). Этот способ позволяет не просто «сдвинуть» заголовок за экран, а полноценно отключить его отрисовку операционной системой, изменив стиль окна.
Проанализируем пример кода 1С для работы с DynamicWrapperX:
Процедура ПриОткрытии()
Попытка
// Инициализируем COM-объект обертки WinAPI
DWX = Новый COMОбъект("DynamicWrapperX");
Исключение
Предупреждение("Компонент DynamicWrapperX не зарегистрирован в системе!");
Возврат;
КонецПопытки;
// Регистрируем необходимые функции из библиотеки user32.dll
DWX.Register("user32.dll", "FindWindowW", "i=ss", "r=l");
DWX.Register("user32.dll", "GetWindowLongW", "i=li", "r=l");
DWX.Register("user32.dll", "SetWindowLongW", "i=lil", "r=l");
DWX.Register("user32.dll", "SetWindowPos", "i=liiiiii", "r=l");
// Находим дескриптор нашего окна
HWND = DWX.FindWindowW("V8NewLocalFrameBaseWnd", "ВнешняяОбработка1");
Если HWND <> 0 Тогда
// Получаем текущий стиль окна (GWL_STYLE = -16)
ТекущийСтиль = DWX.GetWindowLongW(HWND, -16);
// Исключаем флаги WS_CAPTION (0x00C00000) и WS_BORDER (0x00800000)
НовыйСтиль = ТекущийСтиль;
НовыйСтиль = НовыйСтиль - 12582912; // Избавляемся от WS_CAPTION
// Применяем новый стиль к окну
DWX.SetWindowLongW(HWND, -16, НовыйСтиль);
// Обновляем позицию окна для применения изменений стиля
// Флаги: SWP_FRAMECHANGED (0x0020), SWP_NOMOVE (0x0002), SWP_NOSIZE (0x0001), SWP_NOZORDER (0x0004)
DWX.SetWindowPos(HWND, 0, 0, 0, 0, 0, 39);
КонецЕсли;
КонецПроцедуры
Этот метод гораздо более профессиональный и "чистый", так как операционная система убирает рамку и заголовок окна физически, освобождая место под рабочую область формы без каких-либо графических артефактов.
Если вы решили использовать метод со сдвигом координат (как в Способе 1), обязательно учитывайте системный масштаб экрана. В современных операционных системах пользователи часто выставляют масштаб 125%, 150% или даже 200% (особенно на 4K-мониторах).
При изменении масштаба фиксированный сдвиг на -18 пикселей перестанет работать корректно:
Решение: При использовании сдвига рассчитывайте высоту заголовка динамически. Для этого через WinAPI вызовите функцию GetSystemMetrics с параметром SM_CYCAPTION (значение 4), которая вернет точную высоту заголовка окна с учетом текущего масштабирования вашей системы.
Если ваша конфигурация работает на платформе 1С 8.3 (даже если это режим совместимости), лучшим архитектурным решением будет постепенный отказ от низкоуровневых манипуляций с окнами Windows в пользу штатных механизмов платформы. В управляемом приложении для реализации полноэкранных интерфейсов предусмотрен специальный функционал.
Выясним, какие инструменты предоставляет нам современная платформа:
ЭтаФорма.ОтображатьЗаголовок = Ложь;. Это мгновенно и безболезненно уберет верхнюю системную панель формы.
// Переводим основное окно в режим "Киоск"
КлиентскоеПриложение.УстановитьРежимОсновногоОкна(РежимОсновногоОкнаКлиентскогоПриложения.Киоск);
При активации режима Киоск платформа 1С автоматически:
Мы подробно проанализировали проблему пустых заголовков в режиме рабочего стола на обычных формах 1С и изучили варианты её решения. Если вы жестко привязаны к обычным формам и старой конфигурации, используйте вызовы WinAPI (напрямую через DynamicWrapperX или посредством внешних утилит типа AutoIt/AHK), не забывая делать поправку на масштабирование экрана (DPI). Если же есть возможность использовать управляемые формы, переводите интерфейс в режим Киоска средствами самой платформы 1С — это гарантирует стабильную работу программы при любых обновлениях операционной системы.