В процессе разработки в системе 1С:Предприятие часто возникает необходимость создания временных файлов (например, для формирования PDF-печатных форм, выгрузки данных в Excel или обмена через XML). Стандартная функция ПолучитьИмяВременногоФайла() возвращает абсолютный путь, включающий в себя имя диска, цепочку каталогов и само расширение. Однако для дальнейшей логики программы — например, для отправки файла по электронной почте с красивым заголовком или записи в базу — нам зачастую требуется только имя файла. Рассмотрим подробнее все существующие способы решения этой задачи, от простых встроенных объектов до продвинутых функций Библиотеки стандартных подсистем (БСП).
Этот метод считается наиболее правильным и надежным в среде 1С. Объект Файл предназначен специально для работы с файловой системой и автоматически обрабатывает специфику операционной системы (Windows или Linux). Проанализируем, как это работает на практике:
// Получаем полный путь к временному файлу
ПолныйПуть = ПолучитьИмяВременногоФайла("pdf");
// Создаем объект Файл
ОбъектФайл = Новый Файл(ПолныйПуть);
// Вариант А: Получаем имя с расширением
ИмяСРасширением = ОбъектФайл.Имя;
// Вариант Б: Получаем имя без расширения
ИмяБезРасширения = ОбъектФайл.ИмяБезРасширения;
Сообщить("Имя файла: " + ИмяСРасширением);
Преимущества: этот способ автоматически учитывает разделители пути (слэши), которые различаются в разных ОС, и вам не нужно вручную искать символы в строке.
Если ваша конфигурация построена на базе современных типовых решений (ERP, УТ 11, БП 3.0), то в ней наверняка присутствуют общие модули БСП. Использование готового программного интерфейса (API) делает код более читаемым и соответствующим стандартам разработки 1С. Разберем основные функции:
1. Модуль ОбщегоНазначенияКлиентСервер
В этом модуле есть мощная функция РазложитьПолноеИмяФайла, которая возвращает структуру со всеми составляющими пути.
ИмяВрем = ПолучитьИмяВременногоФайла("pdf");
СтруктураИмени = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяВрем);
// Структура содержит свойства: Путь, Имя, Расширение, ИмяБезРасширения
ИмяФайла = СтруктураИмени.Имя;
2. Модуль ФайловаяСистема
В последних версиях БСП рекомендуется использовать специализированные методы для получения конкретных частей пути:
ПолныйПуть = ПолучитьИмяВременногоФайла("pdf");
ИмяСРасширением = ФайловаяСистема.ИмяФайла(ПолныйПуть);
Расширение = ФайловаяСистема.РасширениеФайла(ПолныйПуть);
В некоторых случаях (например, работа на очень старых релизах платформы или в специфических режимах совместимости) разработчики прибегают к функциям работы со строками. Посмотрим на пример, где мы ищем последний разделитель пути:
ПолноеИмя = ПолучитьИмяВременногоФайла("pdf");
// Ищем позицию последнего обратного слэша
ПозицияРазделителя = СтрНайти(ПолноеИмя, "\", НаправлениеПоиска.СКонца);
ИмяФайла = Сред(ПолноеИмя, ПозицияРазделителя + 1);
Важное замечание: помните, что в Linux разделителем является прямой слэш /. Чтобы код был кроссплатформенным, вместо жесткого прописывания знака "\" лучше использовать функцию ПолучитьРазделительПути().
Также существует интересный способ с использованием замены символов на переносы строк, что позволяет работать с путем как со многострочным текстом:
Функция ВыделитьИмяФайла(ПолноеИмя)
// Заменяем все слэши на символы переноса строки
Результат = СтрЗаменить(ПолноеИмя, "\", Символы.ПС);
Результат = СтрЗаменить(Результат, "/", Символы.ПС);
// Возвращаем последнюю строку
Возврат СтрПолучитьСтроку(Результат, СтрЧислоСтрок(Результат));
КонецФункции
Выясним некоторые неочевидные особенности функции ПолучитьИмяВременногоФайла(), которые часто упускают начинающие программисты:
Попытка...Исключение.
Попытка
УдалитьФайлы(ПолныйПуть);
Исключение
ЗаписьЖурналаРегистрации("Файловые операции", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось удалить временный файл: " + ПодробноеОписаниеОшибки(ОписаниеОшибки()));
КонецПопытки;
Проанализируем ситуацию: вы получили имя временного файла, но затем решили сохранить его в общую сетевую папку. Есть риск, что там уже существует файл с таким же именем. Чтобы минимизировать риски, можно использовать генерацию имен на основе УникальныйИдентификатор, как было предложено опытными разработчиками:
// Генерируем уникальный ID и очищаем его от лишних символов (тире и т.д.)
ИдФайла = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
КаталогВрем = КаталогВременныхФайлов();
ПолноеИмя = КаталогВрем + ИдФайла + ".pdf";
// Работаем с файлом...
Подведем итог: для большинства современных задач оптимальным выбором будет использование объекта Файл (через Новый Файл()) или методов БСП ФайловаяСистема.ИмяФайла(). Это гарантирует стабильную работу программы как под управлением ОС Windows, так и на серверах под Linux.