Как из сторонней программы развернуть окно 1С и открыть нужный объект?

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

При интеграции 1С:Предприятия со сторонними сервисами (системами телефонии, CRM, мессенджерами или фоновыми утилитами мониторинга) часто возникает задача: при наступлении определенного события активировать сеанс 1С, вывести свернутое окно на передний план и сразу открыть конкретный документ, элемент справочника или отчет.

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

Способ 1. Использование механизма навигационных ссылок и протокола e1c

Платформа 1С:Предприятие поддерживает работу с навигационными ссылками вида e1c:// и e1cib/. Каждому объекту информационной базы соответствует уникальная ссылка, которую можно получить программно с помощью функции ПолучитьНавигационнуюСсылку().

Разберем по шагам, как заставить операционную систему открывать 1С по такой ссылке из стороннего приложения:

  1. Получение навигационной ссылки в 1С:
    Для управляемой формы или ссылки на объект формируется строка навигации:
    
    СсылкаНаДокумент = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект);
    // Пример возвращаемой строки: "e1cib/data/Документ.ЗаказКлиента?ref=80dc00155d010b0111e9b2c3d4e5f6a7"
    
  2. Регистрация протокола e1c в реестре Windows:
    Чтобы операционная система знала, какую программу запускать при обращении к протоколу e1c://, необходимо добавить параметры в системный реестр:
    
    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\e1c]
    @="URL:e1c"
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOT\e1c\shell]
    
    [HKEY_CLASSES_ROOT\e1c\shell\open]
    
    [HKEY_CLASSES_ROOT\e1c\shell\open\command]
    @="\"C:\\Program Files\\1cv8\\common\\1cestart.exe\" /URL \"%1\""
    
  3. Поведение платформы при передаче ссылки:
    Когда внешняя программа выполняет запуск зарегистрированного URL или вызывает исполняемый файл тонкого клиента (1cv8c.exe) с ключом /URL "<Ссылка>", платформа проверяет активные процессы. Если сеанс с этой информационной базой уже запущен у текущего пользователя, второй экземпляр программы не открывается — платформа автоматически передает команду в работающий сеанс, разворачивает окно и открывает указанный объект.

Способ 2. Запуск сеанса и передача контекста через параметры командной строки

Если сеанс 1С гарантированно не запущен, а его требуется открыть «с нуля» на определенном объекте, используем запуск с ключом /C.

Проанализируем порядок действий:

  1. Запуск из внешней программы или командной строки:
    
    "C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /IBName "МояБаза" /N "Пользователь" /P "Пароль" /C "OpenDoc:80dc00155d010b0111e9b2c3d4e5f6a7"
    
  2. Обработка параметра в модуле управляемого приложения:
    В процедуре ПриНачалеРаботыСистемы считываем переданные данные через глобальное свойство ПараметрыЗапуска:
    
    Процедура ПриНачалеРаботыСистемы()
        
        Если ЗначениеЗаполнено(ПараметрыЗапуска) Тогда
            Если СтрНачинаетсяС(ПараметрыЗапуска, "OpenDoc:") Тогда
                Идентификатор = СтрЗаменить(ПараметрыЗапуска, "OpenDoc:", "");
                УникальныйИдентификатор = Новый УникальныйИдентификатор(Идентификатор);
                Ссылка = Документы.ЗаказКлиента.ПолучитьСсылку(УникальныйИдентификатор);
                
                ПараметрыФормы = Новый Структура("Ключ", Ссылка);
                ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);
            КонецЕсли;
        КонецЕсли;
        
    КонецПроцедуры
    

Способ 3. Гарантированный вывод окна 1С на передний план через WinAPI

В современных версиях Windows действует системная защита от перехвата фокуса (Focus Stealing Prevention). Если сторонняя фоновая программа просто вызовет функцию SetForegroundWindow для дескриптора (HWND) окна 1С, окно может не развернуться, а кнопка приложения на панели задач начнет мигать оранжевым цветом.

Выясним, как обойти это ограничение из внешней утилиты (на C#, C++, PowerShell или AutoIt):

  1. Поиск окна 1С: Главное окно тонкого или толстого клиента имеет системное имя класса V8TopLevelFrame (или V8TopLevelFrameSDI). Поиск осуществляется через вызов FindWindow("V8TopLevelFrame", ...).
  2. Восстановление из свернутого состояния: Если окно минимизировано, ему отправляется системная команда восстановления: ShowWindow(hWnd, SW_RESTORE).
  3. Связывание потоков ввода: Для обхода блокировки передачи фокуса поток внешней программы связывается с потоком окна 1С с помощью функции AttachThreadInput, после чего вызываются SetForegroundWindow и SetWindowPos с флагом вывода на самый верх (HWND_TOPMOST с последующим сбросом на HWND_NOTOPMOST).
  4. Альтернатива: Вызов функции WinAPI AllowSetForegroundWindow(ASFW_ANY) перед переключением фокуса.

Способ 4. Передача событий в работающий сеанс через внешнюю компоненту

Если 1С уже запущена, а открывать новые процессы или периодически опрашивать диск через ПодключитьОбработчикОжидания() нерационально, применяется архитектура с внешней компонентой (Native API):

  1. В клиентский сеанс 1С загружается компонента, открывающая локальный сокет (TCP/IP) или именованный канал (Named Pipe).
  2. Внешнее приложение (например, телефония или служба уведомлений) отправляет JSON или строку с навигационной ссылкой в этот канал.
  3. Компонента генерирует событие ВнешнееСобытие (ExternalEvent).
  4. В глобальном модуле или модуле формы 1С перехватывается вызов:
    
    Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
        
        Если Источник = "ExternalNotifier" И Событие = "OpenObject" Тогда
            // Данные содержат навигационную ссылку e1cib/...
            ПерейтиПоНавигационнойСсылке(Данные);
        КонецЕсли;
        
    КонецПроцедуры
    

Способ 5. Использование штатной Системы взаимодействия

Если в базе настроена «Система взаимодействия», наиболее простым и надежным решением является отправка push-сообщения конкретному пользователю от имени сервисного бота или через HTTP-сервис 1С.

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

← На главную