В практике разработчика 1С часто возникает задача интегрировать внешнее программное обеспечение в рабочий процесс. Это может быть специализированный графический редактор, почтовый клиент, калькулятор или отраслевое ПО. Основная проблема заключается в том, что на разных компьютерах пользователей программы могут быть установлены в разные директории: кто-то использует стандартный C:\Program Files, а кто-то устанавливает софт на диск D: или в профиль пользователя AppData. В этой статье мы подробно разберем, как заставить систему саму найти нужный файл и как программно вычислить его местоположение.
Обычно для запуска внешних программ используется команда ЗапуститьПриложение(). Если мы передаем в нее только имя файла, например, ЗапуститьПриложение("calc.exe"), система пытается найти его в ограниченном наборе мест. Проанализируем стандартную последовательность поиска Windows:
Windows.System32.PATH.Если ваша программа не является частью операционной системы и не прописала себя в PATH при установке, вызов ЗапуститьПриложение("my_app.exe") закончится ошибкой. Рассмотрим, как обойти это ограничение.
Это самый профессиональный и надежный способ. Windows хранит информацию о путях к "известным" приложениям в специальном разделе реестра. Многие современные инсталляторы регистрируют там полный путь к исполняемому файлу. Разберем, как прочитать эти данные из 1С.
Нужный нам ключ находится по адресу: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\. Каждому приложению там соответствует подраздел с именем файла (например, chrome.exe).
Посмотрим на пример кода, который позволяет получить путь к программе через WScript.Shell:
Функция ПолучитьПутьКПриложениюИзРеестра(ИмяФайла)
Попытка
Shell = Новый COMОбъект("WScript.Shell");
ПутьВРеестре = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ИмяФайла + "\";
ПолныйПуть = Shell.RegRead(ПутьВРеестре);
Возврат ПолныйПуть;
Исключение
// Если в HKLM нет, можно проверить в HKEY_CURRENT_USER
Возврат "";
КонецПопытки;
КонецФункции
Используя этот метод, мы можем получить точный путь к excel.exe, chrome.exe или любой другой зарегистрированной программе, даже если она установлена на нестандартный диск.
Если мы не знаем имени исполняемого файла, но знаем расширение файлов, с которыми работает программа, мы можем выяснить, какое приложение назначено для их открытия. Выясним причину, почему это удобно: пользователю не нужно ничего настраивать, система сама скажет, чем она обычно открывает, например, .pdf.
Данные об ассоциациях хранятся в корневом разделе реестра HKEY_CLASSES_ROOT. Проанализируем ситуацию: нам нужно сначала найти идентификатор типа файла, а затем команду открытия.
HKEY_CLASSES_ROOT\.ext (где .ext — расширение).HKEY_CLASSES_ROOT\ИмяТипа\shell\open\command.Программы часто устанавливаются в стандартные папки, пути к которым могут меняться в зависимости от версии Windows или настроек пользователя. Вместо жесткого кодирования пути C:\Program Files, правильно использовать переменные окружения. Разберем основные из них:
%ProgramFiles% — путь к папке программ (64-бит или 32-бит на 32-битной ОС).%ProgramFiles(x86)% — путь к 32-битным программам на 64-битной ОС.%LocalAppData% — папка данных пользователя, куда часто ставятся мессенджеры и браузеры без прав администратора.Пример получения пути в 1С:
Shell = Новый COMОбъект("WScript.Shell");
ПутьКПрофилю = Shell.ExpandEnvironmentStrings("%LocalAppData%");
ПолныйПутьКПрограмме = ПутьКПрофилю + "\Programs\MySoft\my_app.exe";
Если ваша задача — запустить приложение из пакета Microsoft Office или AutoCAD, вам вообще не нужно знать, где лежит исполняемый файл. Система использует технологию OLE/COM. Рассмотрим подробнее: при вызове Новый COMОбъект("Excel.Application") операционная система сама находит установленный экземпляр Excel и запускает его в фоновом или видимом режиме. Это самый стабильный способ взаимодействия с внешним ПО, так как он предоставляет программный интерфейс управления.
Если реестр пуст, а программа не является COM-сервером, мы можем попытаться найти ее ярлык в меню «Пуск». Проанализируем структуру: ярлыки хранятся в %ProgramData%\Microsoft\Windows\Start Menu\Programs. Мы можем программно перебрать файлы .lnk и прочитать их свойство "Target" (Объект).
Как показывает практика и обсуждения на форумах, самым надежным (хотя и менее автоматизированным) является комбинированный подход. Мы пытаемся найти программу автоматически одним из способов выше, а если не удается — предоставляем пользователю возможность самому указать путь в настройках.
Рассмотрим алгоритм реализации такой кнопки:
App Paths в реестре.ДиалогВыбораФайла.Пример реализации выбора файла:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите исполняемый файл программы";
Диалог.Фильтр = "Исполняемые файлы (*.exe)|*.exe";
Если Диалог.Выбрать() Тогда
ВыбранныйПуть = Диалог.ПолноеИмяФайла;
// Сохраняем путь в базу данных
КонецЕсли;
Важный момент: При запуске через ЗапуститьПриложение() рекомендуется всегда проверять существование файла методом Файл.Существует(), чтобы избежать неинформативных системных ошибок, которые могут напугать пользователя.
Мы рассмотрели различные уровни поиска приложений в Windows: от простого обращения по имени до глубокого анализа реестра и переменных окружения. Использование этих методов делает вашу конфигурацию 1С более гибкой и устойчивой к изменениям в ИТ-инфраструктуре заказчика. Помните, что автоматический поиск лучше всего дополнять возможностью ручной корректировки пути в интерфейсе программы.