В процессе разработки сложных автоматизированных рабочих мест (АРМ) перед программистом часто встает задача отобразить две разные формы (например, список заказов и детальную информацию по выбранному объекту) одновременно в одной рабочей области. Стандартная идеология интерфейса "Такси" предполагает работу во вкладках, где каждая форма занимает всё доступное пространство. Однако существуют проверенные методики, позволяющие обойти это ограничение. Рассмотрим их подробно.
Проанализируем наиболее надежный и архитектурно правильный способ — создание специальной формы, которая будет выступать оболочкой для двух других. Вместо того чтобы пытаться заставить платформу соединить два независимых окна, мы создадим одно окно, разделенное на части.
Разберем реализацию по шагам:
ГруппаЛево и ГруппаПраво.Группировка в значение Горизонтальная.Посмотрим на пример программного заполнения такой формы-контейнера. Допустим, нам нужно вывести список справочника слева и форму документа справа. Мы можем использовать реквизиты формы с типом ДинамическийСписок для левой части и набор реквизитов для правой.
Пример кода для инициализации данных в форме-контейнере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Настраиваем динамический список для левой панели
СписокЗаказов.ТекстЗапроса = "ВЫБРАТЬ Ссылка, Номер, Дата ИЗ Документ.ЗаказКлиента";
// Если нужно программно добавить элементы, используем СоздатьЭлементыФормы()
// Рассмотрим вариант с использованием вложенных групп
Элементы.ГруппаПраво.Видимость = Ложь; // Скрываем правую часть до выбора объекта
КонецПроцедуры
Этот метод позволяет полностью контролировать поведение обеих частей окна, синхронизировать их данные и программно управлять размерами панелей.
Если задача заключается в том, чтобы пользователь видел две формы сразу при входе в систему или на главной странице, следует использовать механизм Рабочего стола. Платформа 1С позволяет гибко настраивать его состав программно.
Выясним, как это работает. В конфигураторе для рабочей области рабочего стола можно задать шаблон, например, "Две колонки". Далее, используя метод УстановитьСоставРабочейОбласти(), мы можем динамически менять формы, которые там отображаются.
Рассмотрим пример кода, который можно разместить в модуле управляемого приложения:
// В модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
Настройка = Новый НастройкаСоставаРабочейОбласти;
// Определяем, какие формы и в каких колонках будут отображаться
НоваяСтрока = Настройка.Состав.Добавить();
НоваяСтрока.ЛеваяФорма = "Справочник.Контрагенты.ФормаСписка";
НоваяСтрока.ПраваяФорма = "Документ.РеализацияТоваровУслуг.ФормаСписка";
УстановитьСоставРабочейОбласти(Настройка);
КонецПроцедуры
Важный нюанс: данный метод ограничен только основной рабочей областью приложения и не подходит для произвольного открытия окон в процессе работы пользователя в других разделах.
Начиная с версии платформы 8.3.15, возможности управления окнами расширились. Хотя прямой команды "разместить справа" для ОткрытьФорму по-прежнему нет, мы можем влиять на поведение окон через параметры.
Проанализируем ситуацию с параметром РежимОткрытияОкна. Если установить его в Независимый, форма откроется в отдельном окне поверх основного. Если пользователь один раз интерактивно "прикрепит" это окно к краю основного окна (функция "Прикрепить справа/слева"), платформа запомнит это положение для данной формы.
Чтобы программно имитировать разделение, мы можем использовать уникальные ключи. Посмотрим на пример:
ПараметрыФормы = Новый Структура("Ключ", ОбъектСсылка);
ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта",
ПараметрыФормы,
ЭтаФорма,
"УникальныйКлючОкна_1",
,
,
,
ВариантОткрытияОкна.ОтдельноеОкно);
При использовании ВариантОткрытияОкна.ОтдельноеОкно форма не будет блокировать основное окно, и пользователь сможет расположить их рядом. К сожалению, программно "приклеить" их друг к другу без участия пользователя в рамках чистого встроенного языка 1С невозможно.
Рассмотрим нестандартный и довольно трудоемкий способ, который упоминался специалистами. Можно создать форму, на которой размещено ПолеHTMLДокумента. В это поле загружается URL-адрес веб-клиента вашей же базы 1С с параметрами открытия конкретной формы.
Проанализируем плюсы и минусы этого подхода:
Для толстого и тонкого клиента под управлением Windows задачу можно решить с помощью вызовов API. Это позволяет принудительно изменить размеры и положение окон 1С. Для этого потребуется внешняя компонента, способная получить HWND окон.
Алгоритм работы выглядит так:
SetWindowPos для установки координат.Этот метод считается экстремальным и не рекомендуется для тиражных решений, так как он полностью привязан к операционной системе и версии клиента.
Подводя итог, можно сказать следующее: если вам необходимо гарантированное и стабильное решение для отображения двух областей данных в одном окне, используйте метод формы-контейнера. Это обеспечит максимальную производительность, отсутствие проблем с лицензированием и корректную работу во всех видах клиентов (тонкий, веб, мобильный).
Разберем финальный совет по реализации контейнера: чтобы не дублировать код логики в контейнере, выносите основные процедуры и функции в Модули менеджеров или Общие модули. Тогда и основная форма объекта, и ваша "сдвоенная" форма смогут использовать один и тот же программный код для обработки данных.