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

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

Как получить полный путь файла в 1С

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

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

Главная сложность заключается в том, что в клиент-серверном режиме пути на клиенте и на сервере различаются: сервер не видит диски пользователя, а клиент не имеет доступа к каталогам сервера. Кроме того, в веб-клиенте прямой доступ к файловой системе ограничен, и работа с файлами выполняется через специальные механизмы. Игнорирование этих особенностей — самая частая причина ошибок вида «файл не найден» в рабочих базах.

Ниже разобраны основные способы получения полного пути: через диалог выбора файла, системные функции платформы, объект «Файл» и методы работы с метаданными. Для каждого способа приведены примеры кода и указаны ограничения.

Получение пути через диалог выбора файла

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

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Фильтр = "Внешние обработки (.epf)|.epf|Все файлы (.)|.";

Диалог.Заголовок = "Выберите файл обработки";

Если Диалог.Выбрать() Тогда

ПолныйПуть = Диалог.ПолноеИмяФайла;

Сообщить("Выбран файл: " + ПолныйПуть);

Иначе

Сообщить("Файл не выбран");

КонецЕсли;

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

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

Системные функции для получения стандартных каталогов

Платформа 1С предоставляет набор встроенных функций, возвращающих полные пути к служебным каталогам. Они полезны, когда нужно определить, откуда запущена программа, где лежит файловая база или куда сохранить временный файл.

  • КаталогПрограммы() — полный путь к каталогу, где установлены исполняемые файлы платформы, например C:\Program Files\1cv8\<версия>\bin\;
  • КаталогТекущегоКаталогаБазыДанных() — каталог файловой информационной базы; для клиент-серверной базы возвращает пустую строку;
  • КаталогВременныхФайлов() — каталог временных файлов операционной системы; безопасное место для промежуточных данных;
  • РабочийКаталогДанныхПользователя() — каталог данных текущего пользователя 1С.
КаталогПлатформы = КаталогПрограммы();

КаталогБазы = КаталогТекущегоКаталогаБазыДанных();

ВременныйФайл = КаталогВременныхФайлов() + "obmen_" +

Формат(ТекущаяДата(), "ДФ=yyyyMMdd_hhmmss") + ".xml";

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

1c
ПолныйПуть = КаталогВременныхФайлов() + "export_" + Строка(Новый УникальныйИдентификатор) + ".xml";

Разбор готового пути на составляющие через объект «Файл»

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

Файл = Новый Файл("C:\Обмен\ПрайсЛист.xlsx");

Каталог = Файл.Путь; // C:\Обмен\

ИмяПолное = Файл.Имя; // ПрайсЛист.xlsx

ИмяБезРасш = Файл.ИмяБезРасширения; // ПрайсЛист

Расширение = Файл.Расширение; // .xlsx

ПолныйПуть = Файл.ПолноеИмя; // C:\Обмен\ПрайсЛист.xlsx

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

Ручной разбор строки через СтрНайти() и поиск последнего слэша — типичный источник ошибок: в Windows разделитель «\», в Linux — «/», а 1С умеет работать с обоими. Объект Файл снимает эту проблему, поэтому предпочитайте его строковым манипуляциям.

Путь к файловой базе и к внешней обработке

Администраторам и разработчикам нередко нужно узнать, где физически расположена файловая информационная база. Программно это даёт функция КаталогТекущегоКаталогаБазыДанных(). Альтернатива без кода: строка подключения доступна через функцию СтрокаСоединенияИнформационнойБазы(), из которой путь извлекается параметром File.

СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

// Результат вида: File="D:\Bases\Trade";

Если СтрНайти(СтрокаСоединения, "File=") > 0 Тогда

// база файловая, путь можно извлечь из строки соединения

КонецЕсли;

Для внешней обработки, запущенной через «Файл — Открыть», путь к собственному файлу доступен через свойство ИспользуемоеИмяФайла объекта ЭтотОбъект (в модуле обработки). Это удобно, когда рядом с обработкой лежат сопутствующие файлы — шаблоны, макеты, библиотеки:

ФайлОбработки = Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);

КаталогРядом = ФайлОбработки.Путь; // каталог, где лежит сама обработка

Шаблон = КаталогРядом + "Шаблон.mxl";

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

Маршрут решения

Как выбрать способ

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

