Как в 1С программно открыть ссылку в определенном браузере, даже если он не установлен по умолчанию?

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

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

Стандартный и наиболее простой метод платформы ЗапуститьПриложение("https://ya.ru") отлично справляется со своей задачей, но у него есть одна важная особенность: он открывает веб-ресурс исключительно в том браузере, который зарегистрирован в операционной системе Windows как браузер по умолчанию.

Однако в реальной практике этого бывает недостаточно. Разберем типичную ситуацию: у пользователя по умолчанию установлен Microsoft Edge. При этом внешняя система (например, личный кабинет Федеральной таможенной службы или портал для работы с электронными цифровыми подписями ЭЦП) корректно работает только в Google Chrome или Яндекс.Браузере, поскольку требует специфических плагинов шифрования. В то же время корпоративный банк-клиент может требовать работы исключительно в другом веб-браузере. В таких ситуациях перед разработчиком встает задача: принудительно открыть конкретную ссылку в строго определенном браузере.

В этой статье мы подробно проанализируем различные способы решения этой задачи, начиная от простых вариантов и заканчивая надежными динамическими алгоритмами корпоративного уровня.

Вариант 1. Явное указание жесткого пути (Простой, но хрупкий способ)

Самое очевидное решение, к которому приходят разработчики на форумах, — это передать методу ЗапуститьПриложение полный путь к исполняемому файлу конкретного браузера и через пробел указать нужную ссылку.

Посмотрим на пример реализации данного подхода:


// Открытие ссылки в Google Chrome с жестко заданным путем
ПутьКПриложению = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://ya.ru";
ЗапуститьПриложение(ПутьКПриложению);

На первый взгляд этот код решает проблему. Однако в реальных условиях эксплуатации данный метод крайне нестабилен и во многих случаях вызовет критическую ошибку "Файл не найден". Проанализируем ключевые причины, почему жесткое прописание путей (hardcoding) — это плохая практика:

  1. Разрядность операционной системы и приложений: Папка Program Files (x86) существует только на 64-битных версиях Windows. На 32-битных системах путь будет другим. Кроме того, современные версии Google Chrome часто устанавливаются в стандартный каталог C:\Program Files.
  2. Права пользователя при установке: Если у конечного пользователя на компьютере отсутствуют права локального администратора, то веб-браузеры устанавливаются в его персональный профиль (так называемая User-level установка). В этом случае исполняемый файл Chrome будет находиться по длинному динамическому пути внутри каталога AppData: C:\Users\ИмяПользователя\AppData\Local\Google\Chrome\Application\chrome.exe.
  3. Разнообразие браузеров: Яндекс.Браузер, Mozilla Firefox, Opera и Microsoft Edge имеют абсолютно разные структуры каталогов установки, которые могут меняться с выходом очередных обновлений программ.

Поэтому использовать жестко прописанные пути в тиражируемых конфигурациях крайне не рекомендуется.

Вариант 2. Динамический поиск пути к браузеру через реестр Windows

Чтобы программа без ошибок работала на компьютере любого пользователя, нам необходимо научить 1С динамически определять актуальный путь к исполняемому файлу нужного браузера. Операционная система Windows сохраняет пути ко всем зарегистрированным приложениям в системном реестре в ветке App Paths. Мы можем прочитать эти данные программно с помощью встроенного в Windows COM-объекта WScript.Shell.

Разберем по шагам создание универсальной функции для поиска исполняемого файла любого браузера (например, Chrome, Edge или Firefox):


