При переходе с устаревших конфигураций (например, 1С:Управление производственным предприятием) на современные системы класса ERP разработчики часто сталкиваются с необходимостью временной или постоянной интеграции рабочих мест. Типичный сценарий: пользователю, работающему в новой ERP, нужно открыть форму обработки или справочника из старой УПП, причем сделать это так, чтобы интерфейс выглядел единым целым — без запуска лишних окон и переключения между приложениями.
Использование классического OLE/COM-соединения через V83.Application в данном случае не подходит, так как этот метод неизбежно запускает полноценный отдельный экземпляр приложения со своим главным окном, меню и панелями, что нарушает концепцию единого рабочего пространства. Кроме того, при разной разрядности операционной системы или клиентских приложений (например, 32-битная УПП и 64-битная ERP) COM-соединение начинает работать крайне нестабильно или требует сложных административных настроек DCOM.
В этой статье мы подробно разберем наиболее современные, стабильные и производительные архитектурные подходы, которые позволяют встроить управляемую форму из УПП напрямую в окно ERP.
---
Это наиболее элегантный и современный способ, заложенный в архитектуру платформы «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, что гарантирует быструю и корректную работу скриптов без ошибок совместимости.
---
Как справедливо заметили участники обсуждения, попытка отобразить «чужой» интерфейс внутри ERP — это часто попытка создать «костыль». Более надежным, быстрым и долговечным решением является создание **идентичной формы в ERP**, которая будет общаться со старой базой УПП в фоновом режиме через быстрые каналы связи (HTTP/Web-сервисы).
Давайте разберем по шагам, как реализовать этот подход:
Рассмотрим пример функции на стороне 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 на серверах и полную бесшовность для конечного пользователя.
---
Если задача интеграции сводится к тому, чтобы отобразить в ERP отчеты, списки документов или справочники из УПП для анализа и сверки данных (как в примере из обсуждения с базой Альфа-Авто), отличным решением станет использование механизма Внешних источников данных.
Выясним преимущества этого метода:
Для реализации этого метода:
_Reference85 или таблицы документов).Важное примечание: При использовании внешних источников данных напрямую через SQL будьте аккуратны с записью данных (прямым SQL-апдейтом). Запись в таблицы 1С в обход объектной техники платформы может нарушить ссылочную целостность базы УПП. На чтение данный механизм работает безупречно.