Как открыть папку и выделить конкретный файл в проводнике из 1С

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

В процессе разработки интерфейсов на платформе 1С часто возникает задача повышения удобства работы пользователя. Типичный сценарий: в поле ввода указан путь к файлу, и пользователю необходимо быстро перейти к этому файлу в операционной системе — не просто открыть родительскую папку, а сфокусировать внимание именно на нужном объекте. Это особенно актуально для конфигураций на Обычных формах, где автоматизация работы с файловой системой часто ложится на плечи разработчика.

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

Разбор стандартного подхода и его ограничений

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

  1. Если передать путь к папке, откроется окно проводника, но ни один файл не будет выделен. Пользователю придется искать нужный объект вручную среди сотен других.
  2. Если передать путь к файлу, операционная система попытается запустить его (открыть в ассоциированной программе, например, в Excel или Word).

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

Решение через ключи командной строки Explorer.exe

Самый надежный и распространенный способ — использование системного приложения explorer.exe со специальным ключом /select. Этот метод работает во всех версиях Windows и идеально подходит для вызова из 1С.

Разберем синтаксис команды. Чтобы выделить файл, команда должна выглядеть следующим образом:

explorer.exe /select, "C:\Folder\Subfolder\File.txt"

Важные нюансы синтаксиса:

Посмотрим на пример реализации этой логики в коде 1С для события Открытие поля ввода:


Процедура ПутьКФайлуОткрытие(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное поведение 1С
    
    ПолныйПутьКФайлу = Элемент.Значение;
    
    Если ПустаяСтрока(ПолныйПутьКФайлу) Тогда
        Возврат;
    КонецЕсли;
    
    // Проверим существование файла перед запуском
    ФайлНаДиске = Новый Файл(ПолныйПутьКФайлу);
    Если ФайлНаДиске.Существует() Тогда
        // Формируем строку запуска с учетом кавычек
        // В 1С три кавычки подрят внутри строки превращаются в одну кавычку
        КомандаЗапуска = "explorer.exe /select, """ + ПолныйПутьКФайлу + """";
        ЗапуститьПриложение(КомандаЗапуска);
    Иначе
        Предупреждение("Файл не найден по указанному пути!");
    КонецЕсли;
    
КонецПроцедуры

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

Если ваша конфигурация построена на базе БСП, мы можем не изобретать велосипед, а воспользоваться готовыми методами. Это более "чистый" программный код, так как он учитывает кроссплатформенность и специфику окружения.

Проанализируем ситуацию: в БСП существует общий модуль ФайловаяСистемаКлиент. В нем предусмотрен метод, который инкапсулирует в себе всю логику работы с проводником.

Рассмотрим пример использования:


// В обработчике нажатия кнопки или события "Открытие"
ПолноеИмяФайла = "C:\MyFiles\Report.pdf";
ФайловаяСистемаКлиент.ОткрытьПроводникСВыделениемФайла(ПолноеИмяФайла);

Этот метод самостоятельно проверит, является ли путь файлом или папкой, корректно сформирует строку запуска и обработает возможные исключения. Использование БСП — это рекомендуемый стандарт для современной разработки на 1С.

Альтернативный метод через COM-объект Shell.Application

Существует еще один способ, который позволяет управлять проводником через объектную модель Windows. Рассмотрим подробнее работу с Shell.Application. Этот метод может быть полезен, если требуется более сложная манипуляция окнами, хотя для простой задачи выделения он используется реже.


Шелл = Новый COMОбъект("Shell.Application");
// Метод Explore просто открывает папку
// Для выделения конкретного объекта используем специфический подход:
ПапкаОбъект = Шелл.NameSpace(ПутьКПапке);
Если ПапкаОбъект <> Неопределено Тогда
    ОбъектФайл = ПапкаОбъект.ParseName(ИмяФайла);
    Если ОбъектФайл <> Неопределено Тогда
        ОбъектФайл.InvokeVerb("open"); // Но это откроет файл, а не выделит
    КонецЕсли;
КонецЕсли;

Важное примечание: Метод через explorer.exe /select остается более предпочтительным, так как он проще в отладке и не зависит от регистрации COM-компонент в системе.

Почему не подходит ДиалогВыбораФайла?

В ходе обсуждения на форумах часто предлагают использовать ДиалогВыбораФайла. Выясним причину, по которой это решение не является ответом на поставленный вопрос. Объект ДиалогВыбораФайла предназначен для получения пути в переменную 1С. После того как пользователь нажмет "Открыть" или "Выбрать", окно закроется, и управление вернется в программу.

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

Проверки и безопасность

Разберем по шагам, какие проверки необходимо внедрить в код, чтобы избежать ошибок:

  1. Проверка на пустое значение: Перед вызовом команд убедитесь, что путь в поле ввода вообще заполнен.
  2. Проверка существования: Если передать в explorer.exe /select путь к несуществующему файлу, проводник может открыться в папке "Мои документы" по умолчанию, что запутает пользователя. Используйте объект Файл для предварительной проверки.
  3. Обработка сетевых путей: Убедитесь, что пути вида \\Server\Folder\File обрабатываются корректно. Ключ /select их поддерживает, но доступ к ним может быть ограничен правами пользователя или состоянием сети.

Таким образом, мы рассмотрели полноценный механизм взаимодействия 1С с файловой системой Windows, который позволяет сделать работу пользователя более комфортной и эффективной.

← На главную