// Функция выполняет поиск пути к исполняемому файлу браузера в системном реестре Windows.
// Параметр ИмяФайлаБраузера - строка, например "chrome.exe", "msedge.exe", "firefox.exe".
Функция ПолучитьПутьКБраузеру(ИмяФайлаБраузера) Экспорт
    
    // Создаем COM-объект для работы с системным окружением Windows
    Попытка
        Шелл = Новый COMОбъект("Wscript.Shell");
    Исключение
        ЗаписатьЛогСобытий("Не удалось создать объект Wscript.Shell для определения пути к браузеру.");
        Возврат "";
    КонецПопытки;
    
    ПутьКФайлу = "";
    ШаблонПутиРеестра = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ИмяФайлаБраузера + "\";
    
    // Шаг 1. Пытаемся прочитать путь из ветки HKEY_LOCAL_MACHINE (установка для всех пользователей)
    Попытка
        ПутьКФайлу = Шелл.RegRead("HKEY_LOCAL_MACHINE\" + ШаблонПутиРеестра);
    Исключение
        // Шаг 2. Если не найдено, ищем в HKEY_CURRENT_USER (установка для текущего пользователя без прав админа)
        Попытка
            ПутьКФайлу = Шелл.RegRead("HKEY_CURRENT_USER\" + ШаблонПутиРеестра);
        Исключение
            ПутьКФайлу = "";
        КонецПопытки;
    КонецПопытки;
    
    Возврат СокрЛП(ПутьКФайлу);
    
КонецФункции

Данный подход является профессиональным стандартом разработки под Windows. Он гарантирует получение точного пути к браузеру независимо от того, куда именно и под какими правами пользователь установил программу.

Правильная обработка пробелов и кавычек в путях запуска

После того как мы динамически получили путь к файлу браузера, нам нужно запустить его. Но здесь кроется еще одна распространенная проблема: пробелы в путях файлов (например, в названиях папок Program Files или Local Settings).

В операционной системе Windows пробел является разделителем параметров командной строки. Если мы попытаемся запустить приложение без дополнительного оборачивания пути в кавычки, операционная система воспримет пробел как конец пути к программе и выдаст ошибку.

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


Процедура ОткрытьСсылкуВХроме(Ссылка) Экспорт
    
    ПутьКChrome = ПолучитьПутьКБраузеру("chrome.exe");
    
    Если ЗначениеЗаполнено(ПутьКChrome) Тогда
        // Формируем безопасную командную строку: "C:\Program Files\...\chrome.exe" "https://ссылка"
        СтрокаЗапуска = """" + ПутьКChrome + """ """ + Ссылка + """";
        
        Попытка
            ЗапуститьПриложение(СтрокаЗапуска);
        Исключение
            Предупреждение("Не удалось запустить Google Chrome: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Предупреждение("Браузер Google Chrome не найден в операционной системе.");
    КонецЕсли;
    
КонецПроцедуры

Вариант 3. Использование встроенной команды Windows "start" (Альтернативный способ)

Если вы по каким-то причинам не хотите читать системный реестр, можно переложить задачу поиска установленной программы на командный интерпретатор самой операционной системы Windows с помощью команды start. Windows умеет самостоятельно сопоставлять зарегистрированные имена приложений и находить их.

Обычное использование метода КомандаСистемы("start chrome https://ya.ru") имеет существенный эргономический недостаток: на экране пользователя на долю секунды будет некрасиво "мелькать" черное окно консоли командной строки (cmd.exe). Чтобы избежать этого визуального дефекта, мы можем запустить процесс скрыто через метод Run объекта WScript.Shell с флагом скрытого окна (параметр равен 0):


Процедура ОткрытьВХромеЧерезСтарт(Ссылка) Экспорт
    Попытка
        Шелл = Новый COMОбъект("Wscript.Shell");
        // Запускаем через командный интерпретатор в скрытом режиме (0 - скрыть окно, Ложь - не ждать завершения)
        Команда = "cmd.exe /c start chrome """ + Ссылка + """";
        Шелл.Run(Команда, 0, Ложь);
    Исключение
        ЗаписатьЛогСобытий("Ошибка запуска ссылки через start: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Дополнительные параметры и ключи запуска браузеров

Принудительное открытие ссылок в альтернативных браузерах часто сопровождается необходимостью тонкой настройки сессии. Большинство современных веб-браузеров поддерживают параметры командной строки, которые передаются сразу после пути к исполняемому файлу.

Рассмотрим наиболее полезные ключи запуска, которые пригодятся вам при автоматизации бизнес-процессов:

Пример интеграции режима инкогнито в код 1С:


ПутьКChrome = ПолучитьПутьКБраузеру("chrome.exe");
Если ЗначениеЗаполнено(ПутьКChrome) Тогда
    // Запуск Chrome в режиме Инкогнито с передачей ссылки
    СтрокаЗапуска = """" + ПутьКChrome + """ --incognito """ + Ссылка + """";
    ЗапуститьПриложение(СтрокаЗапуска);
КонецЕсли;

Специфика работы в Веб-клиенте 1С

Особое внимание следует уделить архитектуре выполнения вашего кода в платформе 1С:Предприятие. Все вышеописанные методы (использование COM-объектов WScript.Shell, чтение реестра Windows и метод ЗапуститьПриложение с указанием исполняемых файлов) будут успешно работать в толстом клиенте и тонком клиенте под управлением ОС Windows.

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

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

Используя приведенные в статье надежные методы динамического поиска путей и правильного экранирования параметров, вы сможете обеспечить стабильную работу интеграций вашей конфигурации с внешними веб-сервисами в любой программной среде.

← На главную