Как в окне приложения ERP открыть управляемую форму из УПП?

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

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

Использование классического OLE/COM-соединения через V83.Application в данном случае не подходит, так как этот метод неизбежно запускает полноценный отдельный экземпляр приложения со своим главным окном, меню и панелями, что нарушает концепцию единого рабочего пространства. Кроме того, при разной разрядности операционной системы или клиентских приложений (например, 32-битная УПП и 64-битная ERP) COM-соединение начинает работать крайне нестабильно или требует сложных административных настроек DCOM.

В этой статье мы подробно разберем наиболее современные, стабильные и производительные архитектурные подходы, которые позволяют встроить управляемую форму из УПП напрямую в окно ERP.

---

Способ №1. Бесшовная интеграция веб-клиента УПП через Поле HTML-документа (Рекомендуемый способ)

Это наиболее элегантный и современный способ, заложенный в архитектуру платформы «1С:Предприятие 8.3». Мы можем опубликовать базу УПП на веб-сервере и отобразить ее управляемую форму в ERP внутри стандартного элемента формы ПолеHTMLДокумента. Чтобы избежать эффекта «окна в окне» (когда внутри ERP показывается интерфейс УПП со всеми разделами и заголовками), мы задействуем специальный режим запуска.

Шаг 1. Публикация базы УПП и настройка режима встроенного рабочего места

Опубликуем базу УПП на веб-сервере (IIS или Apache). При формировании ссылки для открытия формы внутри ERP мы добавим специальный параметр запуска MainWindowMode=EmbeddedWorkplace (Встроенное рабочее место). Этот режим скрывает основную панель разделов, меню и заголовки веб-клиента УПП, оставляя видимым только тело самой формы.

Шаг 2. Встраивание в форму ERP

В ERP на управляемой форме создадим реквизит с типом Строка (например, АдресВстроеннойФормы) и свяжем его с элементом формы ПолеHTMLДокумента. Рассмотрим пример кода на стороне ERP для программного открытия нужной обработки из УПП:


&НаКлиенте
Процедура ОткрытьФормуУППВнутриERP()
    
    БазовыйАдрес = "http://имя_сервера/upp_web_db/ru_RU/";
    ПараметрыРежима = "?MainWindowMode=EmbeddedWorkplace";
    
    // Формируем навигационную ссылку на конкретную обработку в УПП
    НавигационнаяСсылка = "#e1cib/app/Обработка.ПомощникСопоставленияНоменклатуры";
    
    // Объединяем параметры
    АдресИсточника = БазовыйАдрес + ПараметрыРежима + НавигационнаяСсылка;
    
    // Передаем ссылку в ПолеHTMLДокумента
    Элементы.ПолеИнтеграцииHTML.Документ.location.href = АдресИсточника;
    
КонецПроцедуры

Шаг 3. Реализация двустороннего обмена данными с помощью webclient1ce.js

Для того чтобы ERP могла передавать параметры во встроенную форму УПП, а УПП могла возвращать результат выбора обратно в ERP, мы используем встроенную JavaScript-библиотеку webclient1ce.js. Платформа 1С автоматически генерирует этот скрипт при публикации базы на веб-сервере. Он доступен по относительному адресу: .../scripts/webclient1ce.js.

С помощью метода webClient.postMessage() мы можем отправлять сообщения между базами без зависаний интерфейса и без использования COM. Проанализируем, как это настраивается на стороне УПП:


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

&НаКлиенте
Процедура ПринятьКомандуИзERP(Сообщение, Источник)
    
    // Разбираем JSON или строку параметров, пришедшую из ERP
    Если Сообщение = "ЗаполнитьДанные" Тогда
        ВыполнитьЗаполнениеФормы();
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ПередатьДанныеНазадВERP(ДанныеРезультата)
    
    // Отправляем результат работы обратно в родительское окно ERP
    Если ОкноВнешнегоСайта.Доступно() Тогда
        ОкноВнешнегоСайта.ОтправитьСообщение(ДанныеРезультата);
    КонецЕсли;
    
