В процессе разработки и сопровождения систем на платформе 1С:Предприятие 8 программисты часто сталкиваются с необходимостью автоматического открытия веб-страниц. Это могут быть личные кабинеты государственных органов, торговые площадки, банковские сервисы или внутренние корпоративные порталы.
Стандартный и наиболее простой метод платформы ЗапуститьПриложение("https://ya.ru") отлично справляется со своей задачей, но у него есть одна важная особенность: он открывает веб-ресурс исключительно в том браузере, который зарегистрирован в операционной системе Windows как браузер по умолчанию.
Однако в реальной практике этого бывает недостаточно. Разберем типичную ситуацию: у пользователя по умолчанию установлен Microsoft Edge. При этом внешняя система (например, личный кабинет Федеральной таможенной службы или портал для работы с электронными цифровыми подписями ЭЦП) корректно работает только в Google Chrome или Яндекс.Браузере, поскольку требует специфических плагинов шифрования. В то же время корпоративный банк-клиент может требовать работы исключительно в другом веб-браузере. В таких ситуациях перед разработчиком встает задача: принудительно открыть конкретную ссылку в строго определенном браузере.
В этой статье мы подробно проанализируем различные способы решения этой задачи, начиная от простых вариантов и заканчивая надежными динамическими алгоритмами корпоративного уровня.
Самое очевидное решение, к которому приходят разработчики на форумах, — это передать методу ЗапуститьПриложение полный путь к исполняемому файлу конкретного браузера и через пробел указать нужную ссылку.
Посмотрим на пример реализации данного подхода:
// Открытие ссылки в Google Chrome с жестко заданным путем
ПутьКПриложению = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe https://ya.ru";
ЗапуститьПриложение(ПутьКПриложению);
На первый взгляд этот код решает проблему. Однако в реальных условиях эксплуатации данный метод крайне нестабилен и во многих случаях вызовет критическую ошибку "Файл не найден". Проанализируем ключевые причины, почему жесткое прописание путей (hardcoding) — это плохая практика:
Program Files (x86) существует только на 64-битных версиях Windows. На 32-битных системах путь будет другим. Кроме того, современные версии Google Chrome часто устанавливаются в стандартный каталог C:\Program Files.AppData: C:\Users\ИмяПользователя\AppData\Local\Google\Chrome\Application\chrome.exe.Поэтому использовать жестко прописанные пути в тиражируемых конфигурациях крайне не рекомендуется.
Чтобы программа без ошибок работала на компьютере любого пользователя, нам необходимо научить 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 не найден в операционной системе.");
КонецЕсли;
КонецПроцедуры
Если вы по каким-то причинам не хотите читать системный реестр, можно переложить задачу поиска установленной программы на командный интерпретатор самой операционной системы 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: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Принудительное открытие ссылок в альтернативных браузерах часто сопровождается необходимостью тонкой настройки сессии. Большинство современных веб-браузеров поддерживают параметры командной строки, которые передаются сразу после пути к исполняемому файлу.
Рассмотрим наиболее полезные ключи запуска, которые пригодятся вам при автоматизации бизнес-процессов:
--incognito--inprivate-private-window--profile-directory="ИмяПрофиля" (например, "Profile 1")Пример интеграции режима инкогнито в код 1С:
ПутьКChrome = ПолучитьПутьКБраузеру("chrome.exe");
Если ЗначениеЗаполнено(ПутьКChrome) Тогда
// Запуск Chrome в режиме Инкогнито с передачей ссылки
СтрокаЗапуска = """" + ПутьКChrome + """ --incognito """ + Ссылка + """";
ЗапуститьПриложение(СтрокаЗапуска);
КонецЕсли;
Особое внимание следует уделить архитектуре выполнения вашего кода в платформе 1С:Предприятие. Все вышеописанные методы (использование COM-объектов WScript.Shell, чтение реестра Windows и метод ЗапуститьПриложение с указанием исполняемых файлов) будут успешно работать в толстом клиенте и тонком клиенте под управлением ОС Windows.
Если же ваши пользователи работают с информационной базой 1С через веб-браузер (Веб-клиент), то напрямую запустить сторонний исполняемый файл на их локальных компьютерах не получится из-за строгих ограничений безопасности (песочницы) самого браузера. В веб-клиенте стандартный метод ПерейтиПоНавигационнойСсылке(Ссылка) откроет страницу, но гарантированно только в текущей вкладке или окне того браузера, в котором сейчас запущена сама 1С.
Для реализации сложной логики запуска внешних приложений в веб-клиенте потребуется установка специального расширения работы с файлами 1С на компьютерах пользователей, что требует предварительной настройки рабочих мест администраторами.
Используя приведенные в статье надежные методы динамического поиска путей и правильного экранирования параметров, вы сможете обеспечить стабильную работу интеграций вашей конфигурации с внешними веб-сервисами в любой программной среде.