Как реализовать нескрываемую форму или виджет в 1С 8.3 на управляемых формах

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

В современной разработке на платформе 1С 8.3 часто возникает задача создания так называемых «виджетов» — небольших информационных окон, которые должны постоянно находиться перед глазами пользователя. Это могут быть счетчики текущих заказов, показатели KPI, курсы валют или оперативные сводки по складу. Основная сложность заключается в том, что управляемый интерфейс (особенно в режиме «Такси») диктует свои правила расположения окон, стремясь максимально эффективно использовать рабочее пространство, что иногда мешает зафиксировать отдельную форму «поверх всего».

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

Метод 1. Программное закрепление формы в интерфейсе

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

Для реализации этого метода проанализируем возможности функции ОткрытьФорму(). Мы можем использовать механизм настройки рабочего стола или программно изменять состояние окна. Рассмотрим пример кода, который открывает форму и закрепляет её:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.Независимый);

ФормаВиджет = ПолучитьФорму("ОбщаяФорма.ПоказателиПродаж", ПараметрыОткрытия);
// В интерфейсе Такси пользователь может сам закрепить окно, 
// но мы можем управлять положением через настройки рабочего стола
ФормаВиджет.Открыть();

Важный нюанс: Чтобы форма стала по-настоящему «частью» интерфейса и не перекрывалась другими окнами, наиболее эффективным способом будет использование встроенной «Информационной панели». В настройках интерфейса («Настройка панелей») можно вынести «Панель текущих дел» или другие области в правую или левую часть экрана. Программист может создать свою форму и включить её в состав рабочей области начальной страницы.

Метод 2. Использование информационных панелей в интерфейсе «Такси»

Разберем по шагам, как использовать штатную область мониторинга, которая не будет скрываться при открытии новых документов:

  1. Создадим специальную форму (например, ФормаМониторинга).
  2. В свойствах конфигурации перейдем в раздел «Открыть рабочую область начальной страницы».
  3. Добавим нашу форму в одну из колонок (левую или правую).
  4. Настроим видимость так, чтобы эта панель была доступна нужным ролям пользователей.

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

Метод 3. Реализация режима «Always on Top» через Windows API

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

Для реализации этого метода потребуется внешняя компонента (например, на технологии Native API), которая умеет работать с функциями операционной системы Windows. Основная функция, которая нам интересна — SetWindowPos из библиотеки user32.dll.

Алгоритм работы следующий:

  1. Получаем дескриптор (HWND) окна нашей формы 1С.
  2. Передаем этот дескриптор во внешнюю компоненту.
  3. Компонента вызывает системную функцию с флагом HWND_TOPMOST.

Проанализируем пример логики (псевдокод для понимания процесса):


// Подключение компоненты
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаботыСОкнами");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаботыСОкнами", "WinAPI", ТипВнешнейКомпоненты.Native);

ОбъектAPI = Новый ("AddIn.WinAPI.WindowUtils");
ЗаголовокОкна = ЭтаФорма.Заголовок;
// Устанавливаем флаг "Поверх всех"
ОбъектAPI.SetAlwaysOnTop(ЗаголовокОкна, Истина);

Внимание: Использование внешних компонентов требует осторожности, так как это может повлиять на стабильность работы клиента, особенно в терминальных сессиях или при работе через веб-браузер.

Метод 4. Создание внешнего «Тонкого виджета»

Рассмотрим ситуацию, когда стандартный интерфейс 1С слишком громоздкий для простой панели показателей. Профессиональным решением считается создание небольшого стороннего приложения (на C#, Python или Delphi), которое будет выполнять роль виджета.

Как это взаимодействует с 1С? Разберем основные пути интеграции:

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

Метод 5. Обновление данных и обработчик ожидания

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем обновление каждые 60 секунд (1 минута)
    ПодключитьОбработчикОжидания("ОбновитьПоказателиВиджета", 60);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьПоказателиВиджета()
    // Вызов серверного метода для получения свежих цифр
    Данные = ПолучитьДанныеССервера();
    // Обновление реквизитов формы
    ЭтаФорма.ТекущийПоказатель = Данные.Значение;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеССервера()
    // Здесь пишем запрос к БД
    Возврат РезультатЗапроса;
КонецФункции

Важное предостережение: Помните, что если в основном сеансе 1С открыто модальное окно (например, предупреждение или вопрос), выполнение обработчиков ожидания может приостановиться. Для критически важных систем мониторинга лучше использовать метод №4 (внешнее приложение).

Заключение

Мы проанализировали различные подходы к созданию нескрываемого виджета. Если вам нужно быстрое решение внутри платформы — используйте закрепленные панели или настройку рабочего стола. Если требуется полный контроль над окном и эффект «всегда сверху» — смотрите в сторону Windows API или внешних микро-приложений, взаимодействующих с 1С через HTTP-сервисы. Выбор зависит от того, насколько критично для пользователя постоянное присутствие этих данных на экране и какие технические ограничения накладывает ваша ИТ-инфраструктура.

← На главную