КонецПроцедуры

В ERP мы перехватываем отправленное сообщение через событие ПриНажатии или специализированный обработчик событий JS в ПолеHTMLДокумента. Начиная с версии платформы 8.3.14, движком отображения в тонком клиенте является современный WebKit, что гарантирует быструю и корректную работу скриптов без ошибок совместимости.

---

Способ №2. Перенос интерфейсной части в ERP с запросом данных через API (Архитектурно правильный подход)

Как справедливо заметили участники обсуждения, попытка отобразить «чужой» интерфейс внутри ERP — это часто попытка создать «костыль». Более надежным, быстрым и долговечным решением является создание **идентичной формы в ERP**, которая будет общаться со старой базой УПП в фоновом режиме через быстрые каналы связи (HTTP/Web-сервисы).

Давайте разберем по шагам, как реализовать этот подход:

  1. В ERP создается пустая управляемая форма (или внешняя обработка), визуально полностью повторяющая нужную форму из УПП.
  2. В базе УПП создается HTTP-сервис, который умеет отдавать нужные данные в формате JSON и принимать измененные данные обратно.
  3. При открытии формы в ERP отправляется фоновый HTTP-запрос к УПП. Форма в ERP мгновенно заполняется полученными данными. Пользователь работает в родном интерфейсе ERP, не испытывая проблем со шрифтами, масштабированием или лицензированием веб-клиента.

Рассмотрим пример функции на стороне ERP, которая запрашивает данные о контрагенте напрямую из УПП по ИНН:


&НаСервереБезКонтекста
Функция ПолучитьДанныеКонтрагентаИзУПП(Знач ИНН)
    
    // Настраиваем соединение с HTTP-сервисом УПП
    Сервер = "upp.company.local";
    Порт = 80;
    ПользовательAPI = "IntegrationUser";
    ПарольAPI = "SecurePass123";
    
    HTTPСоединение = Новый HTTPСоединение(Сервер, Порт, ПользовательAPI, ПарольAPI);
    
    // Формируем запрос к нашему кастомному HTTP-сервису в УПП
    АдресРесурса = "/upp_db/hs/IntegrationAPI/v1/get_partner?inn=" + ИНН;
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
            // Читаем JSON в структуру платформы 1С
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(СтрокаJSON);
            Возврат ПрочитатьJSON(Чтение);
        Иначе
            ЗаписатьЛогОшибки("Ошибка сервера УПП: " + HTTPОтвет.КодСостояния);
            Возврат Неопределено;
        EndIf;
    Исключение
        ЗаписатьЛогОшибки("Ошибка сетевого подключения к УПП: " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Этот подход гарантирует высокую скорость работы, независимость от разрядности платформ, отсутствие необходимости администрирования DCOM/COM на серверах и полную бесшовность для конечного пользователя.

---

Способ №3. Использование механизма «Внешние источники данных»

Если задача интеграции сводится к тому, чтобы отобразить в ERP отчеты, списки документов или справочники из УПП для анализа и сверки данных (как в примере из обсуждения с базой Альфа-Авто), отличным решением станет использование механизма Внешних источников данных.

Выясним преимущества этого метода:

Для реализации этого метода:

  1. В конфигураторе ERP в ветке «Внешние источники данных» добавьте новое подключение к SQL-базе УПП.
  2. Выберите нужные таблицы (например, таблицы справочника Контрагентов _Reference85 или таблицы документов).
  3. Создайте стандартную форму списка для этой внешней таблицы прямо в ERP. Пользователь сможет открывать этот список, искать элементы по ИНН или коду, а при необходимости — использовать эти данные для автоматического создания объектов в ERP.

Важное примечание: При использовании внешних источников данных напрямую через SQL будьте аккуратны с записью данных (прямым SQL-апдейтом). Запись в таблицы 1С в обход объектной техники платформы может нарушить ссылочную целостность базы УПП. На чтение данный механизм работает безупречно.

← На главную