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

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

Как указать путь к файлу в 1С

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

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

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

Ниже разобраны основные способы указать путь: через диалог выбора файла, строковой константой, относительно каталога программы или временных файлов, а также типичные ошибки с разделителями, правами доступа и сетевыми путями.

Как выглядит путь к файлу в 1С

Путь к файлу во встроенном языке 1С — это обычная строка. Платформа работает с путями в формате операционной системы: в Windows используется обратный слэш, в Linux — прямой. Самый простой пример: Путь = "C:\Данные\выгрузка.xml"; — такая строка передаётся в методы чтения и записи файлов.

В отличие от некоторых языков программирования, обратный слэш в строках 1С не является служебным символом, поэтому экранировать его не нужно. Строка "C:\Temp\file.txt" воспринимается буквально. А вот кавычки внутри строки придётся удвоить, если сам путь их содержит, — на практике это встречается редко.

Для сетевых ресурсов применяется UNC-формат: \\ИмяСервера\ОбщаяПапка\файл.xml. Такой путь корректно работает и на клиенте, и на сервере, если у исполняющей учётной записи есть доступ к сетевому ресурсу. Буквы подключённых сетевых дисков (Z:, Y: и т.п.) на сервере лучше не использовать — подключение дисков привязано к сессии конкретного пользователя, и агент сервера 1С их обычно не видит.

Выбор файла через диалог

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

Пример кода для режима открытия файла:

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

Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx|Все файлы (.)|.";

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

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

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

КонецЕсли;

У диалога есть три основных режима: Открытие — выбор существующего файла, Сохранение — указание имени нового файла, ВыборКаталога — выбор папки целиком. Свойство Фильтр ограничивает отображаемые типы файлов и снижает вероятность выбора неподходящего документа.

В управляемых формах и тонком клиенте простой вызов диалога может быть недоступен из-за требований асинхронности. Тогда используют метод НачатьПомещениеФайла или асинхронные аналоги диалогов — об этом ниже в разделе про тонкий и веб-клиент.

Программная работа с путями: Файл, каталоги, разделители

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

ФайлНаДиске = Новый Файл("C:\Данные\прайс.xlsx");

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

Сообщить("Каталог: " + ФайлНаДиске.Путь);

Сообщить("Расширение: " + ФайлНаДиске.Расширение);

Иначе

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

КонецЕсли;

Для временных файлов, которые не нужно хранить постоянно, платформа предоставляет функции КаталогВременныхФайлов() и ПолучитьИмяВременногоФайла(). Они возвращают корректный путь для текущей операционной системы и учётной записи, что особенно важно в серверном коде, где жёстко зашитый путь вроде C:\Temp может отсутствовать или быть недоступным.

Если конфигурация должна работать и в Windows, и в Linux, разделитель каталогов лучше получать программно или использовать прямой слэш — платформа во многих случаях корректно интерпретирует его в обеих системах. Жёсткая привязка к обратному слэшу делает решение зависимым от Windows.

Порядок безопасной работы с путём
  1. 1
    Получите путь: из диалога, из настройки или сформируйте программно
  2. 2
    Создайте объект Файл и проверьте методом Существует(), что путь доступен
  3. 3
    Проверьте расширение и каталог, если формат файла критичен
  4. 4
    Выполните чтение или запись внутри попытки/исключения
  5. 5
    Удалите временные файлы после завершения операции

Путь к файлу на сервере 1С

В клиент-серверном варианте код с директивой &НаСервере выполняется на сервере 1С:Предприятия. Это значит, что путь C:\Документы\... будет указывать на диск сервера, а не на компьютер пользователя. Файл, который пользователь видит у себя, серверный код без дополнительных действий не откроет.

Стандартное решение — передать файл с клиента на сервер через временное хранилище. На клиенте файл помещается методом НачатьПомещениеФайла или ПоместитьФайл, а на сервере данные извлекаются из хранилища и при необходимости записываются во временный файл сервера. Для обратной операции — выгрузки — сервер помещает результат в хранилище, а клиент сохраняет его через диалог сохранения.

Второй вариант — общий сетевой каталог, доступный и пользователям, и серверу. В этом случае в настройках обмена указывают UNC-путь, а учётной записи, под которой работает агент сервера 1С (по умолчанию это служебная учётная запись), выдают права на чтение и запись в этот каталог. Без выдачи прав обмен будет завершаться ошибкой доступа, хотя у пользователей каталог открывается нормально.

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

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

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

Типовой фрагмент для тонкого клиента с асинхронным помещением файла:

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);

НачатьПомещениеФайла(ОписаниеОповещения, , , Истина, УникальныйИдентификаторФормы);

После выбора пользователем файл попадает во временное хранилище, а в обработчике оповещения доступен адрес хранилища и выбранное имя файла. Исходный локальный путь клиента серверу при этом не нужен — данные передаются содержимым.

Где хранить пути в настройках

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

При хранении пути в базе учитывайте, что база может использоваться с разных компьютеров и в клиент-серверном режиме. Локальный путь, сохранённый на одном рабочем месте, на другом окажется недействительным. Для таких случаев хранят либо UNC-путь к общему ресурсу, либо отдельные настройки для каждого пользователя — через механизм хранения настроек, привязанный к пользователю.

Полезно добавить в форму настроек кнопку проверки: код создаёт объект Файл по указанному пути и сообщает, доступен ли каталог. Это избавляет от ситуации, когда ошибка всплывает только в момент реального обмена, например ночью по расписанию.

Типичные ошибки
01
Жёстко зашитый путь C:\Temp в серверном коде — на сервере каталога может не быть или нет прав; используйте КаталогВременныхФайлов()
02
Буква сетевого диска (Z:\) вместо UNC-пути — агент сервера 1С не видит диски, подключённые в сессии пользователя
03
Отсутствие проверки Существует() перед чтением — код падает с ошибкой вместо понятного сообщения
04
Смешение клиентского и серверного контекста: путь выбран на клиенте, а чтение выполняется на сервере без передачи файла через хранилище
05
Пробелы и кириллица в путях при обмене с внешними системами — часть сторонних программ некорректно обрабатывает такие имена

Проверка результата и устранение ошибок доступа

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

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

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

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

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

Объект Файл.Существует() возвращает Истина в том же контексте, где работает код

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

Ложь на сервере при Истине на клиенте — путь локальный, а не сетевой

Доступ на запись
Норма

Тестовый файл создаётся и удаляется без ошибок

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

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

Сетевой путь
Норма

UNC-путь открывается с сервера под учётной записью агента 1С

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

Путь открывается только из сессии пользователя — замените букву диска на UNC

Часто задаваемые вопросы

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

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

Почему на тонком клиенте не работает ДиалогВыбораФайла?

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

Можно ли использовать относительные пути в 1С?

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

Как передать файл с клиента на сервер без общей папки?

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

Что делать, если путь содержит кириллицу и внешняя программа его не открывает?

Некоторые сторонние утилиты и старые компоненты некорректно обрабатывают кириллицу и пробелы. Решение — промежуточный каталог с латинским именем без пробелов: 1С копирует файл туда, вызывает внешнюю программу, а результат забирает обратно.

Как узнать, под какой учётной записью работает сервер 1С?

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

Итог

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

Путь в 1С — это строка, но её корректность зависит от контекста выполнения: клиент, сервер и веб-клиент видят разные файловые системы. Для интерактива используйте диалоги выбора, для сервера — UNC-пути и временные каталоги, для передачи файлов — временное хранилище. Всегда проверяйте существование пути и права доступа перед чтением или записью.