При разработке рабочих мест для пользователей в среде обычного приложения (толстого клиента) разработчики часто сталкиваются с желанием использовать преимущества управляемого интерфейса. Одной из таких задач является создание боковой панели (например, для рабочего стола менеджера) с использованием управляемых форм. Основной мотивацией часто выступают не только эстетические соображения, но и функциональные ограничения старого движка форм, такие как невозможность реализовать перенос текста по словам на стандартных кнопках.
В рамках данной статьи мы подробно разберем, почему прямое решение «прикрепить управляемую форму слева» неосуществимо штатными средствами, и проанализируем эффективные обходные пути, которые позволят добиться нужного визуального и функционального результата.
Разберем ситуацию с точки зрения архитектуры «1С:Предприятие». Обычное приложение и управляемые формы базируются на разных технологических стеках внутри платформы. Когда мы запускаем обычное приложение (толстый клиент), основным контейнером для интерфейса выступает главное окно приложения, спроектированное под работу с обычными формами.
Проанализируем, что происходит при попытке открыть управляемую форму в этом режиме. Платформа позволяет это сделать, если в свойствах конфигурации установлен флаг Использовать управляемые формы в обычном приложении. Однако управляемая форма при этом открывается как независимое окно. Проблема заключается в том, что механизмы «прикрепления» (докирования) окон к краям главного окна в обычном приложении рассчитаны исключительно на объекты типа Панель или специфические окна обычного интерфейса.
Важный вывод: Штатных средств для того, чтобы «задокировать» управляемую форму слева, справа или сверху главного окна, не существует. Она всегда будет отображаться либо как модальное окно, либо как свободное окно в пределах рабочего пространства, но не как часть структуры рабочего стола, жестко зафиксированная у края экрана.
Поскольку первопричиной поиска способа внедрения управляемой формы стало ограничение элемента Кнопка (невозможность многострочного вывода текста), нам следует рассмотреть, как решить эту конкретную задачу в рамках обычной формы. Это позволит нам остаться в рамках стандартной архитектуры и прикрепить форму к левому краю через стандартные настройки панелей.
Рассмотрим самый простой и производительный способ — использование стандартного элемента управления Надпись (Label). В обычных формах этот элемент обладает гибкостью, которой лишена стандартная кнопка.
Разберем реализацию этого метода по шагам:
Надпись.Гиперссылка. Это заставит курсор менять вид при наведении и позволит элементу реагировать на нажатия.Выделять гиперссылку, если это необходимо для визуального акцента.Автоперенос (или просто увеличим высоту элемента и введем текст с переносами).Рамка), цвет фона и выравнивание текста по центру.Для обработки нажатия нам потребуется создать процедуру-обработчик события Нажатие. Посмотрим на пример кода:
Процедура НадписьКнопкаНажатие(Элемент)
// Здесь описываем логику, которая должна выполняться при нажатии
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора");
КонецПроцедуры
Таким образом, мы получаем визуальный элемент, который выглядит как кнопка, поддерживает многострочный текст и корректно работает в закрепленной обычной форме.
Если требования к дизайну рабочего стола менеджера более высокие (нужны градиенты, специфические отступы, сложные эффекты при наведении), проанализируем использование элемента ПолеHTMLДокумента. Это наиболее мощный инструмент в обычных формах.
Этот метод позволяет нам буквально «нарисовать» интерфейс с помощью HTML и CSS. Разберем, как это реализовать:
ПолеHTMLДокумента.Пример формирования контента:
ТекстHTML = "<html><body>
|<style>
|.myButton {
| background-color: #f0f0f0;
| border: 1px solid #888;
| padding: 10px;
| text-align: center;
| cursor: pointer;
| width: 150px;
|}
|</style>
|<div class='myButton' onclick='window.location.href=\"v8action:ClickButton1\"'>
| Длинный текст кнопки с переносом по словам
|</div>
|</body></html>";
ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML);
Чтобы 1С перехватила нажатие в HTML, используем событие ПриНажатии (или onclick с переходом по ссылке). Выясним причину использования схемы v8action: — это позволяет нам передать сигнал из браузерного движка обратно в код 1С.
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если Найти(ДанныеСобытия.Event.target.onclick, "ClickButton1") > 0 Тогда
СтандартнаяОбработка = Ложь;
// Выполняем действие в 1С
Предупреждение("Нажата кнопка из HTML!");
КонецЕсли;
КонецПроцедуры
Как предлагалось в обсуждении на форуме, можно пойти по пути использования изображений. Если количество кнопок фиксировано и их текст меняется редко, мы можем подготовить качественные изображения кнопок с уже нанесенным текстом в графическом редакторе.
В 1С это реализуется через свойство кнопки Картинка. Однако у стандартной кнопки есть минус — она все равно будет пытаться рисовать рамку. Поэтому часто используют объект ПолеКартинки с обработкой события Нажатие. Это дает полный контроль над визуальной составляющей, но усложняет локализацию и динамическое изменение текста.
Выясним, как же все-таки закрепить форму слева, если мы отказались от идеи с управляемыми формами. В обычном приложении для этого используются механизмы рабочего стола или программное создание панелей.
Рассмотрим шаги по закреплению обычной формы:
СостояниеОкна — Свободное.ЭтаФорма.ПанельПрижатаСлева = Истина (в зависимости от версии платформы и режима запуска) или настроить интерфейс через Конфигурация -> Открыть интерфейс, где визуально перетащить нужные панели в соответствующие области.
Если же стоит задача сделать это динамически, проанализируем использование объекта Панель. Мы можем программно добавлять элементы управления на панели главного окна, но это требует глубоких знаний объектной модели Интерфейсы старых версий 1С.
Если вы все же решили, что управляемая форма необходима (например, из-за сложной бизнес-логики, реализованной в типовых подсистемах), и готовы смириться с тем, что она не будет «прикреплена» к краю, обратите внимание на следующие нюансы:
&НаСервере и &НаКлиенте. Однако доступ к глобальным переменным обычного приложения из модуля управляемой формы будет ограничен.Оповестить() и ОбработкаОповещения().Подводя итог, можно сказать: прямого способа «вклеить» управляемую форму в структуру панелей обычного приложения не существует из-за фундаментальных различий в способах рендеринга интерфейса. Тем не менее, проанализировав потребности пользователя, мы нашли, что задача решается гораздо проще через стандартные инструменты обычных форм. Использование полей надписей с включенной гиперссылкой или полей HTML-документа позволяет обойти ограничения по переносу текста и создать современный, удобный интерфейс, который будет стабильно работать и надежно крепиться к любой стороне главного окна приложения.