Как убрать заголовок окна в режиме рабочего стола на обычных формах в 1С?

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

При разработке интерфейсов для специализированных рабочих мест (например, POS-терминалов, мониторов склада или сенсорных киосков) часто используется свойство формы "РежимРабочегоСтола". При этом ожидается, что форма развернется на весь экран и полностью скроет элементы управления операционной системы. Однако на обычных формах разработчики часто сталкиваются с неприятной особенностью платформы: в верхней части экрана все равно резервируется пустое неиспользуемое место под заголовок окна (часто черного или серого цвета).

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

Причина поведения платформы

В обычных формах 1С принудительное отключение отрисовки системного заголовка на уровне встроенного языка не предусмотрено. Даже если у формы установлено состояние окна "Максимизированное" и включен режим рабочего стола, операционная система Windows продолжает резервировать место под рамку и заголовок (так называемую Non-Client Area окна). Платформа 1С «законными» методами не позволяет управлять стилем этого системного контейнера. Чтобы решить задачу, нам придется прибегнуть к возможностям операционной системы.

Способ 1. Сдвиг окна за пределы экрана с помощью AutoIt

Простой и надежный способ, который обсуждался на форуме — использование бесплатного инструмента автоматизации AutoIt. Суть метода заключается в том, чтобы найти дескриптор окна 1С по его уникальному классу и заголовку, а затем физически сдвинуть окно по координате Y вверх на высоту заголовка (примерно на 18-20 пикселей), одновременно увеличив высоту окна на эту же величину.

Рассмотрим, как реализовать этот алгоритм шаг за шагом:

  1. Создадим скрипт AutoIt, который будет находить окно 1С класса V8NewLocalFrameBaseWnd с заголовком вашей обработки (например, "ВнешняяОбработка1") и корректировать его положение.
  2. Скомпилируем этот скрипт в исполняемый файл .exe.
  3. Поместим скомпилированный файл в макет обработки как двоичные данные.
  4. При открытии формы будем извлекать этот файл во временный каталог и запускать.

Код скрипта 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. Чтобы избежать этого, рассмотрим альтернативные методы.

Способ 2. Прямой вызов WinAPI через DynamicWrapperX (без EXE-файлов)

Чтобы не использовать сторонние исполняемые файлы, мы можем вызывать функции 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); 
    КонецЕсли;
КонецПроцедуры

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

Проблема масштабирования (High-DPI) в Windows 10 и 11

Если вы решили использовать метод со сдвигом координат (как в Способе 1), обязательно учитывайте системный масштаб экрана. В современных операционных системах пользователи часто выставляют масштаб 125%, 150% или даже 200% (особенно на 4K-мониторах).

При изменении масштаба фиксированный сдвиг на -18 пикселей перестанет работать корректно:

Решение: При использовании сдвига рассчитывайте высоту заголовка динамически. Для этого через WinAPI вызовите функцию GetSystemMetrics с параметром SM_CYCAPTION (значение 4), которая вернет точную высоту заголовка окна с учетом текущего масштабирования вашей системы.

Способ 3. Переход на управляемые формы (штатные средства платформы)

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

Выясним, какие инструменты предоставляет нам современная платформа:

  1. Свойство формы "ОтображатьЗаголовок": Управляемые формы имеют встроенное свойство управления отображением шапки. Достаточно снять этот флаг в конфигураторе или установить его программно в коде: ЭтаФорма.ОтображатьЗаголовок = Ложь;. Это мгновенно и безболезненно уберет верхнюю системную панель формы.
  2. Режим "Киоск": Для создания полноценных рабочих мест кассиров или терминалов самообслуживания в 1С предусмотрен специальный режим основного окна. Проанализируем пример кода для перевода приложения в полноэкранный безрамочный режим:

// Переводим основное окно в режим "Киоск"
КлиентскоеПриложение.УстановитьРежимОсновногоОкна(РежимОсновногоОкнаКлиентскогоПриложения.Киоск);

При активации режима Киоск платформа 1С автоматически:

Резюме

Мы подробно проанализировали проблему пустых заголовков в режиме рабочего стола на обычных формах 1С и изучили варианты её решения. Если вы жестко привязаны к обычным формам и старой конфигурации, используйте вызовы WinAPI (напрямую через DynamicWrapperX или посредством внешних утилит типа AutoIt/AHK), не забывая делать поправку на масштабирование экрана (DPI). Если же есть возможность использовать управляемые формы, переводите интерфейс в режим Киоска средствами самой платформы 1С — это гарантирует стабильную работу программы при любых обновлениях операционной системы.

← На главную