Разработка и Конфигурация · 9 мин
1С: как получить путь к файлу — рабочие способы и примеры
Как получить путь к файлу в 1С: диалог выбора файла, ПолучитьИмяВременногоФайла, КаталогВременныхФайлов, разбор пути на части. Примеры кода и ошибки.
Получить путь к файлу в 1С требуется в десятках сценариев: загрузка прайса из Excel, выгрузка отчёта в PDF, обмен с сайтом, сохранение печатной формы на диск. В зависимости от задачи используются разные механизмы — диалог выбора файла, временные каталоги, объекты работы с файловой системой или стандартные функции платформы.
Ключевой момент: в 1С путь к файлу может формироваться на клиенте и на сервере, и это принципиально разные файловые системы. Код, безупречно работающий в файловой базе на локальном компьютере, в клиент-серверном варианте часто падает с ошибкой «файл не найден», потому что сервер не видит диск пользователя. Поэтому выбор способа получения пути всегда начинается с вопроса: где именно будет выполняться код.
Ниже разобраны основные способы получения пути к файлу во встроенном языке 1С: через диалог выбора, через временные файлы, через разбор существующего пути на составляющие, а также особенности тонкого и веб-клиента. Примеры приведены для управляемых форм и актуальных режимов совместимости.
Как дать пользователю выбрать файл через диалог
Самый частый сценарий — пользователь указывает файл вручную: например, выбирает Excel с номенклатурой для загрузки. Для этого служит объект ДиалогВыбораФайла. В управляемых формах он работает только в асинхронном режиме — через описание оповещения, потому что модальные вызовы запрещены.
Типовой код выглядит так:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx|Все файлы (.)|.";
Диалог.МножественныйВыбор = Ложь;
Диалог.Заголовок = "Выберите файл для загрузки";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0]; // полный путь к выбранному файлу
КонецПроцедуры
Обратите внимание на проверку результата: если пользователь закрыл диалог кнопкой «Отмена», в обработчик приходит Неопределено. Пропуск этой проверки — одна из самых частых причин ошибок «индекс находится за границами массива».
- 1Создайте ДиалогВыбораФайла с нужным режимом: Открытие, Сохранение или ВыборКаталога
- 2Задайте Фильтр, чтобы пользователь видел только нужные типы файлов
- 3Вызовите Показать() с описанием оповещения — не Выбрать(), если отключены модальные вызовы
- 4В обработчике проверьте, что массив файлов не равен Неопределено
- 5Сохраните полученный путь в реквизит формы или сразу передайте в обработку
Как получить путь к каталогу, а не к файлу
Иногда нужен не конкретный файл, а папка — например, каталог для пакетной выгрузки документов. Для этого тот же диалог используется с режимом ВыборКаталога. Пользователь указывает папку, а в оповещение приходит массив с одним элементом — полным путём к каталогу.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите каталог для выгрузки";
Учтите, что возвращаемый путь обычно не содержит завершающего слэша. Если дальше вы будете склеивать его с именем файла, добавляйте разделитель явно, иначе получите строку вида C:\Выгрузкаотчет.pdf. Правильно собрать путь помогает объект Файл или простая конкатенация с проверкой последнего символа.
Как получить временный путь для служебных файлов
Когда файл нужен только внутри обработки — сформировать XML обмена, распаковать архив, промежуточно сохранить табличный документ — не стоит просить пользователя указывать путь. Платформа предоставляет две функции: ПолучитьИмяВременногоФайла() и КаталогВременныхФайлов().
// Уникальное имя файла во временном каталоге
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
// Результат вида: C:\Users\User\AppData\Local\Temp\v8_1A2B.tmp.xml
// Или просто каталог для своих файлов
Каталог = КаталогВременныхФайлов();
ПолучитьИмяВременногоФайла гарантирует уникальность имени, что важно при параллельных сеансах: два пользователя, одновременно запустившие обмен, не перезапишут файлы друг друга. Функция работает и на клиенте, и на сервере — но каталоги будут разными, каждый на своей машине.
Как разобрать существующий путь на части
Обратная задача встречается не реже: путь уже есть (из реквизита, из настроек, из диалога), а нужно извлечь из него имя файла, расширение или каталог. Для этого удобен объект Файл — он разбирает путь без обращения к диску, если вызывать только свойства.
Файл = Новый Файл("C:\Документы\Прайс\прайс_январь.xlsx");
Сообщить(Файл.Имя); // прайс_январь.xlsx
Сообщить(Файл.ИмяБезРасширения); // прайс_январь
Сообщить(Файл.Расширение); // .xlsx
Сообщить(Файл.Путь); // C:\Документы\Прайс\
Это удобно для проверок: например, перед загрузкой убедиться, что Файл.Расширение соответствует ожидаемому формату, или сформировать имя выходного файла на основе входного. Свойство Файл.Существует() уже обращается к файловой системе — используйте его, чтобы заранее отловить ситуацию «файл удалён или недоступен» и выдать пользователю понятное сообщение вместо системной ошибки.
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
ВызватьИсключение "Файл не найден: " + ПутьКФайлу;
КонецЕсли;Клиент и сервер: почему путь «работает на моём компьютере» и не работает в базе
Главный подводный камень темы. В клиент-серверной 1С сервер приложений — отдельный процесс, часто на отдельной машине. Путь C:\Документы\файл.xlsx, полученный в клиентском коде, для сервера указывает на его собственный диск C:, где этого файла нет. Отсюда классическая ошибка: обработка отлажена в файловой базе, а в рабочей клиент-серверной падает.
Правильный шаблон для управляемых форм — передача файла на сервер через временное хранилище:
&НаКлиенте
Процедура Загрузить(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗагрузитьНаСервере(Адрес); // сервер читает данные из хранилища, а не по пути
КонецПроцедуры
На сервере данные извлекаются через ПолучитьИзВременногоХранилища(Адрес) как двоичные данные, при необходимости записываются во временный файл на сервере — и только этот серверный путь используется дальше. Для работы с файлами на клиенте в тонком и веб-клиенте также требуется расширение работы с файлами: метод НачатьПодключениеРасширенияРаботыСФайлами.
Как проверить, что полученный путь корректен
Получить строку пути — половина задачи. Перед использованием стоит убедиться, что путь валиден: файл существует, доступен для чтения или записи, а каталог существует. Минимальный набор проверок: Файл.Существует() для входящих файлов, попытка записи тестового файла для каталогов выгрузки, контроль расширения для загружаемых данных.
Для сетевых путей вида \\server\share\... добавьте обработку исключений через Попытка...Исключение: сетевая папка может быть недоступна именно в момент обращения, и пользователь должен получить внятное сообщение, а не дамп ошибки платформы.
Как проверить результат
Полный путь с диском или сетевым префиксом, файл открывается
Пустая строка или Неопределено — пользователь отменил выбор
Файл создан в каталоге Temp, уникальное имя
Ошибка доступа — нет прав на временный каталог
Файл читается из временного хранилища или серверного каталога
Используется клиентский путь вида C:\... в серверном коде
Частые вопросы
Как получить путь к файлу из реквизита типа «Хранилище значения»?
Напрямую никак: в хранилище лежат двоичные данные, а не путь. Извлеките данные через Получить(), запишите их во временный файл методом Записать() и работайте с полученным временным путём.
Почему ДиалогВыбораФайла не открывается в веб-клиенте?
В веб-клиенте прямой доступ к файловой системе ограничен браузером. Используйте НачатьПомещениеФайла — он вызывает стандартный браузерный диалог загрузки и передаёт файл на сервер через временное хранилище.
Как получить путь к каталогу, где лежит сама база 1С?
Для файловой базы используйте функцию КаталогИнформационнойБазы() — она вернёт каталог с файлом 1Cv8.1CD. В клиент-серверном режиме функция вернёт строку подключения, а не файловый путь.
Можно ли получить путь к файлу без диалога, зная только имя?
Только если каталог известен заранее (настройки, константы, временный каталог). Платформа не ищет файлы по всему диску — поиск по маске делается через НайтиФайлы() в конкретном каталоге.
Что вернёт ПолучитьИмяВременногоФайла без параметра?
Имя файла со стандартным расширением .tmp во временном каталоге. Если нужно конкретное расширение — передайте его параметром, например ПолучитьИмяВременногоФайла("pdf").
Что важно запомнить
Для выбора пользователем — ДиалогВыбораФайла с оповещением, для служебных файлов — ПолучитьИмяВременногоФайла. В клиент-серверной базе не передавайте клиентский путь в серверный код: помещайте файл во временное хранилище. Всегда проверяйте отмену диалога и существование файла перед использованием пути.