Разработка и Конфигурация · 13 мин
Как в 1С получить имя файла из полного пути
Как в 1С получить имя файла из полного пути: методы ПолучитьИмяФайла, работа с объектом Файл, разбор строки, примеры кода и типичные ошибки разработчиков.
Задача извлечь имя файла из полного пути — одна из самых частых при разработке на платформе 1С:Предприятие. Она возникает при загрузке данных из файлов обмена, при формировании отчётов во внешние файлы, при сохранении вложений и при обработке путей, выбранных пользователем через диалог. Полный путь вида C:\Документы\Отчеты\Продажи_январь.xlsx нужно разбить так, чтобы осталось только Продажи_январь.xlsx, а иногда — ещё и имя без расширения.
Во встроенном языке 1С есть несколько рабочих подходов: объект Файл, универсальная функция разбора строки с учётом разделителей пути, а также готовые процедуры из Библиотеки стандартных подсистем (БСП), если конфигурация на ней построена. Выбор зависит от того, где выполняется код (клиент или сервер), нужна ли проверка существования файла и какая операционная система используется — в Linux разделитель пути другой.
Ниже разобраны основные способы с примерами кода, ограничения каждого подхода, типичные ошибки и способы проверить результат. Материал применим к управляемым и обычным формам, к тонкому, веб- и толстому клиенту, если не указано иное.
Способ 1: объект Файл и его свойства
Объект Файл во встроенном языке 1С предназначен для работы с файловой системой, но для извлечения имени файла проверять его существование не обязательно. Достаточно создать объект, передав в конструктор полный путь, и прочитать нужные свойства.
ПолныйПуть = "C:\Документы\Отчеты\Продажи_январь.xlsx";
ФайлОбъект = Новый Файл(ПолныйПуть);
ИмяФайла = ФайлОбъект.Имя; // "Продажи_январь.xlsx"
ИмяБезРасширения = ФайлОбъект.ИмяБезРасширения; // "Продажи_январь"
Расширение = ФайлОбъект.Расширение; // ".xlsx"
ПутьКаталога = ФайлОбъект.Путь; // "C:\Документы\Отчеты\"
Ключевые свойства объекта: Имя — полное имя файла с расширением, ИмяБезРасширения — имя без точки и расширения, Расширение — расширение с ведущей точкой, Путь — каталог, в котором лежит файл. Этот набор закрывает практически все типовые сценарии разбора пути.
Важно понимать: конструктор Новый Файл() не обращается к диску при создании объекта. Даже если файла по указанному пути нет, свойства имени будут заполнены корректно — объект просто разбирает строку пути. Обращение к диску происходит только при вызове методов вроде Существует(), Размер() или ПолучитьВремяИзменения().
Способ 2: разбор строки через СтрРазделить
Если по какой-то причине объект Файл использовать нежелательно — например, код выполняется в контексте, где работа с файловой системой ограничена, или путь пришёл из внешней системы и не является локальным — строку можно разобрать вручную функцией СтрРазделить.
Функция ИмяФайлаИзПути(ПолныйПуть) Экспорт
// Нормализуем разделители: и Windows, и Linux
ПутьНорм = СтрЗаменить(ПолныйПуть, "/", "\");
ЧастиПути = СтрРазделить(ПутьНорм, "\", Ложь);
Если ЧастиПути.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
Возврат ЧастиПути[ЧастиПути.Количество() - 1];
КонецФункции
Третий параметр Ложь в СтрРазделить отключает включение пустых строк в результат — это важно, если путь заканчивается разделителем. Последний элемент массива и будет именем файла. Если нужно отделить расширение, примените к результату ещё одно разбиение по точке, но осторожно: в имени файла точек может быть несколько, поэтому расширение — это часть после последней точки, а не после первой.
Ручной разбор даёт полный контроль над логикой и не зависит от платформенных объектов, но требует аккуратности с граничными случаями: пустая строка, путь без каталога (только имя файла), сетевой путь вида \\server\share\file.txt. Во всех этих случаях алгоритм выше отработает корректно, поскольку берёт последний непустой фрагмент.
Способ 3: функции Библиотеки стандартных подсистем
В конфигурациях на базе БСП (1С:Бухгалтерия, 1С:ERP, Управление торговлей и другие типовые) уже есть готовые механизмы работы с файлами. Для разбора пути чаще всего используют общий модуль ОбщегоНазначенияКлиентСервер и связанные с ним функции, а также модуль ФайловаяСистема в свежих версиях библиотеки.
Типовой подход внутри БСП — тот же объект Файл, обёрнутый в проверки и нормализацию разделителей. Если вы дорабатываете типовую конфигурацию, имеет смысл сначала поискать подходящую функцию в общих модулях через глобальный поиск по словам «ИмяФайла», «РазделительПути», «ПолучитьИмяФайла» — это снижает объём собственного кода и упрощает обновление.
Для определения разделителя пути в кроссплатформенном коде БСП использует конструкцию вида:
Разделитель = ПолучитьРазделительПути(); // "\" в Windows, "/" в Linux
Функция ПолучитьРазделительПути() доступна во встроенном языке напрямую и возвращает разделитель, соответствующий операционной системе, где выполняется код. Это важно для серверного кода: сервер 1С может работать на Linux, даже если все пользователи сидят на Windows.
Как выбрать способ
Клиент и сервер: где выполнять разбор пути
Разбор строки пути — чисто строковая операция, и сам по себе он не требует обращения к файловой системе. Поэтому функцию извлечения имени файла можно безопасно размещать в общем модуле с признаками «Сервер» и «Клиент (обычное приложение)» / «Клиент (управляемое приложение)», чтобы она была доступна отовсюду.
Тонкость возникает в другом месте: путь, который пользователь видит на своём компьютере, на сервере может не существовать. Если файл выбран в диалоге на клиенте, а обрабатываться должен на сервере, недостаточно передать туда путь — нужно передать сам файл, например через временное хранилище (ПоместитьВоВременноеХранилище) или через механизм НачатьПомещениеФайла. Имя файла при этом извлекайте на клиенте и передавайте отдельным параметром.
Ещё одна особенность веб-клиента: из соображений безопасности браузер может не отдавать полный путь к выбранному файлу, а возвращать только имя или фиктивный путь вида C:\fakepath\file.txt. Поэтому в веб-клиенте не стоит строить логику на анализе пути, полученного из диалога выбора, — опирайтесь на имя файла, которое платформа передаёт отдельно.
Граничные случаи и проверка результата
Реальные пути из пользовательского ввода и внешних систем редко бывают «чистыми». Перед разбором полезно обработать типовые ситуации: пробелы по краям строки (исправляется СокрЛП), смешанные разделители / и \, путь в кавычках (кавычки нужно снять), путь, заканчивающийся разделителем, — в последнем случае это каталог, а не файл, и «имя файла» будет пустым.
Отдельный случай — файлы без расширения и файлы, начинающиеся с точки (например, .gitignore). Объект Файл обрабатывает их по-своему: для .gitignore имя без расширения может оказаться пустым, а всё имя попадёт в расширение. Если ваша логика критична к таким именам, проверьте поведение на тестовых примерах и при необходимости используйте ручной разбор по последней точке.
Проверить корректность функции проще всего небольшим набором контрольных примеров. Прогоните через неё пути Windows и Linux, сетевые пути, имя без каталога и пустую строку — и сравните с ожидаемым результатом.
Как проверить результат
Имя файла: report.pdf, расширение: .pdf
Имя содержит часть пути или лишний разделитель
Имя файла: data.csv
Возвращается вся строка целиком — разделитель не нормализован
Пустое имя или осмысленная обработка каталога
Ошибка обращения к элементу массива
Возвращается пустая строка без исключения
Падает ошибка обращения к индексу
Типичные ошибки при извлечении имени файла
Большинство проблем с этой задачей связано не с самим разбором, а с допущениями о формате пути. Разберём самые частые промахи.
Первая ошибка — жёстко зашитый разделитель \. Код, отлаженный на Windows, молча ломается на Linux-сервере, где разделитель — /. Вторая ошибка — поиск расширения через первую точку: для файла акт.сверка.01.02.xlsx такой подход вернёт «расширение» .сверка.01.02.xlsx. Третья — попытка читать свойства размера или даты файла, который не существует: методы Размер() и ПолучитьВремяИзменения() в этом случае вызывают исключение, поэтому перед ними нужна проверка Существует().
Практический пример: универсальная функция для общего модуля
Ниже — компактная функция, которую можно поместить в общий модуль и использовать во всех контекстах. Она возвращает структуру с именем файла, именем без расширения и расширением, устойчива к разным разделителям и не требует существования файла.
Функция РазобратьПутьФайла(ПолныйПуть) Экспорт
Результат = Новый Структура("Имя, ИмяБезРасширения, Расширение", "", "", "");
ПутьНорм = СокрЛП(ПолныйПуть);
Если ПустаяСтрока(ПутьНорм) Тогда
Возврат Результат;
КонецЕсли;
ФайлОбъект = Новый Файл(ПутьНорм);
Результат.Имя = ФайлОбъект.Имя;
Результат.ИмяБезРасширения = ФайлОбъект.ИмяБезРасширения;
Результат.Расширение = ФайлОбъект.Расширение;
Возврат Результат;
КонецФункции
Вызов выглядит так: Части = РазобратьПутьФайла("D:\Обмен\заказы.xml"); Сообщить(Части.Имя); — на экране появится заказы.xml. Если нужно только имя и ничего больше, достаточно одной строки: Имя = Новый Файл(Путь).Имя; — встроенный язык позволяет обращаться к свойствам объекта сразу после конструктора.
Если имя файла дальше используется для формирования имени выгрузки или подстановки в шаблон, сразу отсекайте недопустимые символы. Пользовательские файлы часто содержат в имени двоеточия, слэши и другие знаки, которые недопустимы в именах файлов Windows и приведут к ошибке при сохранении.
Часто задаваемые вопросы
Можно ли получить имя файла, если файла физически нет на диске?
Да. Конструктор Новый Файл(Путь) только разбирает строку и не обращается к диску. Свойства Имя, ИмяБезРасширения, Расширение и Путь будут заполнены корректно независимо от существования файла. К диску обращаются лишь методы вроде Существует(), Размер() и ПолучитьВремяИзменения().
Как получить имя файла без расширения?
Используйте свойство ИмяБезРасширения объекта Файл: Новый Файл(Путь).ИмяБезРасширения. Для пути C:\Docs\отчёт.xlsx оно вернёт «отчёт». При ручном разборе отсекайте часть после последней точки, а не первой — иначе имена с несколькими точками обрежутся неправильно.
Код работал на Windows, а на Linux-сервере возвращает весь путь целиком. В чём причина?
Причина в разделителе пути: в Windows это обратный слэш, в Linux — прямой. Если разбор строки жёстко привязан к символу «\», на Linux разбиения не произойдёт. Решение — использовать ПолучитьРазделительПути() или предварительно заменять один разделитель на другой через СтрЗаменить. Объект Файл в большинстве случаев корректно обрабатывает оба варианта.
Как извлечь только каталог, в котором лежит файл?
Свойство Путь объекта Файл возвращает каталог с завершающим разделителем: для C:\Docs\отчёт.xlsx это будет C:\Docs\. Если нужен каталог без завершающего слэша, отсеките последний символ через Лев(Путь, СтрДлина(Путь) - 1), предварительно убедившись, что строка не пустая.
Почему в веб-клиенте из диалога выбора приходит странный путь вида C:\fakepath\...?
Это ограничение безопасности браузеров: они не раскрывают веб-приложению реальную структуру каталогов пользователя и подставляют фиктивный путь. Строить логику на его разборе нельзя — используйте имя файла, которое платформа передаёт отдельно при помещении файла во временное хранилище, например через обработчики НачатьПомещениеФайла.
Что вернёт объект Файл для имени .gitignore или файла без расширения?
Для имени, начинающегося с точки, платформа может трактовать всё имя как расширение, оставив ИмяБезРасширения пустым. Для файла без расширения свойство Расширение будет пустой строкой, а Имя и ИмяБезРасширения совпадут. Если такие имена встречаются в ваших данных, проверьте поведение на контрольных примерах и при необходимости реализуйте ручной разбор по последней точке.
Что важно запомнить
Проще всего получить имя файла через объект Файл: свойства Имя, ИмяБезРасширения, Расширение и Путь заполняются без обращения к диску. Не зашивайте разделитель пути в код — на Linux-сервере он другой. Не передавайте клиентский путь на сервер для чтения файла: передавайте содержимое через временное хранилище, а имя — отдельной строкой.