Как запустить локальное приложение или открыть ссылку из веб-клиента 1С без ошибок?

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

Разработка под управляемые формы часто преподносит сюрпризы, когда прекрасно работающий в тонком клиенте код внезапно отказывается функционировать в веб-клиенте. Одной из наиболее распространенных проблем является попытка запуска внешних приложений (например, текстовых редакторов, файловых менеджеров вроде Far Manager или консольных утилит) с помощью стандартного метода ЗапуститьПриложение(). Пользователи веб-клиента при этом сталкиваются с неприятным системным сообщением: «Расширение для работы с файлами не подключено».

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

Почему тонкий клиент запускает всё, а веб-клиент выдает ошибку?

Для начала проанализируем архитектурные различия сред исполнения. Тонкий клиент 1С — это полноценное операционное приложение, запущенное непосредственно в операционной системе Windows, Linux или macOS. Оно обладает правами текущего пользователя ОС и может без ограничений взаимодействовать с файловой системой и вызывать другие исполняемые файлы (при наличии соответствующих прав доступа).

Веб-клиент работает внутри интернет-браузера (Chrome, Firefox, Safari, Яндекс.Браузер). Современные стандарты веб-безопасности изолируют любую веб-страницу в так называемой «песочнице» (sandbox). Браузер по умолчанию блокирует любые попытки веб-сайта обратиться к локальным дискам пользователя или запустить исполняемый файл .exe. Если бы этой защиты не было, любой злоумышленник мог бы при посещении сайта незаметно запустить на вашем компьютере вредоносное ПО.

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

  1. Расширение самого браузера (компонент интеграции): устанавливается пользователем из официального магазина расширений (например, Chrome Web Store). Оно служит «мостом» между кодом веб-страницы 1С и операционной системой.
  2. Программный компонент платформы 1С на локальном ПК: это служба, которая общается с расширением браузера по протоколу Native Messaging и выполняет низкоуровневые операции (чтение/запись файлов, запуск приложений).

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

Способ 1. Современный асинхронный метод запуска приложения (для платформы 1С 8.3.18 и новее)

Начиная с версии платформы 8.3.18, фирма «1С» активно внедряет асинхронный синтаксис с использованием ключевых слов Асинх и Ждать. Это существенно упрощает написание кода, делая его линейным и читаемым, избавляя разработчиков от необходимости создавать сложные каскады процедур обратного вызова (коллбеков).

Рассмотрим по шагам, как правильно проверить наличие расширения работы с файлами, предложить пользователю установить его в случае отсутствия и запустить необходимое приложение (в нашем примере — Far Manager):


&НаКлиенте
Асинх Процедура ЗапуститьЛокальноеПриложениеАсинх(Команда)

    #Если ВебКлиент Тогда
    // Шаг 1. Проверяем, подключено ли расширение работы с файлами
    РасширениеПодключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
    
    Если Не РасширениеПодключено Тогда
        Попытка
            // Шаг 2. Если не подключено, предлагаем пользователю интерактивную установку
            Ждать УстановитьРасширениеРаботыСФайламиАсинх();
            РасширениеПодключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
        Исключение
            // Пользователь мог отказаться от установки или произошел сбой прав доступа
            ПоказатьПредупреждение(, "Для запуска внешних программ необходимо установить расширение работы с файлами!");
            Возврат;
        КонецПопытки;
    КонецЕсли;
    
    Если Не РасширениеПодключено Тогда
        Возврат;
    КонецЕсли;
    #КонецЕсли

    // Шаг 3. Запуск внешнего приложения в асинхронном режиме
    ПутьКПриложению = "C:\Program Files\Far Manager\Far.exe";
    
    Попытка
        Ждать ЗапуститьПриложениеАсинх(ПутьКПриложению);
    Исключение
        ИнформацияОбОшибке = ОписаниеОшибки();
        ПоказатьПредупреждение(, "Не удалось запустить приложение. Ошибка: " + ИнформацияОбОшибке);
    КонецПопытки;

КонецПроцедуры

