При разработке на управляемых формах в 1С часто возникает задача: при открытии из формы одного документа формы другого документа нужно программно расположить их рядом на экране. Например, для удобной сверки данных или одновременного редактирования. Давайте разберем эту ситуацию, проанализируем ограничения современной архитектуры 1С и рассмотрим все доступные варианты решения проблемы.
Если вы ранее работали с "обычными" формами, то наверняка помните, что у разработчиков были прямые инструменты для манипуляции окнами. Мы могли использовать свойства СостояниеОкна со значением ВариантСостоянияОкна.Прикрепленное и задавать ПоложениеПрикрепленногоОкна (например, слева или справа). Это давало полный контроль над интерфейсом.
С переходом на управляемые формы и интерфейс "Такси" парадигма кардинально изменилась. Платформа 1С забрала у программистов возможность жестко манипулировать координатами и привязками окон. Почему так произошло? Выясним причину: это было сделано для обеспечения кроссплатформенности и адаптивности интерфейса. Платформа должна одинаково хорошо отображать формы в веб-клиенте, на мониторах с разным разрешением и на мобильных устройствах. Именно поэтому стандартного метода вроде условного "ПрикрепитьСправа()" в современном API просто не существует.
Тем не менее, бизнес-задачи никуда не исчезли. Рассмотрим подробнее, как мы можем достичь нужного результата, используя правильные подходы.
Самая здравая и архитектурно правильная идея — отказаться от открытия второго окна и реализовать вывод нужной информации в контексте одной текущей формы. Посмотрим на примеры из типовых конфигураций: контактная информация в справочнике контрагентов ("Управление торговлей 11") или дополнительные свойства в номенклатуре. Вся информация выводится на одной форме. Для реализации такого подхода можно использовать руководство по встраиванию одной формы в другую.
Разберем по шагам, как это реализовать:
ГруппаСтраницы или обычную сворачиваемую группу).Если вы работаете с типовой конфигурацией и не хотите снимать ее с поддержки, эту задачу отлично можно решить с помощью расширений конфигурации: добавьте нужные элементы на форму через расширение, не ломая оригинальный код.
Если бизнес-процесс все-таки требует открытия именно отдельной формы (например, это полноценный другой документ со своей сложной логикой), мы можем воспользоваться штатными свойствами для более "интеллектуального" позиционирования.
Для начала проанализируем свойство управляемой формы ПоложениеОкна. По умолчанию оно имеет значение Авто или Центрировать. Если в конфигураторе задать этому свойству значение НеПерекрыватьВладельца, то при открытии новой подчиненной формы система сама постарается рассчитать начальные координаты так, чтобы она открылась рядом и не заслоняла собой форму-владельца.
Важный нюанс: чтобы две формы могли функционировать рядом и пользователь мог свободно переключаться между ними, при программном открытии необходимо явно указать режим. По умолчанию платформа часто открывает подчиненные окна в режиме блокировки владельца. Нам же нужен Независимый режим.
Рассмотрим пример кода:
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаВторойДокумент);
Режим = РежимОткрытияОкнаФормы.Независимый;
ОткрытьФорму(
"Документ.ЗаказКлиента.ФормаОъекта",
ПараметрыОткрытия,
ЭтаФорма,
УникальныйИдентификатор,
,
,
,
Режим
);
При таком подходе форма откроется как независимое окно, а платформа сама попытается сдвинуть его в сторону, чтобы обе формы были видны.
Иногда лучшим программным решением является отсутствие программного решения. Вместо того чтобы пытаться "прибить" окна кодом, достаточно обучить пользователей штатным механизмам платформы, которые специально созданы для таких сценариев.
В интерфейсе "Такси" есть мощный инструмент управления окнами. Если нажать на меню окна (кнопка с тремя точками в правом верхнем углу) или кликнуть правой кнопкой мыши по вкладке открытой формы, пользователю будут доступны следующие команды:
Напишите небольшую инструкцию для пользователей, и вы решите их проблему без написания костылей в коде.
Для полноты картины рассмотрим нетиповые методы принудительного управления окнами. Важно понимать, что они работают только под ОС Windows и только в тонком или толстом клиенте (в веб-клиенте они не сработают).
Эмуляция нажатий клавиш через WScript.Shell:
Можно программно вызвать метод SendKeys через COM-объект. Код имитирует нажатие клавиш (например, вызов контекстного меню и нажатие стрелок), чтобы заставить интерфейс 1С выполнить команду "Закрепить", как если бы это делал пользователь.
Внешние компоненты (Windows API):
Создаются внешние компоненты на языках C++ или C#. Они ищут дескрипторы (handle) окон 1С на уровне операционной системы и используют системную функцию SetWindowPos для принудительного изменения координат и размеров окон в обход платформы 1С.
Итог: Мы настоятельно рекомендуем использовать первые три варианта (перенос логики в одну форму, использование свойства НеПерекрыватьВладельца или обучение пользователей штатной функции "Показать вместе с другим окном"). Это обеспечит стабильную работу вашей конфигурации при любых обновлениях платформы 1С.