Как встроить одну управляемую форму в другую в 1С:Предприятие и какие существуют обходные пути

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании сложных пользовательских интерфейсов в среде 1С:Предприятие разработчики часто сталкиваются с задачей отображения формы одного объекта внутри формы другого. Например, когда прямо в документе продажи необходимо показать интерактивный калькулятор скидок или форму подбора, реализованную в виде отдельной обработки.

Напрямую перетащить или «вставить» форму стороннего объекта (документа, справочника или обработки) внутрь другой формы платформа 1С не позволяет. Область начальной страницы (рабочий стол), где свободно компонуются разные формы, работает по совершенно иным системным алгоритмам. Тем не менее в современной платформе 1С:Предприятие 8.3 существует несколько отличных технологических альтернатив, позволяющих решить эту задачу. Рассмотрим подробно каждый из доступных способов.

Способ 1. Использование встроенного рабочего места и поля HTML-документа

Начиная с версии платформы 8.3.16, разработчикам доступен мощный механизм интеграции, позволяющий буквально запустить веб-клиент 1С внутри управляемой формы. Этот метод идеально подходит, если вам требуется полноценно отобразить интерфейс другой формы без ручного переноса ее реквизитов.

Давайте разберем по шагам, как настроить такое встраивание:

  1. Публикация базы на веб-сервере. Данный механизм работает через веб-технологии, поэтому информационная база (или целевая база, если формы берутся из другой конфигурации) должна быть опубликована на веб-сервере (IIS или Apache).
  2. Создание элемента на форме. В форме основного документа создаем элемент с типом ПолеHTMLДокумента. Назовем его, например, ПолеВстроеннойФормы.
  3. Параметризация запуска. Для запуска веб-клиента в режиме встраивания используется специальное системное свойство РежимОсновногоОкнаКлиентскогоПриложения.ВстроенноеРабочееМесто, которое активируется через параметр запуска в URL: MainWindowMode=EmbeddedWorkspace. В этом режиме интерфейс лишается системных панелей, разделов и меню, оставляя только рабочую область формы.

Проанализируем пример программного заполнения URL для поля HTML-документа при создании формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Формируем базовый адрес публикации нашей информационной базы
    БазовыйАдрес = "https://server-name/ib-name";
    
    // Указываем навигационную ссылку на конкретную форму обработки
    ПутьКФорме = "e1cib/app/Обработка.КалькуляторСкидок.Форма.Форма";
    
    // Собираем итоговый URL с параметром встроенного рабочего места
    АдресВстраивания = БазовыйАдрес + "/ru_RU/" + ПутьКФорме + "?MainWindowMode=EmbeddedWorkspace";
    
    // Записываем полученный адрес в реквизит, связанный с Полем HTML-документа
    URLHTMLПоля = АдресВстраивания;
    
КонецПроцедуры

Преимущества метода: Полноценная изоляция контекста встроенной формы, возможность открывать абсолютно любые объекты конфигурации (и даже формы из сторонних баз данных 1С). Благодаря Embedded WebClient API родительская и дочерняя формы могут обмениваться сообщениями по протоколу JavaScript в режиме реального времени.

Способ 2. Интерфейсный обходной путь через «Всплывающую группу»

Если ваша база работает преимущественно в тонком клиенте и не опубликована на веб-сервере, то использовать HTML-поле не получится. В этом случае на помощь приходит механизм всплывающих групп, появившийся в платформе 8.3.12.

Всплывающая группа позволяет визуально сымитировать открытие отдельного окна внутри текущей формы, при этом не блокируя весь остальной интерфейс приложения модальностью.

Давайте рассмотрим, как настроить всплывающую группу:

  1. В конфигураторе откройте форму вашего документа.
  2. Добавьте на форму новую группу элементов с типом Обычная группа.
  3. В панели свойств созданной группы найдите свойство Поведение и установите для него значение Всплывающая.
  4. Разместите внутри этой группы все необходимые реквизиты и элементы управления, которые требуются для работы (фактически, продублируйте элементы целевой обработки).

Для программного управления видимостью этой группы используются специальные методы расширения управляемой формы. Посмотрим на практический пример вызова и скрытия всплывающего окна по кнопке:


&НаКлиенте
Процедура УправлениеОтображениемПанели(Команда)
    
    // Проверяем текущее состояние всплывающей группы
    Если Элементы.ГруппаДополнительныеПараметры.Скрыта() Тогда
        // Если скрыта — показываем пользователю поверх формы документа
        Элементы.ГруппаДополнительныеПараметры.Показать();
    Иначе
        // Если уже отображается — скрываем обратно в компактную ссылку
        Элементы.ГруппаДополнительныеПараметры.Скрыть();
    КонецЕсли;
    
КонецПроцедуры

Важное ограничение: Этот метод является чисто визуальным решением. Вам придется вручную переносить элементы и реквизиты сторонней обработки на форму документа, а также прописывать код синхронизации данных между реквизитами документа и реквизитами всплывающей группы.

Способ 3. Динамическое конструирование интерфейса (программная генерация элементов)

Для продвинутых разработчиков наиболее гибким решением является динамическое создание реквизитов и элементов формы «на лету». Вместо того чтобы вручную рисовать элементы в конфигураторе, мы можем программно считать структуру метаданных нужной обработки и воссоздать ее элементы прямо на форме документа в момент запуска.

Выясним, как это реализовать программно. Процесс состоит из трех основных шагов:

Шаг 1. Создание динамических реквизитов формы. Нам необходимо объявить новые реквизиты, которые будут хранить данные нашей «виртуальной» встроенной формы.


&НаСервере
Процедура СоздатьДинамическиеРеквизиты()
    
    МассивДобавляемыхРеквизитов = Новый Массив;
    
    // Описываем типы данных для создаваемых реквизитов
    ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200));
    ОписаниеТипаЧисло  = Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(15, 2));
    
    // Добавляем описание реквизитов в массив
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Интеграция_ИмяКлиента", ОписаниеТипаСтрока, , "ФИО Клиента", Истина));
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Интеграция_СуммаСкидки", ОписаниеТипаЧисло, , "Сумма скидки", Истина));
    
    // Применяем изменения к структуре формы
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
КонецПроцедуры

Шаг 2. Добавление элементов управления на форму. После создания реквизитов нам нужно вывести визуальные поля для ввода данных и связать их с созданными реквизитами.


&НаСервере
Процедура СоздатьЭлементыФормы()
    
    // Выбираем родительскую группу, куда будут помещены элементы
    РодительскаяГруппа = Элементы.ГруппаИнтегрированнаяОбработка;
    
    // Добавляем поле ввода для имени клиента
    НовоеПолеИмя = Элементы.Добавить("ПолеИмяКлиента", Тип("ПолеФормы"), РодительскаяГруппа);
    НовоеПолеИмя.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПолеИмя.ПутьКДанным = "Интеграция_ИмяКлиента";
    
    // Добавляем поле ввода для суммы скидки
    НовоеПолеСумма = Элементы.Добавить("ПолеСуммаСкидки", Тип("ПолеФормы"), РодительскаяГруппа);
    НовоеПолеСумма.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПолеСумма.ПутьКДанным = "Интеграция_СуммаСкидки";
    
    // Назначаем обработчик события при изменении суммы
    НовоеПолеСумма.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииСуммыСкидки");
    
КонецПроцедуры

Шаг 3. Обработка событий динамических элементов. Нам нужно объявить клиентский метод, который будет реагировать на действия пользователя во встроенной области.


&НаКлиенте
Процедура Подключаемый_ПриИзмененииСуммыСкидки(Элемент)
    
    // Получаем значение из динамически созданного реквизита
    ТекущаяСкидка = ЭтотОбъект["Интеграция_СуммаСкидки"];
    
    // Выполняем интерактивный перерасчет документа
    Если ТекущаяСкидка > 1000 Тогда
        ПоказатьПредупреждение(, "Введена крупная скидка! Требуется согласование руководителя.");
    КонецЕсли;
    
КонецПроцедуры

Рекомендация: Чтобы не загромождать модуль основной формы документа кодом динамической генерации элементов, используйте Расширения конфигурации. Вы можете вынести всю логику создания динамического интерфейса и обработчиков событий в расширение, сохранив типовую конфигурацию на поддержке без изменений.

Резюме

Прямого механизма встраивания одной формы в другую в 1С нет, но современные инструменты платформы позволяют решить эту задачу элегантно. Для веб-клиента и облачных решений оптимальным выбором будет Поле HTML-документа с параметром встроенного рабочего места. Если требуется быстрая реализация внутри одной базы без веб-сервера — используйте Всплывающие группы. Для создания гибких универсальных инструментов лучше всего подойдет Динамическое конструирование интерфейса.

← На главную