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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в системе 1С:Предприятие часто возникает необходимость создания временных файлов (например, для формирования PDF-печатных форм, выгрузки данных в Excel или обмена через XML). Стандартная функция ПолучитьИмяВременногоФайла() возвращает абсолютный путь, включающий в себя имя диска, цепочку каталогов и само расширение. Однако для дальнейшей логики программы — например, для отправки файла по электронной почте с красивым заголовком или записи в базу — нам зачастую требуется только имя файла. Рассмотрим подробнее все существующие способы решения этой задачи, от простых встроенных объектов до продвинутых функций Библиотеки стандартных подсистем (БСП).

Способ 1: Использование универсального объекта Файл

Этот метод считается наиболее правильным и надежным в среде 1С. Объект Файл предназначен специально для работы с файловой системой и автоматически обрабатывает специфику операционной системы (Windows или Linux). Проанализируем, как это работает на практике:


// Получаем полный путь к временному файлу
ПолныйПуть = ПолучитьИмяВременногоФайла("pdf");

// Создаем объект Файл
ОбъектФайл = Новый Файл(ПолныйПуть);

// Вариант А: Получаем имя с расширением
ИмяСРасширением = ОбъектФайл.Имя; 

// Вариант Б: Получаем имя без расширения
ИмяБезРасширения = ОбъектФайл.ИмяБезРасширения;

Сообщить("Имя файла: " + ИмяСРасширением);

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

Способ 2: Использование функций БСП (Библиотека стандартных подсистем)

Если ваша конфигурация построена на базе современных типовых решений (ERP, УТ 11, БП 3.0), то в ней наверняка присутствуют общие модули БСП. Использование готового программного интерфейса (API) делает код более читаемым и соответствующим стандартам разработки 1С. Разберем основные функции:

1. Модуль ОбщегоНазначенияКлиентСервер

В этом модуле есть мощная функция РазложитьПолноеИмяФайла, которая возвращает структуру со всеми составляющими пути.


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

// Структура содержит свойства: Путь, Имя, Расширение, ИмяБезРасширения
ИмяФайла = СтруктураИмени.Имя;

2. Модуль ФайловаяСистема

В последних версиях БСП рекомендуется использовать специализированные методы для получения конкретных частей пути:


ПолныйПуть = ПолучитьИмяВременногоФайла("pdf");
ИмяСРасширением = ФайловаяСистема.ИмяФайла(ПолныйПуть);
Расширение = ФайловаяСистема.РасширениеФайла(ПолныйПуть);

Способ 3: Строковые манипуляции (для старых платформ)

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


ПолноеИмя = ПолучитьИмяВременногоФайла("pdf");
// Ищем позицию последнего обратного слэша
ПозицияРазделителя = СтрНайти(ПолноеИмя, "\", НаправлениеПоиска.СКонца);
ИмяФайла = Сред(ПолноеИмя, ПозицияРазделителя + 1);

Важное замечание: помните, что в Linux разделителем является прямой слэш /. Чтобы код был кроссплатформенным, вместо жесткого прописывания знака "\" лучше использовать функцию ПолучитьРазделительПути().

Также существует интересный способ с использованием замены символов на переносы строк, что позволяет работать с путем как со многострочным текстом:


Функция ВыделитьИмяФайла(ПолноеИмя)
    // Заменяем все слэши на символы переноса строки
    Результат = СтрЗаменить(ПолноеИмя, "\", Символы.ПС);
    Результат = СтрЗаменить(Результат, "/", Символы.ПС);
    
    // Возвращаем последнюю строку
    Возврат СтрПолучитьСтроку(Результат, СтрЧислоСтрок(Результат));
КонецФункции

Важные технические нюансы работы с временными файлами

Выясним некоторые неочевидные особенности функции ПолучитьИмяВременногоФайла(), которые часто упускают начинающие программисты:

  1. Физическое создание файла: В момент вызова этой функции 1С не просто генерирует строку, но и физически создает на диске пустой файл размером 0 байт. Это гарантирует уникальность имени — ни один другой процесс в эту же миллисекунду не получит такое же имя.
  2. Автоматическая очистка: Несмотря на то что временные файлы должны удаляться системой, хорошим тоном считается явное удаление файла после завершения работы с ним.
  3. Безопасное удаление: Если файл открыт в стороннем приложении (например, PDF открыт пользователем в браузере или Adobe Reader), попытка его удаления вызовет ошибку. Рекомендуем использовать блок Попытка...Исключение.

Попытка
    УдалитьФайлы(ПолныйПуть);
Исключение
    ЗаписьЖурналаРегистрации("Файловые операции", УровеньЖурналаРегистрации.Предупреждение, , , 
        "Не удалось удалить временный файл: " + ПодробноеОписаниеОшибки(ОписаниеОшибки()));
КонецПопытки;

Как избежать коллизий имен?

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


// Генерируем уникальный ID и очищаем его от лишних символов (тире и т.д.)
ИдФайла = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
КаталогВрем = КаталогВременныхФайлов();
ПолноеИмя = КаталогВрем + ИдФайла + ".pdf";

// Работаем с файлом...

Подведем итог: для большинства современных задач оптимальным выбором будет использование объекта Файл (через Новый Файл()) или методов БСП ФайловаяСистема.ИмяФайла(). Это гарантирует стабильную работу программы как под управлением ОС Windows, так и на серверах под Linux.

← На главную