В процессе разработки на платформе 1С:Предприятие 8.3 с интерфейсом «Такси» программисты часто сталкиваются с ограничением: каждое окно (форма) по умолчанию открывается на весь экран или в отдельной вкладке. Однако возникают задачи, когда необходимо отобразить две формы одновременно — например, список документов и панель инструментов или вспомогательную обработку. Мы проанализируем ситуацию, разберем доступные методы и выясним, как реализовать подобный функционал программно и интерактивно.
Прежде всего, важно понимать идеологию интерфейса Управляемого приложения. Платформа 1С самостоятельно управляет окнами, стараясь максимально упростить интерфейс для пользователя. В объектной модели УправляемаяФорма отсутствует прямой метод типа ОткрытьВместеСДругойФормой(). Тем не менее, потребность в разделении рабочего пространства остается актуальной. Разберем по шагам, какие инструменты у нас есть в арсенале.
Рассмотрим достаточно нестандартный, но действенный метод, предложенный участниками сообщества. Если нам нужно программно заставить систему выполнить команду объединения окон, которую пользователь обычно вызывает из меню, мы можем имитировать нажатие горячих клавиш. Этот метод подходит для толстого и тонкого клиента под управлением ОС Windows.
Для реализации этого метода мы будем использовать COM-объект WScript.Shell. Посмотрим на пример кода (его можно протестировать через встраиваемую консоль кода):
// Контекст: НаКлиенте
Процедура ОткрытьИОбъединитьФормы()
// Открываем первую форму
Форма1 = ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаОбъекта");
// Открываем вторую форму
Форма2 = ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка");
// Используем скрипт для имитации системных команд объединения окон
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
// Последовательность клавиш для вызова меню объединения окон
WshShell.SendKeys("%-{UP 4}{RIGHT}{DOWN}{RIGHT}{UP 2}{ENTER}");
Исключение
Сообщить("Не удалось объединить окна программно: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В данном примере SendKeys передает последовательность нажатий клавиш (Alt + системное меню), которая активирует функцию платформы "Показать вместе с другим (горизонтально/вертикально)". Проанализируем минусы: этот код привязан к конкретной версии платформы и раскладке меню, а также абсолютно неработоспособен в веб-клиенте.
Если программный метод кажется слишком рискованным, мы должны знать, как работает штатный механизм объединения, чтобы проинструктировать пользователей или использовать эти знания в документации. Платформа 8.3 позволяет объединять два окна, которые будут отображаться рядом.
Разберем основные правила объединения окон:
Для вызова этой функции в интерфейсе «Такси» следует нажать на заголовок формы правой кнопкой мыши или воспользоваться кнопкой в области системных команд (вверху окна).
Выясним причину, по которой опытные разработчики предпочитают не использовать «склейку» двух разных форм, а создают одну сложную форму. Это самый надежный способ, работающий во всех клиентах, включая мобильные.
Суть заключается в динамическом создании элементов управления на одной «родительской» форме. Мы можем программно (или используя готовые решения для динамического создания реквизитов без кодирования) добавить реквизиты и элементы других объектов. Рассмотрим, как это работает:
Во-первых, мы создаем основную форму обработки, которую делим на две группы (левая и правая). Во-вторых, программно добавляем на нее нужные данные, применяя общие модули для программного изменения форм.
// Пример программного добавления динамического списка на форму
&НаСервере
Процедура ДобавитьСписокНаФорму()
// 1. Добавляем реквизит формы типа ДинамическийСписок
ДобавляемыеРеквизиты = Новый Массив;
РеквизитСписок = Новый РеквизитФормы("СписокРеализаций", Новый ОписаниеТипов("ДинамическийСписок"), , "Реализации");
ДобавляемыеРеквизиты.Добавить(РеквизитСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// 2. Настраиваем динамический список
ЭтаФорма.СписокРеализаций.ОсновнаяТаблица = "Документ.РеализацияТоваровУслуг";
// 3. Создаем элемент формы - Таблицу
ГруппаЛево = Элементы.ГруппаЛево; // Группа должна быть создана в конфигураторе
НоваяТаблица = Элементы.Добавить("ТаблицаРеализаций", Тип("ТаблицаФормы"), ГруппаЛево);
НоваяТаблица.ПутьКДанным = "СписокРеализаций";
// 4. Добавляем колонки в таблицу
НовоеПоле = Элементы.Добавить("РеализацияНомер", Тип("ПолеФормы"), НоваяТаблица);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "СписокРеализаций.Номер";
КонецПроцедуры
Используя метод ИзменитьРеквизиты() и Элементы.Добавить(), мы фактически собираем интерфейс из кусочков других форм внутри одного окна. Это обеспечивает полный контроль над событиями и синхронизацию данных между «частями» окна.
В современных версиях 1С 8.3 можно управлять составом Рабочей области начальной страницы. Если ваша задача — открывать формы при старте или в качестве основного рабочего места, рассмотрим метод УстановитьНастройкуРабочейОбласти().
Проанализируем пример настройки:
Настройка = Новый НастройкаРабочейОбласти;
НоваяСтрока = Настройка.Состав.Добавить();
НоваяСтрока.ЛеваяКолонка.Добавить("Обработка.МояРабочаяПанель.Форма");
НоваяСтрока.ПраваяКолонка.Добавить("Документ.РеализацияТоваровУслуг.ФормаСписка");
УстановитьНастройкуРабочейОбласти(Настройка);
Этот метод позволяет жестко задать, какие формы и в каких колонках будут отображаться на главном экране пользователя. Это единственный «штатный» программный способ размещения двух форм в одном пространстве без использования внешних компонент или имитации кликов.
Мы рассмотрели несколько вариантов решения задачи. Выбор метода зависит от ваших целей:
WScript.Shell и SendKeys.Несмотря на то, что за последние годы 1С не добавила простой команды для программной «склейки» окон, комбинация динамического построения интерфейса и управления рабочими областями позволяет реализовать практически любой сценарий компоновки форм.