При разработке на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с ситуацией, когда стандартная функция ЗапуститьПриложение() отказывается выполнять команду, если путь к файлу передается через переменную или реквизит. При этом ручной ввод того же самого пути в виде строковой константы работает безупречно. Ситуация осложняется тем, что проверка существования файла через ФС.СуществуетФайл() выдает положительный результат, окончательно запутывая разработчика.
В данной статье мы подробно разберем причины такого поведения платформы, выясним разницу в хранении строковых данных и научимся правильно подготавливать пути для запуска внешних программ и документов.
Основная причина, по которой ЗапуститьПриложение() может не срабатывать — это наличие хвостовых пробелов в строке пути. В 1С 7.7 текстовые реквизиты справочников, документов и даже значения в таблицах значений (если они получены напрямую из реквизитов) имеют фиксированную длину. Если длина реквизита в конфигураторе определена, например, в 100 символов, а фактический путь занимает только 40, платформа вернет строку, дополненную 60 пробелами справа.
Рассмотрим ситуацию на примере. Допустим, мы получаем путь из таблицы значений тз.Путь:
// Путь в переменной может выглядеть так: "C:\Logs\file.log "
ЗапуститьПриложение(ИмяПапки + "\" + тз.Путь);
Функция ЗапуститьПриложение() в 1С 7.7 является оберткой над системным вызовом Windows API ShellExecute. Операционная система воспринимает строку буквально. Наличие лишних пробелов в конце пути для ОС означает, что файл называется именно так (вместе с пробелами), и, не найдя такого объекта, система просто игнорирует команду.
Проанализируем интересную особенность: метод ФС.СуществуетФайл() часто возвращает 1 (истина) даже при наличии пробелов в конце строки. Это происходит потому, что функции Windows API для проверки атрибутов файлов (такие как GetFileAttributes) выполняют автоматическую нормализацию пути перед проверкой. Они отсекают лишние точки и пробелы в конце строки. Однако механизм запуска приложений гораздо более строг к синтаксису, что и создает иллюзию "исправного" пути при неработающем запуске.
Самый простой и эффективный способ решить проблему — всегда использовать функцию СокрЛП() (сокращение левых и правых пробелов) при работе с путями, полученными из базы данных или экранных форм.
Правильный вариант написания кода будет выглядеть так:
// Очищаем путь от лишних пробелов перед запуском
ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
ЗапуститьПриложение(ПутьКФайлу);
Это гарантирует, что в операционную систему уйдет чистая строка без "мусора" в конце.
Выясним еще один важный нюанс. Если путь к файлу содержит пробелы внутри (например, папка C:\Program Files\My App\), то даже после удаления хвостовых пробелов функция может не сработать. В этом случае операционная система может воспринять часть пути как аргументы командной строки.
Чтобы избежать этой проблемы, путь необходимо заключать в двойные кавычки. В языке 1С 7.7 символ кавычки можно получить с помощью функции Симв(34).
Разберем пример комбинированного решения:
ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
// Оборачиваем путь в кавычки для надежности
ЗапуститьПриложение(Симв(34) + ПутьКФайлу + Симв(34));
Проанализируем, почему для одних полей СокрЛП() критически важен, а для других — нет. В 1С 7.7 существует внутренняя логика обработки стандартных полей объектов:
Спр.Наименование, вы получаете уже очищенную строку. Это сделано для удобства отображения и поиска.ПутьКФайлу имеет длину 200, он всегда будет возвращать 200 символов, где полезные данные дополнены пробелами.В SQL-версиях 1С 7.7 все строковые поля хранятся в формате CHAR, что подразумевает фиксированную длину. Поэтому при написании прямых запросов или работе с реквизитами напрямую, программист всегда должен помнить о необходимости "тримить" (обрезать) строки.
Иногда разработчики используют КомандаСистемы(). Эта функция отрабатывает корректно с теми же путями, но имеет существенный недостаток — во время ее выполнения на экране "моргает" черное окно консоли CMD. Кроме того, КомандаСистемы() работает синхронно (останавливает выполнение 1С до закрытия вызванного приложения), в то время как ЗапуститьПриложение() работает асинхронно.
Если вам нужно запустить файл без окна консоли и без лишних пауз в работе пользователя, ЗапуститьПриложение() с предварительной очисткой строки через СокрЛП() является лучшим выбором.
Для тех случаев, когда штатных средств недостаточно (например, нужно скрыть окно запускаемого приложения или получить код возврата), можно воспользоваться объектами операционной системы через COM-соединение. Рассмотрим пример использования WScript.Shell:
// Создаем объект оболочки Windows
Шелл = СоздатьОбъект("WScript.Shell");
ПутьКФайлу = СокрЛП(ИмяПапки) + "\" + СокрЛП(тз.Путь);
// Запуск: путь в кавычках, 1 - показать окно, 0 - не ждать завершения
Шелл.Run(Симв(34) + ПутьКФайлу + Симв(34), 1, 0);
Этот метод считается более профессиональным в среде разработчиков 1С 7.7, так как предоставляет больше контроля над процессом запуска.
Для стабильной работы функции ЗапуститьПриложение() в 1С 7.7 необходимо придерживаться следующих правил:
СокрЛП() к переменным, содержащим пути к файлам.Симв(34), если в названиях папок могут встретиться пробелы.Наименования) всегда хранят строку фиксированной длины.Соблюдение этих простых рекомендаций избавит вас от трудноуловимых ошибок при взаимодействии 1С с внешними файлами и программами.