Обратите внимание на директиву компиляции #Если ВебКлиент Тогда. В тонком клиенте расширение работы с файлами встроено в саму платформу изначально, поэтому проверка не требуется. Разделение сред исполнения позволяет оптимизировать скорость работы программы.

Способ 2. Запуск приложения через ОписаниеОповещения (для старых версий платформ)

Если вы работаете на устаревших версиях платформы 1С (до версии 8.3.18), использование ключевого слова Ждать будет недоступно. В этом случае нам придется задействовать асинхронную модель на основе объектов типа ОписаниеОповещения.

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


&НаКлиенте
Процедура ЗапуститьПриложениеСтарыйСтиль(Команда)
    #Если ВебКлиент Тогда
        // Создаем оповещение для анализа результатов подключения расширения
        ОповещениеОПодключении = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект);
        НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеОПодключении);
    #Иначе
        // В Тонком клиенте сразу переходим к запуску приложения
        ВыполнитьЗапускПриложения();
    #КонецЕсли
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт
    Если Подключено Тогда
        ВыполнитьЗапускПриложения();
    Иначе
        // Если расширение не подключено, инициируем его установку
        ОповещениеОбУстановке = Новый ОписаниеОповещения("ПослеУстановкиРасширения", ЭтотОбъект);
        НачатьУстановкуРасширенияРаботыСФайлами(ОповещениеОбУстановке);
    EndIf;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиРасширения(Установлено, ДополнительныеПараметры) Экспорт
    Если Установлено Тогда
        // Пробуем подключить повторно после успешной установки
        ОповещениеОПодключении = Новый ОписаниеОповещения("ПослеПодключенияРасширения", ЭтотОбъект);
        НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеОПодключении);
    Иначе
        ПоказатьПредупреждение(, "Работа без расширения файлов невозможна.");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапускПриложения()
    ПутьКПриложению = "C:\Program Files\Far Manager\Far.exe";
    ОповещениеЗапуска = Новый ОписаниеОповещения("ПослеЗапуска", ЭтотОбъект);
    НачатьЗапускПриложения(ОповещениеЗапуска, ПутьКПриложению);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапуска(КодВозврата, ДополнительныеПараметры) Экспорт
    // Здесь можно обработать успешность запуска, если приложение вернуло код закрытия
КонецПроцедуры

Этот метод более громоздкий, но он гарантирует стабильную работу логики решения на любой версии технологической платформы 1С:Предприятие 8.3.

Особый случай: Открытие интернет-ссылок (на примере yandex.ru)

Часто разработчики допускают серьезную методическую ошибку: для открытия обычного веб-сайта в браузере они используют ту же команду ЗапуститьПриложение("https://yandex.ru"). В веб-клиенте это немедленно приводит к требованию установить расширение файлов, что вызывает логичное недоумение у конечных пользователей — зачем для открытия сайта в браузере ставить какие-то локальные компоненты?

Для открытия внешних URL-адресов расширение работы с файлами абсолютно не требуется!

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


&НаКлиенте
Процедура ОткрытьВнешнийСайт(Команда)
    ПерейтиПоНавигационнойСсылке("https://yandex.ru");
КонецПроцедуры

При использовании метода ПерейтиПоНавигационнойСсылке() веб-клиент просто отправляет стандартную команду браузеру на открытие новой вкладки с указанным адресом. Это абсолютно безопасная операция, которая поддерживается браузерами нативно.

Способ 3. Использование Библиотеки стандартных подсистем (БСП)

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

Рассмотрим примеры использования готовых методов БСП:

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

Важные системные ограничения

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

  1. Контроль учетных записей (UAC) в Windows: Если запускаемое приложение требует прав администратора, операционная система может заблокировать фоновый запуск из-под процесса браузера.
  2. Локальные политики безопасности (Active Directory): В корпоративных сетях системные администраторы часто запрещают запуск исполняемых файлов из недоверенных источников или определенных каталогов (например, временных папок браузеров).
  3. Антивирусное ПО: Системы защиты компьютера могут расценить попытку браузера (через Native Messaging) запустить локальный исполняемый файл как подозрительную активность (эвристический анализ) и заблокировать процесс.

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

← На главную