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

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

Как получить путь файла в 1С

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

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

Выбор способа зависит от контекста: работает код на клиенте или на сервере, нужен ли пользователю интерактивный выбор, требуется ли полный путь или только каталог. Ниже разобраны основные сценарии с примерами кода, которые можно адаптировать под свою конфигурацию.

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

Интерактивный выбор файла через ДиалогВыбораФайла

Когда пользователь сам должен указать файл, применяется объект ДиалогВыбораФайла. Он поддерживает три режима: открытие существующего файла, сохранение и выбор каталога. Режим задаётся конструктором.

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

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

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

Диалог.Заголовок = "Выберите файл прайса";

Если Диалог.Выбрать() Тогда

ПутьКФайлу = Диалог.ПолноеИмяФайла;

КонецЕсли;

После успешного выбора полный путь доступен в свойстве ПолноеИмяФайла, а при множественном выборе — в массиве ВыбранныеФайлы. Если пользователь нажал «Отмена», метод Выбрать() возвращает Ложь, и это нужно обязательно обрабатывать, иначе дальнейший код обратится к пустому пути.

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

Разбор готового пути: объект Файл

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

Файл = Новый Файл("C:\Обмен\Прайсы\price_01.xlsx");

Каталог = Файл.Путь; // C:\Обмен\Прайсы\

ИмяФайла = Файл.Имя; // price_01.xlsx

БезРасш = Файл.ИмяБезРасширения; // price_01

Расширение = Файл.Расширение; // .xlsx

Обратите внимание: свойство Путь возвращает каталог с завершающим разделителем, а Расширение — с точкой в начале. Эти детали часто становятся причиной ошибок при склейке строк, когда в результате получается двойной слэш или имя без точки.

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

Служебные каталоги: временные файлы и каталог программы

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

  • КаталогВременныхФайлов() — путь к системному каталогу временных файлов с завершающим разделителем;
  • ПолучитьИмяВременногоФайла("xlsx") — полное уникальное имя временного файла с указанным расширением;
  • КаталогПрограммы() — каталог исполняемых файлов платформы;
  • ТекущийКаталог() и УстановитьТекущийКаталог() — чтение и смена рабочего каталога процесса.
ИмяФайла = ПолучитьИмяВременногоФайла("xml");

Запись = Новый ЗаписьXML;

Запись.ОткрытьФайл(ИмяФайла);

// ... формирование данных ...

Запись.Закрыть();

Учтите, что на сервере 1С временные каталоги относятся к серверному процессу, а не к компьютеру пользователя. Если файл нужно отдать пользователю, его передают через временное хранилище и метод ПолучитьФайл() на клиенте.

Клиент и сервер: где выполняется код с путями

Ключевая ловушка при работе с путями — различие контекстов выполнения. Код в серверной процедуре видит файловую систему сервера, а не компьютер пользователя. Путь «C:\Документы\файл.xlsx» на сервере указывает на диск сервера, где такого файла, скорее всего, нет.

Типовая схема обмена файлом между клиентом и сервером выглядит так:

Порядок действий
  1. 1
    На клиенте вызовите НачатьПомещениеФайла() и получите адрес во временном хранилище
  2. 2
    Передайте адрес в серверную процедуру как параметр
  3. 3
    На сервере получите двоичные данные: ПолучитьИзВременногоХранилища(Адрес)
  4. 4
    Запишите данные во временный файл на сервере методом Записать() и обработайте его
  5. 5
    После обработки удалите временный файл и очистите хранилище

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

Поиск файлов и обход каталогов

Когда нужно получить не один путь, а список файлов по маске, используется функция НайтиФайлы(). Она возвращает массив объектов Файл, из которых уже можно извлекать полные имена.

Найденные = НайтиФайлы("D:\Выгрузки\", "*.xml", Истина);

Для Каждого Ф Из Найденные Цикл

Если Не Ф.ЭтоКаталог() Тогда

Сообщить(Ф.ПолноеИмя);

КонецЕсли;

КонецЦикла;

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

Дополнительно полезны методы объекта Файл: ЭтоКаталог() и ЭтоФайл() для определения типа, Размер() и ПолучитьВремяИзменения() для контроля актуальности выгрузки.

Типичные ошибки
01
Использование клиентского пути в серверном коде — файл не находится, обмен падает с ошибкой
02
Жёсткое прописывание пути вроде C:\Обмен\ в коде — после переезда базы или смены сервера всё перестаёт работать; пути выносят в настройки
03
Склейка путей через конкатенацию без учёта завершающего разделителя — получаются двойные слэши или склеенные имена
04
Отсутствие проверки Существует() перед чтением — пользователь видит системную ошибку вместо понятного сообщения
05
Утечка временных файлов: созданные ПолучитьИмяВременногоФайла() файлы не удаляются и забивают диск сервера

Проверка результата и безопасная организация путей

Надёжная схема работы с путями строится на трёх правилах: пути хранятся в настройках, а не в коде; перед операцией проверяется существование файла или каталога; временные файлы удаляются после использования.

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

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

Путь после ДиалогВыбораФайла
Норма

ПолноеИмяФайла содержит непустую строку с выбранным файлом

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

Пустая строка или обращение к свойству без проверки результата Выбрать()

Разбор пути объектом Файл
Норма

Путь заканчивается разделителем, Расширение начинается с точки

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

Склейка даёт двойные слэши или имя без точки перед расширением

Чтение файла на сервере
Норма

Файл.Существует() вернул Истина, данные прочитаны

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

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

Для хранения путей обмена подойдут константы, регистры сведений или реквизиты справочника настроек. При сетевой работе предпочтительнее UNC-пути вида \\Server\Share\, чем подключённые диски: буква диска зависит от сессии пользователя и под серверной учётной записью может отсутствовать.

Права доступа проверяйте под той учётной записью, под которой работает сервер 1С (обычно USR1CV8). То, что папка открывается у администратора в проводнике, не гарантирует доступа для серверного процесса.

Итог

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

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

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

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

Создайте объект Файл с полным путём и прочитайте свойство Имя — оно вернёт имя с расширением. Если расширение не нужно, используйте свойство ИмяБезРасширения. Файл при этом не обязан существовать на диске.

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

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

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

Используйте ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.ВыборКаталога — после вызова Выбрать() выбранный каталог будет в свойстве Каталог. Для разбора пути к файлу каталог возвращает свойство Путь объекта Файл.

Чем отличается ПолучитьИмяВременногоФайла от КаталогВременныхФайлов?

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

Можно ли в 1С получить путь к базе данных?

Да, для файловой базы функция СтрокаСоединенияИнформационнойБазы() вернёт строку соединения, из которой извлекается каталог параметром File. Для клиент-серверной базы физический путь к данным определяется СУБД и из встроенного языка напрямую не получается.

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

Вызовите метод УдалитьФайлы(ПолноеИмя) после завершения работы с файлом. Желательно делать это в блоке с обработкой исключений, чтобы файл удалился даже при ошибке обработки, иначе временные файлы будут накапливаться на диске сервера.