В практике интеграции систем на платформе 1С часто возникает задача «бесшовного» перехода между базами. Например, когда бухгалтер работает в «1С:Управление холдингом» и ему необходимо в один клик просмотреть первичный документ, находящийся в базе «1С:Бухгалтерия предприятия». Использование стандартного COM-соединения через V83.Application по умолчанию открывает всё окно внешней программы, что перегружает интерфейс и путает пользователя. В этой статье мы подробно разберем, как добиться открытия только нужной формы, скрыв при этом основное окно приложения, и рассмотрим более современные альтернативы этому методу.
Если специфика задачи требует использования именно OLE/COM-соединения, мы можем управлять видимостью главного окна приложения через свойство Visible. Однако простое переключение Visible = False приведет к тому, что открытая форма также останется невидимой. Чтобы форма «всплыла» перед пользователем, необходимо использовать модальный режим открытия.
Рассмотрим по шагам, как реализовать этот алгоритм:
V83.Application.Visible в значение Ложь.DoModal() (ОткрытьМодально).Проанализируем пример кода, который позволяет реализовать этот подход:
// Создаем соединение с внешней базой
V83App = Новый COMObject("V83.Application");
СтрокаСоединения = "Srvr=""MyServer"";Ref=""MyBase"";Usr=""Admin"";Pwd=""123"";";
Если V83App.Connect(СтрокаСоединения) Тогда
// Скрываем главное окно приложения
V83App.Visible = Ложь;
// Получаем ссылку на нужный документ (например, по ГУИД)
Идентификатор = "467c0a4a-067d-4dd6-80ec-ca6b2eb7d3be";
ВнешняяСсылка = V83App.Документы.РеализацияТоваровУслуг.ПолучитьСсылку(V83App.NewObject("УникальныйИдентификатор", Идентификатор));
// Формируем параметры для открытия формы
ПараметрыФормы = V83App.NewObject("Структура", "Ключ", ВнешняяСсылка);
// Получаем форму и открываем ее модально
// Важно: в Управляемом приложении используем GetForm или OpenForm
ВнешняяФорма = V83App.GetForm("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
ВнешняяФорма.DoModal();
КонецЕсли;
Важный нюанс: использование DoModal() полностью блокирует поток исполнения в вызывающей базе. Пока пользователь не закроет окно документа из внешней базы, он не сможет продолжить работу в основной программе. Также стоит учитывать, что при каждом таком вызове инициализируется полноценный сеанс 1С, что создает значительную нагрузку на ресурсы компьютера и занимает время на запуск (от 5 до 15 секунд).
Более современным и производительным способом является использование механизма навигационных ссылок. Этот метод не требует ручного управления COM-объектами и работает гораздо быстрее, так как платформа сама управляет поиском запущенных экземпляров клиентского приложения.
Разберем, как работает метод ПерейтиПоНавигационнойСсылке(). При передаче внешней ссылки платформа выполняет следующие действия:
Пример реализации перехода:
// Формируем внешнюю навигационную ссылку
// Формат: e1cib/data/<ПутьКОбъекту>?ref=<ВнутреннийИдентификатор>
// Или используем стандартную функцию получения ссылки
НавСсылка = "e1cib/data/Документ.РеализацияТоваровУслуг?ref=827c0a4a067d4dd680ecca6b2eb7d3be";
// Выполняем переход
ПерейтиПоНавигационнойСсылке(НавСсылка);
Для того чтобы этот метод работал «бесшовно» (без постоянного ввода пароля), рекомендуется настроить в системе сквозную аутентификацию (OS-Authentication) или использовать OpenID Connect. В этом случае окно авторизации не будет появляться, и форма откроется практически мгновенно.
Если вы хотите добиться максимальной интеграции без открытия новых окон Windows, рассмотрим вариант использования Поля HTML-документа на форме текущей базы. Если внешняя база (БП 3) опубликована на веб-сервере, мы можем встроить ее форму прямо внутрь интерфейса основной базы.
Для того чтобы скрыть заголовок и лишние панели навигации внешнего приложения в веб-клиенте, к URL навигационной ссылки можно добавить специальные параметры:
NOCAPTION — скрывает заголовок окна.OUI=0 — отключает основной пользовательский интерфейс (панели разделов и функций).Посмотрим на пример формирования такого URL:
АдресБазы = "https://server.com/base_bp3/";
НавСсылка = "e1cib/data/Документ.РеализацияТоваровУслуг?ref=...";
ПолныйURL = АдресБазы + "ru_RU/?" + "url=" + НавСсылка + "&NOCAPTION&OUI=0";
// Этот URL можно присвоить реквизиту формы с типом "Строка",
// который связан с элементом формы "Поле HTML-документа"
ЭтаФорма.АдресСтраницы = ПолныйURL;
Этот способ является самым кроссплатформенным, так как он будет работать и на Linux, и в веб-браузерах, где COM-объекты недоступны.
В ситуациях, когда пользователю достаточно только просмотреть данные без возможности редактирования, самым быстрым решением будет передача печатной формы в формате .mxl через HTTP-запрос. Это исключает необходимость запуска тяжелого клиентского приложения второй базы.
Разберем логику взаимодействия:
ТабличныйДокумент записывается во временный файл или поток в формате mxl и передается в виде двоичных данных.ТабличныйДокумент и отображаются в стандартном поле табличного документа на форме.Пример кода на стороне вызывающей базы:
HTTPСоединение = Новый HTTPСоединение("server_bp", , "user", "pass");
HTTPЗапрос = Новый HTTPЗапрос("/v1/get_print_form?uid=" + ДокументСсылка.УникальныйИдентификатор());
Результат = HTTPСоединение.Получить(HTTPЗапрос);
Если Результат.КодСостояния = 200 Тогда
ДвоичныеДанные = Результат.ПолучитьТелоКакДвоичныеДанные();
ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
ДвоичныеДанные.Записать(ИмяФайла);
ПечатнаяФорма = Новый ТабличныйДокумент;
ПечатнаяФорма.Прочитать(ИмяФайла);
ПечатнаяФорма.Показать("Просмотр документа в БП 3");
КонецЕсли;
Подведем итоги нашего анализа. Выбор метода зависит от бизнес-требований к скорости и функциональности:
При использовании любого из этих методов помните о производительности. Если вы выбрали COM-соединение, старайтесь кэшировать объект соединения в повторно используемом модуле или параметре сеанса, чтобы не тратить время на авторизацию при каждом клике пользователя.