Разработка и Конфигурация · 10 мин
Как прописать путь к папке в 1С
Как правильно указать путь к папке в 1С: выбор каталога через диалог, работа с файловыми путями в коде, типичные ошибки и проверка результата.
Работа с папками в 1С требуется постоянно: при обмене данными, выгрузке отчётов, загрузке банковских выписок, сохранении печатных форм. Путь к каталогу можно указать тремя способами — через диалог выбора файла, строковым значением в коде или в настройках обработки. Каждый вариант имеет свои ограничения: диалог требует действий пользователя, жёстко прописанный путь перестаёт работать при переносе базы, а настройки нужно хранить в безопасном месте.
Главная сложность — разница между клиентом и сервером. Код, выполняемый на сервере 1С, видит файловую систему сервера, а не компьютера пользователя. Поэтому путь C:\Документы, указанный в серверной процедуре, будет искаться на сервере, где такой папки может не существовать. Это самая частая причина ошибок «Каталог не обнаружен» у начинающих разработчиков.
Ниже разобраны практические способы указания пути, примеры кода для толстого, тонкого и веб-клиента, а также проверка существования каталога и типичные ошибки.
Как задать путь строкой в коде
Самый простой способ — присвоить строковой переменной полный путь к каталогу. В языке 1С обратный слеш не является экранирующим символом, поэтому путь пишется как в обычном проводнике Windows:
ПутьКПапке = "C:\Обмен\Выгрузка\";
Файл = Новый Файл(ПутьКПапке);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ПутьКПапке);
КонецЕсли;
Завершающий слеш в конце пути не обязателен, но упрощает последующую склейку с именем файла: ПутьКПапке + "report.xml" сработает корректно, только если слеш есть. Рекомендуется либо всегда добавлять его, либо использовать проверку перед объединением строк.
Для сетевых ресурсов указывается UNC-путь вида \\server\share\folder\. Учтите, что служба сервера 1С работает под отдельной учётной записью (по умолчанию USR1CV8), и у неё должны быть права на сетевую папку — иначе код завершится ошибкой доступа, хотя под вашим пользователем папка открывается.
ПутьКПапке = "C:\Обмен\";
Файл = Новый Файл(ПутьКПапке);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ПутьКПапке);
КонецЕсли;Выбор папки пользователем через диалог
Если каталог должен выбирать пользователь, применяется объект ДиалогВыбораФайла с режимом ВыборКаталога. В тонком и веб-клиенте диалог работает только асинхронно — через метод Показать с описанием оповещения.
&НаКлиенте
Процедура ВыбратьПапку(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите папку для выгрузки";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПапки", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПапки(ВыбранныеФайлы, ДопПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
ПутьКПапке = ВыбранныеФайлы[0];
КонецПроцедуры
В толстом клиенте допустим синхронный вызов Диалог.Выбрать(), который возвращает Истина при успешном выборе. Однако новые разработки стоит сразу писать асинхронно — это единственный вариант, совместимый со всеми клиентами.
Обратите внимание: в веб-клиенте выбор каталога может быть недоступен или ограничен политиками браузера. Для загрузки файлов в веб-клиенте обычно используют НачатьПомещениеФайла, а для выгрузки — передачу файла на клиент через временное хранилище.
- 1Создайте объект ДиалогВыбораФайла с режимом ВыборКаталога
- 2Задайте заголовок и при необходимости начальный каталог через свойство Каталог
- 3Вызовите метод Показать с описанием оповещения
- 4В процедуре оповещения проверьте, что результат не Неопределено
- 5Сохраните полученный путь в реквизит формы или настройку
Где выполняется код: клиент или сервер
Директивы компиляции определяют, какая файловая система будет видна коду. Процедура с директивой &НаСервере обращается к дискам сервера приложений, &НаКлиенте — к дискам компьютера пользователя. В файловом варианте базы это один и тот же компьютер, поэтому ошибка часто проявляется только после перехода на клиент-серверный режим.
Типовой сценарий обмена файлами в клиент-серверном режиме выглядит так: пользователь выбирает папку на клиенте, файл помещается во временное хранилище, передаётся на сервер, обрабатывается там, а результат возвращается обратно. Прямое чтение клиентского пути в серверной процедуре — ошибка проектирования.
Если обмен идёт через регламентное задание, интерактивный выбор невозможен в принципе: путь должен быть заранее сохранён в настройках, и папка должна быть доступна с сервера. Обычно для этого заводят общий сетевой каталог с правами для учётной записи службы 1С.
Хранение пути в настройках обработки
Жёстко зашитый в код путь придётся менять перекомпиляцией при каждом переносе папки. Правильнее хранить его в реквизите формы обработки, константе или регистре сведений. Для внешних обработок удобен реквизит формы с кнопкой выбора и сохранением через СохранитьЗначениеНаСервере или в хранилище общих настроек.
Для регламентных обменов в типовых конфигурациях путь обычно задаётся в настройках самого обмена — например, в узле плана обмена или в справочнике настроек обмена с банком. Перед написанием собственного механизма проверьте, нет ли готового поля «Каталог обмена» в используемой конфигурации.
При хранении пути в базе полезно нормализовать значение: убрать пробелы по краям, привести к единому виду с завершающим слешем. Это избавит от ошибок склейки имён файлов в дальнейшем.
Проверка существования папки и создание каталога
Перед записью файлов всегда проверяйте, существует ли каталог. Функция СоздатьКаталог создаёт всю цепочку вложенных папок и не вызывает ошибку, если каталог уже есть, — но явная проверка через объект Файл позволяет отличить отсутствие папки от отсутствия прав.
Процедура ПодготовитьКаталог(Путь)
Файл = Новый Файл(Путь);
Если Не Файл.Существует() Тогда
Попытка
СоздатьКаталог(Путь);
Исключение
ВызватьИсключение "Не удалось создать каталог: " + ОписаниеОшибки();
КонецПопытки;
ИначеЕсли Не Файл.ЭтоКаталог() Тогда
ВызватьИсключение "По указанному пути находится файл, а не папка";
КонецЕсли;
КонецПроцедуры
Проверка прав на запись делается пробным созданием временного файла: если каталог открыт только на чтение, попытка записи вызовет исключение, которое нужно перехватить и показать пользователю понятное сообщение.
Как проверить результат
Файл.Существует() возвращает Истина, Файл.ЭтоКаталог() = Истина
Существует() = Ложь или по пути лежит файл
Пробный файл создаётся и удаляется без исключений
Ошибка доступа при создании файла
Серверный код видит путь на сервере, клиентский — на ПК пользователя
Ошибка «Каталог не обнаружен» при рабочем пути в проводнике
Типичные ошибки и ограничения
Наиболее частые проблемы связаны не с синтаксисом, а с окружением. Перечислим основные:
- Клиентский путь в серверном коде. Процедура с директивой
&НаСерверене видит диски пользователя. Решение — передача файла через временное хранилище. - Нет прав у службы сервера 1С. Учётная запись агента сервера должна иметь доступ к сетевому каталогу; локальные диски другого сервера по UNC тоже требуют явных разрешений.
- Отсутствие завершающего слеша. Склейка
"C:\Обмен" + "файл.xml"даёт неверный путьC:\Обменфайл.xml. - Синхронные вызовы в тонком клиенте. Метод
Выбрать()недоступен — нужен асинхронныйПоказать(). - Длинные пути и спецсимволы. Очень длинные пути и некоторые символы в именах могут вызывать ошибки файловой системы; избегайте чрезмерной вложенности.
FAQ
Как указать путь к сетевой папке?
Используйте UNC-формат: \\ИмяСервера\ОбщаяПапка\Каталог\. Подключённый сетевой диск (например, Z:\) в серверном коде работать не будет, так как сопоставление букв дисков существует только в сессии конкретного пользователя. Убедитесь, что у учётной записи, под которой выполняется код, есть права на общий ресурс.
Почему диалог выбора папки не открывается в тонком клиенте?
В тонком и веб-клиенте запрещены синхронные вызовы. Метод Выбрать() игнорируется или вызывает ошибку. Используйте асинхронный метод Показать() с описанием оповещения — это единственный поддерживаемый вариант.
Как получить путь к каталогу временных файлов?
Функция КаталогВременныхФайлов() возвращает системный временный каталог текущего контекста: на клиенте — временную папку пользователя, на сервере — сервера. Это безопасное место для промежуточных файлов, не требующее ручной настройки путей; файлы оттуда следует удалять после использования.
Можно ли использовать относительный путь в 1С?
Технически да, но текущий каталог процесса непредсказуем, особенно на сервере. Относительные пути — источник трудно отлаживаемых ошибок. Всегда формируйте полный абсолютный путь, например, от КаталогВременныхФайлов() или из сохранённой настройки.
Как передать файл с клиента на сервер, если путь известен только пользователю?
Пользователь выбирает файл диалогом, затем вызывается НачатьПомещениеФайла — файл загружается во временное хранилище. На сервер передаётся адрес хранилища, а серверная процедура читает данные через ПолучитьИзВременногоХранилища. Прямой доступ сервера к клиентскому диску не требуется.
Что делать, если путь содержит кириллицу или пробелы?
Встроенный язык 1С корректно работает с кириллицей и пробелами в путях, дополнительного экранирования не нужно. Проблемы могут возникнуть только при передаче пути во внешние программы через командную строку — там путь с пробелами следует заключать в кавычки.
Что важно запомнить
Путь к папке задаётся строкой, диалогом выбора или хранится в настройках. Ключевое правило: серверный код работает с файловой системой сервера, клиентский — с компьютером пользователя. Всегда проверяйте существование каталога и права на запись, используйте асинхронные вызовы и не зашивайте пути жёстко в код.