Разработка и Конфигурация · 9 мин
Как в 1С получить расширение файла
Как в 1С получить расширение файла: объект Файл, СтрПолучитьСтроку, функции БСП, работа без точки и с вложениями. Примеры кода, ошибки и проверка результата.
Задача получить расширение файла возникает в 1С постоянно: при загрузке вложений, проверке формата перед обработкой, формировании имени файла для выгрузки, фильтрации документов по типу. Встроенный язык 1С не содержит одной универсальной функции «взять расширение», поэтому разработчики используют несколько подходов — от штатного объекта Файл до функций Библиотеки стандартных подсистем (БСП).
Выбор способа зависит от контекста: файл лежит на диске или существует только как строка с именем, код выполняется на клиенте или на сервере, доступна ли БСП в конфигурации. Ниже разобраны рабочие варианты с примерами кода, ограничениями каждого и типичными ошибками.
Получение расширения через объект Файл
Самый простой и надёжный способ — создать объект Файл и прочитать его свойство Расширение. Важно: файл при этом не обязан физически существовать на диске, конструктор просто разбирает переданный путь.
Файл = Новый Файл("C:\Документы\Отчет.pdf");
Расширение = Файл.Расширение; // ".pdf"
Свойство возвращает расширение вместе с точкой и в том регистре, в котором оно записано в имени файла. Если точки в имени нет, результатом будет пустая строка. Для сравнения с эталонным значением приводите обе стороны к одному регистру через НРег() — пользователи регулярно сохраняют файлы как «ОТЧЁТ.PDF».
Обратите внимание: объект Файл работает и на клиенте, и на сервере, но путь интерпретируется в файловой системе той стороны, где выполняется код. Строка «C:\Документы\...» на сервере Linux-сервера 1С будет просто текстом — разбор имени всё равно сработает, но операции с реальным файлом (проверка существования, чтение) уже нет.
Функции БСП для разбора имени файла
Если конфигурация построена на Библиотеке стандартных подсистем (УТ 11, ERP, Бухгалтерия 3.0, ЗУП и большинство типовых), используйте готовую функцию:
Расширение = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла("Акт.docx");
// Результат: "docx" — без точки
Функция доступна и в клиентском, и в серверном контексте, не требует существования файла и корректно обрабатывает имена без расширения, возвращая пустую строку. Это предпочтительный вариант в типовых конфигурациях: он уже протестирован и единообразно ведёт себя во всех подсистемах.
В модуле работы с файлами БСП есть и смежные функции, например в РаботаСФайламиСлужебныйКлиентСервер и ФайловаяСистема — при доработке типовых механизмов вложений лучше опираться на них, чтобы не дублировать логику.
Самописный вариант без БСП
В конфигурациях без БСП или там, где нужен полный контроль над логикой, расширение извлекают поиском последней точки в строке. Классический вариант на встроенном языке:
Функция ПолучитьРасширение(ИмяФайла)
ПозицияТочки = СтрНайти(ИмяФайла, ".", НаправлениеПоиска.СКонца);
Если ПозицияТочки = 0 Тогда
Возврат "";
КонецЕсли;
Возврат Сред(ИмяФайла, ПозицияТочки + 1);
КонецФункции
Такая функция возвращает расширение без точки, что удобно для сравнений и подстановки в шаблоны имён. Учтите нюанс: если точка встречается только в пути к каталогу (например, «C:\v2.0\отчет»), наивный разбор вернёт «0\отчет». Поэтому либо передавайте в функцию только имя файла без пути, либо дополнительно отсекайте путь через поиск последнего слэша.
Файл = Новый Файл(ПолноеИмя); РасширениеБезТочки = Сред(Файл.Расширение, 2);Проверка расширения перед обработкой файла
На практике расширение чаще всего нужно не само по себе, а для проверки: можно ли этот файл загружать, печатать, отправлять. Типовой приём — сравнение со списком допустимых значений:
Допустимые = СтрРазделить("pdf,jpg,png,xlsx", ",");
Расширение = НРег(ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла));
Если Допустимые.Найти(Расширение) = Неопределено Тогда
ВызватьИсключение "Формат файла не поддерживается";
КонецЕсли;
Помните, что расширение — это только часть имени, а не гарантия содержимого. Пользователь может переименовать exe в pdf, и проверка по расширению это не заметит. Для критичных сценариев (загрузка извне, обмен с контрагентами) дополнительно проверяйте сигнатуру файла — первые байты содержимого — или хотя бы размер и читаемость формата штатным средством.
Расширение при работе с присоединёнными файлами
В типовых конфигурациях файлы, прикреплённые к документам и справочникам, хранятся в справочнике присоединённых файлов (например, «ПрисоединенныеФайлы» или специфичные вроде «СчетФактураПрисоединенныеФайлы»). У такого файла расширение хранится в отдельном реквизите — обычно Расширение, без точки и в нижнем регистре.
Запрос = Новый Запрос("ВЫБРАТЬ Расширение, ИмяФайла ИЗ Справочник.ПрисоединенныеФайлы ГДЕ ВладелецФайла = &Владелец");
Это быстрее и надёжнее, чем разбирать имя файла заново: реквизит заполняется при записи файла штатными средствами БСП. Если же вы создаёте присоединённый файл программно через РаботаСФайлами.ДобавитьФайл(), передайте расширение явно в параметрах — иначе при открытии файла из карточки система не сможет подобрать приложение для просмотра.
Особые случаи: двойные расширения, скрытые файлы, временные имена
Файлы вида «архив.tar.gz» по всем описанным способам дадут расширение «gz» — берётся только часть после последней точки. Если логика должна распознавать составные форматы, проверяйте окончание имени через СтрЗаканчиваетсяНа() по списку известных комбинаций.
Имена, начинающиеся с точки (например, «.gitignore»), объект Файл обычно трактует как файлы без имени с расширением. Для бизнес-файлов это редкость, но при обработке выгрузок из Linux-систем такое встречается — добавьте проверку на пустое имя без расширения.
При формировании временных файлов через ПолучитьИмяВременногоФайла(Расширение) расширение передаётся без точки. Это ещё одно место, где путаются форматы «с точкой» и «без точки»: перед вызовом отсекайте ведущую точку, если получали расширение через объект Файл.
Как проверить результат
«pdf» или «.pdf» в зависимости от способа, сравнение регистронезависимо
Пустая строка или «PDF» ломает последующее сравнение
Пустая строка, код обрабатывает этот случай веткой по умолчанию
Исключение или подстановка мусора в имя файла
Ровно одна точка перед расширением: «отчет.xlsx»
Двойная точка «отчет..xlsx» или её отсутствие
Выбор способа под вашу ситуацию
Единого «правильного» варианта нет — ориентируйтесь на контекст выполнения и состав конфигурации. Краткий маршрут выбора:
Как выбрать действие
Какой бы способ ни был выбран, вынесите его в общий модуль и используйте один и тот же во всём проекте. Разнобой в формате («с точкой» в одном месте, «без точки» в другом) — главный источник трудноуловимых ошибок при сравнении форматов и формировании имён файлов.
Что важно запомнить
Расширение файла в 1С получают через объект Файл (свойство Расширение, с точкой), функцию БСП ПолучитьРасширениеИмениФайла (без точки) или собственный разбор строки. Всегда приводите регистр перед сравнением, обрабатывайте случай пустого расширения и не доверяйте расширению как гарантии содержимого файла.
Частые вопросы
Как получить расширение без точки, если использую объект Файл?
Отсеките первый символ: Сред(Файл.Расширение, 2). Предварительно проверьте, что расширение не пустое, иначе получите ошибку или пустую строку в неожиданном месте.
Файл физически не существует — можно ли получить его расширение?
Да. Конструктор Новый Файл(Путь) не обращается к диску, он только разбирает строку пути. Свойства Имя, ИмяБезРасширения и Расширение будут заполнены корректно, а вот проверка Существует() вернёт Ложь.
Как проверить, что загружаемый файл — действительно картинка, а не переименованный файл?
Расширения недостаточно. Прочитайте файл в объект Картинка внутри попытки — если формат не поддерживается или данные повреждены, будет выброшено исключение. Для других форматов аналогично используйте штатные средства чтения (ТабличныйДокумент для mxl, ЧтениеXML и т.п.).
Почему сравнение расширения с «pdf» не срабатывает, хотя файл точно PDF?
Чаще всего две причины: регистр (файл назван «.PDF») и точка в значении свойства Файл.Расширение. Приведите обе строки к нижнему регистру и уберите точку, после чего сравнение заработает.
Как получить имя файла без расширения?
У объекта Файл есть свойство ИмяБезРасширения. В БСП есть функция ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением() для обратной задачи и смежные инструменты разбора имён в модуле работы с файлами.
Работает ли разбор расширения в тонком и веб-клиенте?
Да, объект Файл и строковые функции доступны во всех клиентах. Ограничение касается только операций с реальной файловой системой: в веб-клиенте прямой доступ к диску пользователя требует расширения работы с файлами, но сам разбор строки пути это не затрагивает.