Как вывести независимое графическое окно Win32 поверх интерфейса 1С с помощью Native API?

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

В современной разработке на платформе 1С:Предприятие 8 иногда возникают задачи, которые сложно или невозможно решить стандартными средствами управляемых или обычных форм. Одной из таких задач является создание легкого, независимого графического окна, которое живет «своей жизнью» поверх основного интерфейса платформы, не блокируя при этом работу пользователя. Рассмотрим подробнее решение на базе внешней компоненты NOP PUP InCompEnt "WindowWidget", разработанной по технологии Native API.

Архитектура решения и технические особенности

Проанализируем, почему для создания графических виджетов была выбрана технология Native API и системные вызовы Win32. В отличие от тяжеловесных UI-фреймворков (таких как Qt, .NET или Electron), данное решение напрямую взаимодействует с подсистемой Windows. Это обеспечивает минимальное потребление системных ресурсов и отсутствие лишних зависимостей в виде сторонних библиотек.

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

Для отрисовки используется стандартный графический интерфейс GDI (Graphics Device Interface). Выясним причину такого выбора: GDI позволяет работать с контекстом устройства (HDC), что дает возможность выводить текст, геометрические примитивы и изображения с минимальными задержками.

Интеграция компоненты в конфигурацию 1С

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

Способ 1: Использование общего макета (рекомендуемый)

Этот метод наиболее удобен для тиражируемых решений, так как компонента хранится непосредственно внутри базы данных и автоматически доставляется на клиентские рабочие места.

  1. Создадим в конфигурации ОбщийМакет с типом ВнешняяКомпонента.
  2. Загрузим в него содержимое архива NPUPWindowWidget.zip.
  3. В коде 1С инициализируем подключение следующим образом:

// Пример подключения из общего макета
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.WindowWidget", "WindowWidget", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
    Виджет = Новый ("AddIn.WindowWidget.WindowWidget");
КонецЕсли;

Способ 2: Загрузка из внешнего файла (DLL)

Этот вариант подходит для этапа разработки или для использования во внешних обработках без изменения метаданных конфигурации.

  1. Распакуем DLL-файл компоненты в локальный каталог на диске.
  2. Укажем прямой путь к файлу в методе подключения.

// Пример подключения по пути к файлу
ПутьККомпоненте = "C:\Components\WindowWidget.dll";
Результат = ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "WindowWidget", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
    Виджет = Новый ("AddIn.WindowWidget.WindowWidget");
КонецЕсли;

Управление графическим окном

После успешного создания объекта Виджет, мы получаем доступ к методам управления Win32-окном. Рассмотрим основные возможности, которые предоставляет MVP-версия компоненты:

Практические сценарии использования

Многие разработчики задаются вопросом: «Зачем это нужно, если в 1С есть формы?». Проанализируем ситуации, где штатные средства платформы оказываются менее эффективными:

  1. Индикатор длительных фоновых процессов: Представьте ситуацию, когда выполняется тяжелый обмен данными. Пользователь может свернуть 1С или открыть другое приложение. Окно, созданное через WindowWidget, может оставаться на экране, показывая статус выполнения процесса (процент загрузки, текущую операцию).
  2. Виджеты мониторинга (Dashboards): Вывод оперативной информации, такой как текущий курс валют, количество активных звонков в колл-центре или критические остатки на складе. Такое окно может висеть в углу экрана, не мешая основной работе в 1С.
  3. Кастомные уведомления: Стандартные оповещения 1С имеют ограниченное время жизни и жесткий дизайн. С помощью внешней компоненты можно реализовать уведомления, которые будут требовать явного действия пользователя или иметь уникальное визуальное оформление.

Перспективы развития и обратная связь

Посмотрим на планы развития проекта. На текущем этапе компонента является MVP (Minimum Viable Product). Это означает, что реализован базовый функционал вывода графики, но архитектурно заложен огромный потенциал.

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

Важный момент для разработчиков: так как решение завязано на Win32 API, оно функционирует исключительно в среде Windows (7, 10, 11). Поддержка Linux или macOS в данной архитектурной модели не предусмотрена, что необходимо учитывать при проектировании кроссплатформенных систем.

Подводя итог, можно сказать, что использование Native API для создания кастомных графических элементов — это мощный инструмент в руках 1С-программиста, позволяющий выйти за рамки стандартного интерфейса платформы и повысить удобство работы конечных пользователей.

← На главную