В процессе разработки интерфейсов на платформе 1С часто возникает задача повышения удобства работы пользователя. Типичный сценарий: в поле ввода указан путь к файлу, и пользователю необходимо быстро перейти к этому файлу в операционной системе — не просто открыть родительскую папку, а сфокусировать внимание именно на нужном объекте. Это особенно актуально для конфигураций на Обычных формах, где автоматизация работы с файловой системой часто ложится на плечи разработчика.
В данной статье мы подробно разберем, как реализовать механизм открытия проводника с автоматическим выделением файла, проанализируем различные способы реализации и выясним, почему стандартные диалоги выбора не подходят для этой задачи.
Многие начинающие разработчики пытаются решить задачу через метод ЗапуститьПриложение(), передавая в него путь к папке или самому файлу. Рассмотрим, что происходит в этом случае:
Наша же задача — именно выделить файл в окне папки, не открывая сам файл. Для этого нам потребуется обратиться к возможностям командной строки Windows.
Самый надежный и распространенный способ — использование системного приложения explorer.exe со специальным ключом /select. Этот метод работает во всех версиях Windows и идеально подходит для вызова из 1С.
Разберем синтаксис команды. Чтобы выделить файл, команда должна выглядеть следующим образом:
explorer.exe /select, "C:\Folder\Subfolder\File.txt"
Важные нюансы синтаксиса:
/select обязательно должна стоять запятая. Без нее проводник может открыться в корневой папке пользователя.Посмотрим на пример реализации этой логики в коде 1С для события Открытие поля ввода:
Процедура ПутьКФайлуОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартное поведение 1С
ПолныйПутьКФайлу = Элемент.Значение;
Если ПустаяСтрока(ПолныйПутьКФайлу) Тогда
Возврат;
КонецЕсли;
// Проверим существование файла перед запуском
ФайлНаДиске = Новый Файл(ПолныйПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
// Формируем строку запуска с учетом кавычек
// В 1С три кавычки подрят внутри строки превращаются в одну кавычку
КомандаЗапуска = "explorer.exe /select, """ + ПолныйПутьКФайлу + """";
ЗапуститьПриложение(КомандаЗапуска);
Иначе
Предупреждение("Файл не найден по указанному пути!");
КонецЕсли;
КонецПроцедуры
Если ваша конфигурация построена на базе БСП, мы можем не изобретать велосипед, а воспользоваться готовыми методами. Это более "чистый" программный код, так как он учитывает кроссплатформенность и специфику окружения.
Проанализируем ситуацию: в БСП существует общий модуль ФайловаяСистемаКлиент. В нем предусмотрен метод, который инкапсулирует в себе всю логику работы с проводником.
Рассмотрим пример использования:
// В обработчике нажатия кнопки или события "Открытие"
ПолноеИмяФайла = "C:\MyFiles\Report.pdf";
ФайловаяСистемаКлиент.ОткрытьПроводникСВыделениемФайла(ПолноеИмяФайла);
Этот метод самостоятельно проверит, является ли путь файлом или папкой, корректно сформирует строку запуска и обработает возможные исключения. Использование БСП — это рекомендуемый стандарт для современной разработки на 1С.
Существует еще один способ, который позволяет управлять проводником через объектную модель Windows. Рассмотрим подробнее работу с Shell.Application. Этот метод может быть полезен, если требуется более сложная манипуляция окнами, хотя для простой задачи выделения он используется реже.
Шелл = Новый COMОбъект("Shell.Application");
// Метод Explore просто открывает папку
// Для выделения конкретного объекта используем специфический подход:
ПапкаОбъект = Шелл.NameSpace(ПутьКПапке);
Если ПапкаОбъект <> Неопределено Тогда
ОбъектФайл = ПапкаОбъект.ParseName(ИмяФайла);
Если ОбъектФайл <> Неопределено Тогда
ОбъектФайл.InvokeVerb("open"); // Но это откроет файл, а не выделит
КонецЕсли;
КонецЕсли;
Важное примечание: Метод через explorer.exe /select остается более предпочтительным, так как он проще в отладке и не зависит от регистрации COM-компонент в системе.
В ходе обсуждения на форумах часто предлагают использовать ДиалогВыбораФайла. Выясним причину, по которой это решение не является ответом на поставленный вопрос. Объект ДиалогВыбораФайла предназначен для получения пути в переменную 1С. После того как пользователь нажмет "Открыть" или "Выбрать", окно закроется, и управление вернется в программу.
В нашей же задаче цель иная: оставить окно проводника открытым, чтобы пользователь мог вручную скопировать файл, перетащить его в почтовый клиент или совершить иные действия средствами ОС. Именно поэтому использование ЗапуститьПриложение с системными ключами является единственно верным решением.
Разберем по шагам, какие проверки необходимо внедрить в код, чтобы избежать ошибок:
explorer.exe /select путь к несуществующему файлу, проводник может открыться в папке "Мои документы" по умолчанию, что запутает пользователя. Используйте объект Файл для предварительной проверки.\\Server\Folder\File обрабатываются корректно. Ключ /select их поддерживает, но доступ к ним может быть ограничен правами пользователя или состоянием сети.Таким образом, мы рассмотрели полноценный механизм взаимодействия 1С с файловой системой Windows, который позволяет сделать работу пользователя более комфортной и эффективной.