К статье
Практический материал

Разработка и Конфигурация · 9 мин

1С: как получить путь к файлу — рабочие способы и примеры

Как получить путь к файлу в 1С: диалог выбора файла, ПолучитьИмяВременногоФайла, КаталогВременныхФайлов, разбор пути на части. Примеры кода и ошибки.

Получить путь к файлу в 1С требуется в десятках сценариев: загрузка прайса из Excel, выгрузка отчёта в PDF, обмен с сайтом, сохранение печатной формы на диск. В зависимости от задачи используются разные механизмы — диалог выбора файла, временные каталоги, объекты работы с файловой системой или стандартные функции платформы.

Ключевой момент: в 1С путь к файлу может формироваться на клиенте и на сервере, и это принципиально разные файловые системы. Код, безупречно работающий в файловой базе на локальном компьютере, в клиент-серверном варианте часто падает с ошибкой «файл не найден», потому что сервер не видит диск пользователя. Поэтому выбор способа получения пути всегда начинается с вопроса: где именно будет выполняться код.

Ниже разобраны основные способы получения пути к файлу во встроенном языке 1С: через диалог выбора, через временные файлы, через разбор существующего пути на составляющие, а также особенности тонкого и веб-клиента. Примеры приведены для управляемых форм и актуальных режимов совместимости.

Как дать пользователю выбрать файл через диалог

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

Типовой код выглядит так:

&НаКлиенте

Процедура ВыбратьФайл(Команда)

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx|Все файлы (.)|.";

Диалог.МножественныйВыбор = Ложь;

Диалог.Заголовок = "Выберите файл для загрузки";

Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);

Диалог.Показать(Оповещение);

КонецПроцедуры

&НаКлиенте

Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

Если ВыбранныеФайлы = Неопределено Тогда

Возврат; // пользователь нажал «Отмена»

КонецЕсли;

ПутьКФайлу = ВыбранныеФайлы[0]; // полный путь к выбранному файлу

КонецПроцедуры

Обратите внимание на проверку результата: если пользователь закрыл диалог кнопкой «Отмена», в обработчик приходит Неопределено. Пропуск этой проверки — одна из самых частых причин ошибок «индекс находится за границами массива».

Порядок действий при выборе файла
  1. 1
    Создайте ДиалогВыбораФайла с нужным режимом: Открытие, Сохранение или ВыборКаталога
  2. 2
    Задайте Фильтр, чтобы пользователь видел только нужные типы файлов
  3. 3
    Вызовите Показать() с описанием оповещения — не Выбрать(), если отключены модальные вызовы
  4. 4
    В обработчике проверьте, что массив файлов не равен Неопределено
  5. 5
    Сохраните полученный путь в реквизит формы или сразу передайте в обработку

Как получить путь к каталогу, а не к файлу

Иногда нужен не конкретный файл, а папка — например, каталог для пакетной выгрузки документов. Для этого тот же диалог используется с режимом ВыборКаталога. Пользователь указывает папку, а в оповещение приходит массив с одним элементом — полным путём к каталогу.

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

Диалог.Заголовок = "Выберите каталог для выгрузки";

Учтите, что возвращаемый путь обычно не содержит завершающего слэша. Если дальше вы будете склеивать его с именем файла, добавляйте разделитель явно, иначе получите строку вида C:\Выгрузкаотчет.pdf. Правильно собрать путь помогает объект Файл или простая конкатенация с проверкой последнего символа.

Как получить временный путь для служебных файлов

Когда файл нужен только внутри обработки — сформировать XML обмена, распаковать архив, промежуточно сохранить табличный документ — не стоит просить пользователя указывать путь. Платформа предоставляет две функции: ПолучитьИмяВременногоФайла() и КаталогВременныхФайлов().

// Уникальное имя файла во временном каталоге

ИмяФайла = ПолучитьИмяВременногоФайла("xml");

// Результат вида: C:\Users\User\AppData\Local\Temp\v8_1A2B.tmp.xml

// Или просто каталог для своих файлов

Каталог = КаталогВременныхФайлов();

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

Как разобрать существующий путь на части

Обратная задача встречается не реже: путь уже есть (из реквизита, из настроек, из диалога), а нужно извлечь из него имя файла, расширение или каталог. Для этого удобен объект Файл — он разбирает путь без обращения к диску, если вызывать только свойства.

Файл = Новый Файл("C:\Документы\Прайс\прайс_январь.xlsx");

Сообщить(Файл.Имя); // прайс_январь.xlsx

Сообщить(Файл.ИмяБезРасширения); // прайс_январь

Сообщить(Файл.Расширение); // .xlsx

Сообщить(Файл.Путь); // C:\Документы\Прайс\

Это удобно для проверок: например, перед загрузкой убедиться, что Файл.Расширение соответствует ожидаемому формату, или сформировать имя выходного файла на основе входного. Свойство Файл.Существует() уже обращается к файловой системе — используйте его, чтобы заранее отловить ситуацию «файл удалён или недоступен» и выдать пользователю понятное сообщение вместо системной ошибки.

bsl
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
    ВызватьИсключение "Файл не найден: " + ПутьКФайлу;
КонецЕсли;

Клиент и сервер: почему путь «работает на моём компьютере» и не работает в базе

Главный подводный камень темы. В клиент-серверной 1С сервер приложений — отдельный процесс, часто на отдельной машине. Путь C:\Документы\файл.xlsx, полученный в клиентском коде, для сервера указывает на его собственный диск C:, где этого файла нет. Отсюда классическая ошибка: обработка отлажена в файловой базе, а в рабочей клиент-серверной падает.

Правильный шаблон для управляемых форм — передача файла на сервер через временное хранилище:

&НаКлиенте

Процедура Загрузить(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт

Если Не Результат Тогда

Возврат;

КонецЕсли;

ЗагрузитьНаСервере(Адрес); // сервер читает данные из хранилища, а не по пути

КонецПроцедуры

На сервере данные извлекаются через ПолучитьИзВременногоХранилища(Адрес) как двоичные данные, при необходимости записываются во временный файл на сервере — и только этот серверный путь используется дальше. Для работы с файлами на клиенте в тонком и веб-клиенте также требуется расширение работы с файлами: метод НачатьПодключениеРасширенияРаботыСФайлами.

Типичные ошибки
01
Чтение клиентского пути в серверном коде — файл не находится, обработка падает
02
Модальный вызов Диалог.Выбрать() в управляемой форме — ошибка в режиме без модальности
03
Отсутствие проверки на Неопределено после диалога — ошибка при нажатии «Отмена»
04
Склейка каталога и имени файла без разделителя — некорректный путь
05
Накопление временных файлов на сервере без удаления — переполнение диска

Как проверить, что полученный путь корректен

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

Для сетевых путей вида \\server\share\... добавьте обработку исключений через Попытка...Исключение: сетевая папка может быть недоступна именно в момент обращения, и пользователь должен получить внятное сообщение, а не дамп ошибки платформы.

Контрольные точки

Как проверить результат

Путь после диалога выбора
Норма

Полный путь с диском или сетевым префиксом, файл открывается

Тревожный признак

Пустая строка или Неопределено — пользователь отменил выбор

Временный файл
Норма

Файл создан в каталоге Temp, уникальное имя

Тревожный признак

Ошибка доступа — нет прав на временный каталог

Путь на сервере
Норма

Файл читается из временного хранилища или серверного каталога

Тревожный признак

Используется клиентский путь вида C:\... в серверном коде

Частые вопросы

Как получить путь к файлу из реквизита типа «Хранилище значения»?

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

Почему ДиалогВыбораФайла не открывается в веб-клиенте?

В веб-клиенте прямой доступ к файловой системе ограничен браузером. Используйте НачатьПомещениеФайла — он вызывает стандартный браузерный диалог загрузки и передаёт файл на сервер через временное хранилище.

Как получить путь к каталогу, где лежит сама база 1С?

Для файловой базы используйте функцию КаталогИнформационнойБазы() — она вернёт каталог с файлом 1Cv8.1CD. В клиент-серверном режиме функция вернёт строку подключения, а не файловый путь.

Можно ли получить путь к файлу без диалога, зная только имя?

Только если каталог известен заранее (настройки, константы, временный каталог). Платформа не ищет файлы по всему диску — поиск по маске делается через НайтиФайлы() в конкретном каталоге.

Что вернёт ПолучитьИмяВременногоФайла без параметра?

Имя файла со стандартным расширением .tmp во временном каталоге. Если нужно конкретное расширение — передайте его параметром, например ПолучитьИмяВременногоФайла("pdf").

Итог

Что важно запомнить

Для выбора пользователем — ДиалогВыбораФайла с оповещением, для служебных файлов — ПолучитьИмяВременногоФайла. В клиент-серверной базе не передавайте клиентский путь в серверный код: помещайте файл во временное хранилище. Всегда проверяйте отмену диалога и существование файла перед использованием пути.