В практике разработчика 1С часто возникает задача интеграции нескольких информационных баз. Одной из наиболее типичных ситуаций является необходимость взаимодействия с системой ведения нормативно-справочной информации (MDM). Например, пользователю в текущей базе (например, «Бухгалтерия») нужно оперативно создать заявку на добавление нового контрагента в базе MDM, не переключаясь между окнами. В данной статье мы подробно разберем несколько способов реализации этой задачи: от классического COM-соединения до современных HTTP-сервисов.
Если нам требуется не просто передать данные «под капотом», а именно визуально открыть форму обработки или документа в другой базе, мы можем использовать COM-объект V83.Application. Этот метод запускает полноценный сеанс второй базы, что позволяет взаимодействовать с ее интерфейсом.
Рассмотрим по шагам процесс установки соединения и вызова формы. Для начала проанализируем функцию установки связи, которая принимает параметры подключения (путь к базе, логин и пароль):
Функция УстановитьСОМСоединение(ПутьКБазе, Пользователь, Пароль) Экспорт
Попытка
// Для актуальных версий платформы используем V83.Application
СОМ = Новый COMОбъект("V83.Application");
// Формируем строку соединения для файлового варианта
СтрокаСоединения = "File=""" + ПутьКБазе + """; Usr=""" + Пользователь + """; Pwd=""" + Пароль + """;";
// Пытаемся подключиться
Открыта = СОМ.Connect(СтрокаСоединения);
Возврат СОМ;
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
После того как объект соединения получен, мы можем обращаться к метаданным внешней базы. Например, чтобы открыть форму выбора документа или конкретную обработку, выполним следующий код:
Процедура ОткрытьФормуВоВнешнейБазе(ПараметрыСвязи)
СОМ = УстановитьСОМСоединение(ПараметрыСвязи.Путь, ПараметрыСвязи.Логин, ПараметрыСвязи.Пароль);
Если СОМ = Неопределено Тогда
Возврат;
КонецЕсли;
// Обращаемся к менеджеру документов внешней базы
МенеджерДокумента = СОМ.Документы.ЗаявкаНаНСИ;
// Получаем форму и открываем её модально или в обычном режиме
ФормаДокумента = МенеджерДокумента.ПолучитьФорму();
ФормаДокумента.Открыть();
// Не забываем обнулять COM-объект после завершения работы, чтобы освободить лицензию
СОМ = "";
КонецПроцедуры
Важное примечание: Использование V83.Application требует наличия установленной платформы 1С на клиентской машине и потребляет дополнительную лицензию. Также стоит учитывать разрядность: если сервер 64-битный, а вы используете 32-битные библиотеки comcntr.dll, потребуется настройка в компонентах COM+.
Если ваша задача — создать заявку в MDM-системе без обязательного открытия окна перед глазами пользователя, лучше использовать V83.COMConnector. Он работает быстрее, так как не инициализирует графический интерфейс (UI).
Проанализируем ситуацию: пользователь нажимает кнопку «Отправить заявку», и система программно создает объект в другой базе. Это более профессиональный и стабильный подход для интеграции данных.
Процедура СоздатьЗаявкуВMDM(ДанныеЗаявки)
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаСоединения = "Srvr=""ServerName"";Ref=""MDM_Base"";Usr=""Admin"";Pwd=""123"";";
Попытка
Соединение = Коннектор.Connect(СтрокаСоединения);
// Создаем новый объект в базе MDM
НоваяЗаявка = Соединение.Документы.ЗаявкаНаДобавление.СоздатьДокумент();
НоваяЗаявка.Дата = ТекущаяДата();
НоваяЗаявка.Наименование = ДанныеЗаявки.Наименование;
НоваяЗаявка.Автор = Соединение.ПараметрыСеанса.ТекущийПользователь;
НоваяЗаявка.Записать();
Сообщить("Заявка успешно создана под номером: " + НоваяЗаявка.Номер);
Исключение
Сообщить("Ошибка при создании объекта через COM: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Выясним причину, по которой COM-соединение может не подходить. Иногда политики безопасности или разная разрядность систем мешают работе COM. В этом случае можно использовать метод ЗапуститьПриложение(). Мы можем передать параметры в запускаемую базу через ключ /C.
Рассмотрим алгоритм действий:
ПриНачалеРаботыСистемы.Пример кода для запуска:
КомандаЗапуска = """C:\Program Files\1cv8\common\1cestart.exe"" ENTERPRISE /F ""D:\Bases\MDM"" /N ""User"" /P ""Password"" /C ""СоздатьЗаявку;Наименование=ООО Ромашка""";
ЗапуститьПриложение(КомандаЗапуска);
В целевой базе MDM проанализируем параметр ПараметрыЗапуска:
Процедура ПриНачалеРаботыСистемы()
Если Найти(ПараметрыЗапуска, "СоздатьЗаявку") > 0 Тогда
// Парсим параметры и открываем нужную обработку
Обработка = Обработки.НормализацияНСИ.Создать();
Форма = Обработка.ПолучитьФорму("Форма");
Форма.Открыть();
КонецЕсли;
КонецПроцедуры
Разберем по шагам наиболее надежный способ взаимодействия, который работает даже на Linux и через веб-браузер. Вместо того чтобы «открывать базу из базы», мы создаем HTTP-сервис в базе MDM.
Преимущества этого подхода:
Для реализации в базе MDM создается HTTP-сервис с шаблоном /create_request. В базе-источнике мы используем объект HTTPЗапрос. Посмотрим на пример кода отправки данных:
Процедура ОтправитьЧерезHTTP(Данные)
Сервер = "mdm.yourcompany.ru";
Соединение = Новый HTTPСоединение(Сервер, , "User", "Pass");
Запрос = Новый HTTPЗапрос("/v1/create_request");
// Формируем JSON с данными
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
СтрокаJSON = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Данные успешно переданы в MDM");
КонецЕсли;
КонецПроцедуры
Если база MDM опубликована на веб-сервере, вы можете использовать навигационные ссылки. Это самый простой способ «перебросить» пользователя к конкретному объекту или обработке. Мы формируем ссылку вида e1cib/data/Документ.Заявка?ref=ID и используем метод ПерейтиПоСсылке(). Это мгновенно откроет окно в браузере или тонком клиенте, если база уже запущена.
Проанализировав все способы, можно сделать следующие выводы:
V83.Application или командную строку с параметром /C.V83.COMConnector.Выбор метода зависит от архитектуры вашей сети и требований к интерфейсу. Для задач MDM наиболее эффективным считается сочетание HTTP-сервиса для передачи данных и навигационных ссылок для быстрого перехода пользователя к созданному объекту.