Особенности клиент-серверного режима и веб-клиента

В файловом режиме работы код клиента и «сервера» выполняется на одной машине, поэтому пути взаимозаменяемы. В клиент-серверном варианте это не так: сервер 1С работает под своей учётной записью (обычно USR1CV8) и видит только свои локальные и сетевые ресурсы. Путь вида C:\Документы\файл.xlsx, полученный на клиенте, на сервере либо не существует, либо указывает на совершенно другой файл.

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

В веб-клиенте дополнительно требуется подключение расширения работы с файлами в браузере. Без него диалоги выбора файла и операции с локальной файловой системой недоступны. Перед началом работы проверяйте подключение через ПодключитьРасширениеРаботыСФайлами() и предлагайте пользователю установить расширение, если оно отсутствует.

Типичные ошибки
01
Передача клиентского пути в серверную процедуру — на сервере файл не найден, обмен падает с ошибкой
02
Ручной разбор пути строковыми функциями — код ломается при смене ОС или разделителя
03
Использование фиксированного имени временного файла — конфликты при одновременной работе пользователей
04
Отсутствие проверки Существует() перед чтением — необработанное исключение вместо понятного сообщения
05
Обращение к файловой системе в веб-клиенте без расширения работы с файлами — функции молча не выполняются

Проверка результата и контрольные точки

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

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

Если Не Файл.Существует() Тогда

ВызватьИсключение "Файл не найден: " + ПолныйПуть;

КонецЕсли;

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

ВызватьИсключение "Ожидается файл Excel, выбран: " + Файл.Расширение;

КонецЕсли;

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

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

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

Значение полученного пути
Норма

Непустая строка с корректным разделителем каталогов

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

Пустая строка или путь с двойными слэшами

Существование файла
Норма

Файл.Существует() возвращает Истина

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

Ложь — файл перемещён, удалён или путь с другой машины

Доступность на сервере
Норма

Серверная процедура читает файл без исключения

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

Ошибка доступа — путь клиентский или нет прав у учётной записи сервера

Частые вопросы о получении пути файла в 1С

Как узнать, где находится файловая база 1С, без программирования?

Откройте список информационных баз в окне запуска 1С, выделите нужную базу — путь к её каталогу отображается в нижней части окна. Также путь виден в свойствах базы при её редактировании в стартовом окне.

Почему КаталогТекущегоКаталогаБазыДанных() возвращает пустую строку?

Эта функция работает только для файловых баз. Если база развёрнута в клиент-серверном режиме на СУБД (MS SQL, PostgreSQL и др.), физического каталога с файлом 1Cv8.1CD не существует, и функция возвращает пустое значение.

Как получить путь к файлу, который пользователь выбрал в веб-клиенте?

В веб-клиенте полный локальный путь по соображениям безопасности браузером не раскрывается. Используйте НачатьПомещениеФайла() — файл загружается во временное хранилище, а работа с его содержимым выполняется на сервере. Реальный путь на машине пользователя получить нельзя, и обычно он и не нужен.

Чем ПолноеИмя объекта «Файл» отличается от исходной строки пути?

Свойство ПолноеИмя возвращает нормализованный полный путь: относительные элементы и лишние разделители приводятся к каноническому виду. Для сравнения двух путей надёжнее сравнивать именно значения ПолноеИмя, а не исходные строки, которые могли быть записаны по-разному.

Как безопасно сформировать имя временного файла на сервере?

Используйте функцию ПолучитьИмяВременногоФайла() с указанием расширения — она создаёт уникальное имя в каталоге временных файлов сервера. Ручная сборка имени из даты и времени не гарантирует уникальность при параллельных вызовах.

Можно ли получить путь к базе из строки соединения программно?

Да. Функция СтрокаСоединенияИнформационнойБазы() возвращает строку вида File="D:\Bases\Trade"; для файловой базы. Путь извлекается поиском параметра File в этой строке. Для серверных баз строка содержит параметры Srvr и Ref вместо пути к файлу.

Итог

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

Выбор способа зависит от источника пути: диалог выбора — для файлов пользователя, системные функции — для служебных каталогов, объект «Файл» — для разбора готового пути. В клиент-серверном режиме передавайте файлы через временное хранилище, а не пути, и всегда проверяйте существование файла перед чтением.