В процессе разработки сложных интерфейсов, таких как автоматизированные рабочие места (АРМ), диспетчерские панели или комплексные мониторы управления, программисты часто сталкиваются с задачей: можно ли отобразить форму одного объекта внутри формы другого объекта? При этом критически важно сохранить весь интерактивный функционал вложенной формы — обработку событий, интерактивный ввод данных, работу динамических списков и командных панелей.
Напрямую перетащить готовую форму внутрь другой формы как обычный элемент управления в среде разработки «1С:Предприятие» невозможно. Платформа проектировалась так, что каждая управляемая форма — это самостоятельный контекст со своими реквизитами, командами и программным модулем. Тем не менее эту задачу можно решить несколькими высокотехнологичными способами. Разберем по шагам все доступные варианты решения: от современных штатных механизмов платформы до проверенных временем обходных путей.
Ранее использование поля HTML-документа для таких задач считалось нестандартным решением. Однако начиная с версии платформы 8.3.16, разработчики 1С превратили этот подход в мощную официальную технологию. Платформа перевела поле HTML-документа на современный движок Chromium, что позволило запускать полноценный веб-клиент 1С прямо внутри тонкого или толстого клиента.
Проанализируем, как устроен этот механизм:
ПолеHTMLДокумента.РежимОсновногоОкнаКлиентскогоПриложения.ВстроенноеРабочееМесто. В этом режиме у вложенного приложения скрываются системные панели, меню функций, заголовки и панели открытых окон. Визуально форма выглядит так, будто она бесшовно встроена в макет родительской формы.ОкноВнешнегоСайта и метода postMessage на стороне JavaScript или через специализированные обработчики на стороне встроенного языка 1С.Этот способ идеален, когда необходимо встроить сложную форму стороннего объекта (например, карточку задачи или отчет) без дублирования ее программного кода и логики интерфейса. Для автоматизации действий внутри таких встроенных веб-страниц можно использовать платформу RPA для роботизации сценариев пользователя.
Если публикация базы на веб-сервере невозможна или нежелательна, рассмотрим метод динамического воссоздания структуры целевой формы. Вместо статического копирования элементов на этапе разработки, мы можем написать универсальный алгоритм, который будет «собирать» нужный интерфейс прямо во время работы системы. Для практического освоения этой технологии можно использовать пример динамического добавления и удаления элементов управляемой формы.
Посмотрим на пример реализации этого метода на сервере при создании родительской формы:
// Процедура динамически добавляет реквизиты и элементы другой формы
&НаСервере
Процедура ДинамическиВстроитьРеквизитыИЭлементы()
// 1. Определяем массив добавляемых реквизитов
МассивДобавляемыхРеквизитов = Новый Массив;
// Добавляем реквизит для связи с данными целевого объекта
РеквизитСсылка = Новый РеквизитФормы("ВстроенныйОбъектСсылка", Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг"));
МассивДобавляемыхРеквизитов.Добавить(РеквизитСсылка);
// Добавляем строковый реквизит для отображения текстового поля
РеквизитТекст = Новый РеквизитФормы("ВстроенныйКомментарий", Новый ОписаниеТипов("Строка"), , "Комментарий документа", Истина);
МассивДобавляемыхРеквизитов.Добавить(РеквизитТекст);
// Фиксируем изменения в контексте формы
ЭтотОбъект.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// 2. Создаем элементы управления на форме
// Создаем группу для визуального отделения встроенной формы
ГруппаВстраивания = Элементы.Добавить("ГруппаВстроеннойФормы", Тип("ГруппаФормы"), Элементы.ОсновнаяГруппа);
ГруппаВстраивания.Вид = ГруппаФормыВид.ОбычнаяГруппа;
ГруппаВстраивания.Отображение = ОтображениеПанелиОбычнойГруппы.Линия;
ГруппаВстраивания.Заголовок = "Информация о документе продажи";
// Добавляем поле ввода, связанное с динамически созданным реквизитом
НовоеПоле = Элементы.Добавить("ПолеКомментарий", Тип("ПолеФормы"), ГруппаВстраивания);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "ВстроенныйКомментарий";
КонецПроцедуры
Выясним причину, почему этот метод требует высокой квалификации разработчика. Главная сложность заключается в переносе обработчиков событий (например, при нажатии на кнопки или изменении значений полей). Программный код модуля встраиваемой формы невозможно автоматически скопировать в модуль родительской формы. Нам придется объявлять универсальные обработчики событий на стороне родительской формы и перенаправлять вызовы в экспортные методы модуля менеджера или общего модуля целевого объекта.
Когда требуется внедрить форму одного объекта в форму другого внутри типовой конфигурации (например, в решениях ERP, КА или УТ), крайне не рекомендуется изменять сами объекты напрямую, чтобы не усложнять последующие обновления системы. В этом случае правильным стандартом разработки является использование механизма Расширений конфигурации.
Разом разберем схему работы через расширение:
Если полноценное внедрение элементов внутрь разметки родительской формы не является критичным требованием, а важно лишь визуально удерживать две формы рядом, платформа предоставляет встроенный механизм связывания окон. Для этого используется свойство формы СоединяемоеОкно или открытие формы с указанием владельца.
Рассмотрим пример программного открытия соединенной формы:
&НаКлиенте
Процедура ОткрытьСоединеннуюФорму()
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Ключ", Объект.ДокументОснование);
// Указываем текущую форму в качестве владельца для автоматической связи окон
ОкноВладелец = ЭтаФорма;
// Открываем форму сопряженного объекта
ОткрытьФорму(
"Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",
ПараметрыОткрытия,
ОкноВладелец,
Истина, // Уникальность окна
РежимОткрытияОкнаФормы.Незаблокированный
);
КонецПроцедуры
При таком подходе открываемое окно жестко привязывается к родительскому окну. Если пользователь перемещает, сворачивает или закрывает родительскую форму, соединенное окно автоматически повторяет эти действия. Это создает иллюзию единого рабочего пространства без необходимости сложного программного перестроения интерфейса.
Многие разработчики обращают внимание на то, как реализован «Рабочий стол» пользователя в конфигурации «1С:Документооборот». На первый взгляд кажется, что в одно окно встроены формы задач, почты, календаря и навигатора.
Проанализируем эту ситуацию. На самом деле здесь нет динамического внедрения сторонних форм. Разработчики фирмы «1С» спроектировали одну монолитную комплексную форму. Все элементы управления (списки задач, календари) принадлежат этой единой форме, а их данные подгружаются через программные запросы к различным регистрам и справочникам. Если вам нужен максимальный уровень быстродействия и бесшовности интерфейса, создание одной монолитной формы, заменяющей собой несколько отдельных, часто оказывается самым надежным архитектурным решением.
Выбор конкретного метода зависит от технических условий проекта: