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

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

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

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

Задача извлечь имя файла из полного пути возникает в 1С постоянно: при загрузке прайсов, обработке выгрузок, записи путей в присоединённые файлы, формировании отчётов по обмену данными. Путь вида «C:\Документы\Прайсы\прайс_октябрь.xlsx» нужно разобрать, чтобы показать пользователю понятное имя или сохранить его в базу.

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

Ниже разобраны основные методы с примерами кода, различия между тонким клиентом и сервером, обработка имён с расширением и без него, а также типичные ошибки, из-за которых код «работает у разработчика», но падает в реальной базе.

Получение имени файла через объект Файл

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

1c
ПолныйПуть = "C:\Документы\Прайсы\прайс_октябрь.xlsx";
Файл = Новый Файл(ПолныйПуть);
ИмяФайла = Файл.Имя;              // "прайс_октябрь.xlsx"
ИмяБезРасш = Файл.ИмяБезРасширения; // "прайс_октябрь"
Расширение = Файл.Расширение;      // ".xlsx"

Ключевые свойства объекта:

  • Имя — имя файла вместе с расширением;
  • ИмяБезРасширения — только имя, расширение отсекается;
  • Расширение — расширение с точкой, например «.xlsx»;
  • Путь — каталог, в котором лежит файл, без имени файла.

Важно понимать: конструктор Новый Файл() не обращается к диску. Проверка существования выполняется только при вызове метода Существует(). Поэтому объект смело можно использовать как «парсер пути» даже для файлов, которые ещё не созданы или уже удалены.

Разбор пути строковыми функциями

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

Функция ИмяФайлаИзПути(ПолныйПуть)

// Нормализуем разделители: приводим прямые слэши к обратным

НормализованныйПуть = СтрЗаменить(ПолныйПуть, "/", "\");

Части = СтрРазделить(НормализованныйПуть, "\");

Возврат Части[Части.ВГраница()];

КонецФункции

Функция СтрРазделить доступна начиная с платформы 8.3.6. Если конфигурация работает на более старой платформе или в режиме совместимости, где функция недоступна, используют связку СтрНайти и Сред с поиском последнего слэша:

Функция ИмяФайлаИзПутиСтарыйСпособ(ПолныйПуть)

Путь = СтрЗаменить(ПолныйПуть, "/", "\");

Позиция = 0;

ПозицияСлэша = СтрНайти(Путь, "\");

Пока ПозицияСлэша > 0 Цикл

Позиция = ПозицияСлэша;

ПозицияСлэша = СтрНайти(Путь, "\", , Позиция + 1);

КонецЦикла;

Возврат Сред(Путь, Позиция + 1);

КонецФункции

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

Готовые функции в конфигурациях на БСП

В типовых конфигурациях (УТ, ERP, Бухгалтерия, ЗУП и других на базе Библиотеки стандартных подсистем) изобретать ничего не нужно — там уже есть серверные функции для работы с путями. В зависимости от версии БСП используются функции общих модулей ОбщегоНазначенияКлиентСервер и ФайловаяСистема.

// Разложить путь на структуру (БСП)

СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПолныйПуть);

ИмяФайла = СтруктураПути.Имя; // имя с расширением

ИмяБезРасш = СтруктураПути.ИмяБезРасширения;

Расширение = СтруктураПути.Расширение;

ПутьКаталога = СтруктураПути.Путь;

Преимущество функций БСП в том, что они уже протестированы на граничных случаях: пустые строки, пути с точками в именах каталогов, сетевые пути вида \\server\share\file.txt. Если ваша конфигурация построена на БСП, сначала проверьте наличие готовой функции — самописный аналог часто дублирует уже существующий код.

Сравнение способов

Объект Файл

Универсально, работает на клиенте и сервере, не требует существования файла. Оптимальный выбор по умолчанию.

СтрРазделить / СтрНайти

Подходит для нестандартных путей и чисто строковой обработки. Требует ручной обработки граничных случаев.

Функции БСП

Лучший вариант в типовых конфигурациях: проверенный код, обработка сетевых путей. Недоступно в конфигурациях без БСП.

Имя файла с расширением и без: что выбрать

На практике часто нужно не просто имя, а имя в конкретном виде. Правило выбора простое:

  • Для отображения пользователю и записи в присоединённые файлы обычно берут Имя (с расширением) — так понятнее, что за документ перед нами.
  • Для формирования нового имени, например при выгрузке с добавлением даты, удобнее ИмяБезРасширения, к которому дописывается суффикс, а расширение присоединяется отдельно.
  • Для проверки типа файла анализируют Расширение, приводя его к нижнему регистру: НРег(Файл.Расширение) = ".xlsx".
Файл = Новый Файл(ПолныйПуть);

Если НРег(Файл.Расширение) <> ".xlsx" Тогда

Сообщить("Ожидается файл Excel, выбран: " + Файл.Имя);

Возврат;

КонецЕсли;

НовоеИмя = Файл.ИмяБезРасширения + "_обработан" + Файл.Расширение;

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

Типичные ошибки
01
Сравнение расширения без приведения регистра: ".XLSX" не равно ".xlsx", проверка молча не срабатывает — всегда используйте НРег().
02
Разбор пути только по обратному слэшу: путь с прямыми слэшами из веб-сервиса возвращается целиком вместо имени — нормализуйте разделители через СтрЗаменить.
03
Отсечение расширения через СтрНайти(Имя, "."): у имени "отчет.итоговый.xlsx" отрежется всё после первой точки — ищите последнюю точку или используйте объект Файл.
04
Ожидание, что Новый Файл() проверит существование: конструктор не обращается к диску, для проверки вызывайте Существует().

Особенности работы на клиенте и сервере

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

При этом извлечение имени из пути — чисто строковая операция, и объект Файл со свойством Имя отработает на сервере корректно, даже если сам файл там недоступен. Падает именно чтение содержимого, а не разбор пути.

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

Если обмен идёт через НачатьПомещениеФайлов, имя файла доступно в описании помещённого файла — отдельный разбор пути там обычно не нужен.

Граничные случаи и проверка результата

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

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

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

Имя извлечено из пути "C:\Данные\отчет.xlsx"
Норма

Получено "отчет.xlsx"

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

Получен весь путь целиком или пустая строка — проверьте нормализацию слэшей

Путь оканчивается слэшем (указан каталог)
Норма

Код явно обрабатывает этот случай и возвращает пустое имя или имя каталога по логике задачи

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

Возвращается пустая строка, которая дальше записывается в базу как имя файла

Сетевой путь \\server\share\file.txt
Норма

Имя извлекается корректно

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

Двойной слэш в начале ломает разбиение — проверьте на реальном сетевом пути

Имя содержит несколько точек
Норма

Расширение — часть после последней точки

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

Отрезано всё после первой точки

Для надёжности оберните извлечение в функцию с минимальной валидацией:

Функция ПолучитьИмяФайла(ПолныйПуть)

Если ПустаяСтрока(ПолныйПуть) Тогда

Возврат "";

КонецЕсли;

Файл = Новый Файл(СокрЛП(ПолныйПуть));

Возврат Файл.Имя;

КонецФункции

FAQ: частые вопросы

Как получить имя файла, если файл физически не существует?

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

Как отрезать расширение от имени файла?

Используйте свойство ИмяБезРасширения объекта Файл — оно отсекает часть после последней точки. Строковый вариант: найти последнюю точку циклом через СтрНайти и взять Лев(Имя, Позиция - 1). Учтите, что у файла без расширения точки в имени может не быть вовсе.

Почему на сервере не работает путь, полученный на клиенте?

Клиент и сервер — разные машины с разными файловыми системами. Путь «C:\...» пользователя недоступен серверу 1С. Передавайте на сервер содержимое файла через временное хранилище, а имя файла — отдельным строковым параметром, извлечённым на клиенте.

Чем отличаются свойства Имя и ИмяБезРасширения?

Имя возвращает имя файла вместе с расширением, например «отчет.xlsx». ИмяБезРасширения — только «отчет». Для отображения пользователю обычно берут первое, для формирования новых имён при выгрузке — второе.

Как обработать путь с прямыми слэшами из Linux или веб-сервиса?

Объект Файл понимает оба типа разделителей, дополнительная обработка не нужна. При строковом разборе через СтрРазделить сначала приведите путь к одному виду: СтрЗаменить(Путь, "/", "\"), иначе имя не извлечётся.

Есть ли готовая функция в типовых конфигурациях?

Да, в конфигурациях на базе БСП есть функция ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(), возвращающая структуру с полями Имя, ИмяБезРасширения, Расширение и Путь. Перед написанием собственной функции проверьте её наличие в вашей версии библиотеки.

Итог

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

Для извлечения имени файла из пути в 1С используйте объект Файл и его свойства Имя и ИмяБезРасширения — это работает без обращения к диску и на клиенте, и на сервере. Строковый разбор через СтрРазделить применяйте для нестандартных путей, не забывая нормализовать слэши. При передаче файлов с клиента на сервер извлекайте имя на клиенте и передавайте его отдельным параметром.