Почему функция ЗапуститьПриложение в 1С 7.7 не открывает файл по пути из переменной?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Причина проблемы: невидимые враги в строках

Основная причина, по которой ЗапуститьПриложение() может не срабатывать — это наличие хвостовых пробелов в строке пути. В 1С 7.7 текстовые реквизиты справочников, документов и даже значения в таблицах значений (если они получены напрямую из реквизитов) имеют фиксированную длину. Если длина реквизита в конфигураторе определена, например, в 100 символов, а фактический путь занимает только 40, платформа вернет строку, дополненную 60 пробелами справа.

Рассмотрим ситуацию на примере. Допустим, мы получаем путь из таблицы значений тз.Путь:


// Путь в переменной может выглядеть так: "C:\Logs\file.log          "
ЗапуститьПриложение(ИмяПапки + "\" + тз.Путь); 

Функция ЗапуститьПриложение() в 1С 7.7 является оберткой над системным вызовом Windows API ShellExecute. Операционная система воспринимает строку буквально. Наличие лишних пробелов в конце пути для ОС означает, что файл называется именно так (вместе с пробелами), и, не найдя такого объекта, система просто игнорирует команду.

Почему ФС.СуществуетФайл возвращает истину?

Проанализируем интересную особенность: метод ФС.СуществуетФайл() часто возвращает 1 (истина) даже при наличии пробелов в конце строки. Это происходит потому, что функции Windows API для проверки атрибутов файлов (такие как GetFileAttributes) выполняют автоматическую нормализацию пути перед проверкой. Они отсекают лишние точки и пробелы в конце строки. Однако механизм запуска приложений гораздо более строг к синтаксису, что и создает иллюзию "исправного" пути при неработающем запуске.

Решение 1: Обязательное использование СокрЛП

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

Правильный вариант написания кода будет выглядеть так:


// Очищаем путь от лишних пробелов перед запуском
ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
ЗапуститьПриложение(ПутьКФайлу);

Это гарантирует, что в операционную систему уйдет чистая строка без "мусора" в конце.

Решение 2: Обработка пробелов внутри пути (Кавычки)

Выясним еще один важный нюанс. Если путь к файлу содержит пробелы внутри (например, папка C:\Program Files\My App\), то даже после удаления хвостовых пробелов функция может не сработать. В этом случае операционная система может воспринять часть пути как аргументы командной строки.

Чтобы избежать этой проблемы, путь необходимо заключать в двойные кавычки. В языке 1С 7.7 символ кавычки можно получить с помощью функции Симв(34).

Разберем пример комбинированного решения:


ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
// Оборачиваем путь в кавычки для надежности
ЗапуститьПриложение(Симв(34) + ПутьКФайлу + Симв(34));

Особенности хранения строк: Наименование vs Реквизит

Проанализируем, почему для одних полей СокрЛП() критически важен, а для других — нет. В 1С 7.7 существует внутренняя логика обработки стандартных полей объектов:

  1. Наименование и Код: Платформа на уровне ядра автоматически обрезает пробелы при обращении к этим полям. Когда вы пишете Спр.Наименование, вы получаете уже очищенную строку. Это сделано для удобства отображения и поиска.
  2. Пользовательские текстовые реквизиты: Для них автоматическая обрезка не предусмотрена. Если реквизит ПутьКФайлу имеет длину 200, он всегда будет возвращать 200 символов, где полезные данные дополнены пробелами.

В SQL-версиях 1С 7.7 все строковые поля хранятся в формате CHAR, что подразумевает фиксированную длину. Поэтому при написании прямых запросов или работе с реквизитами напрямую, программист всегда должен помнить о необходимости "тримить" (обрезать) строки.

Альтернатива: Запуск через КомандаСистемы

Иногда разработчики используют КомандаСистемы(). Эта функция отрабатывает корректно с теми же путями, но имеет существенный недостаток — во время ее выполнения на экране "моргает" черное окно консоли CMD. Кроме того, КомандаСистемы() работает синхронно (останавливает выполнение 1С до закрытия вызванного приложения), в то время как ЗапуститьПриложение() работает асинхронно.

Если вам нужно запустить файл без окна консоли и без лишних пауз в работе пользователя, ЗапуститьПриложение() с предварительной очисткой строки через СокрЛП() является лучшим выбором.

Продвинутый метод: Использование WScript.Shell

Для тех случаев, когда штатных средств недостаточно (например, нужно скрыть окно запускаемого приложения или получить код возврата), можно воспользоваться объектами операционной системы через COM-соединение. Рассмотрим пример использования WScript.Shell:


// Создаем объект оболочки Windows
Шелл = СоздатьОбъект("WScript.Shell");
ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
// Запуск: путь в кавычках, 1 - показать окно, 0 - не ждать завершения
Шелл.Run(Симв(34) + ПутьКФайлу + Симв(34), 1, 0);

Этот метод считается более профессиональным в среде разработчиков 1С 7.7, так как предоставляет больше контроля над процессом запуска.

Подведем итоги

Для стабильной работы функции ЗапуститьПриложение() в 1С 7.7 необходимо придерживаться следующих правил:

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

← На главную