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

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

Как получить каталог пользователя в 1С

Как получить каталог пользователя в 1С: функция КаталогПользователя(), папка профиля ОС, каталог базы данных. Примеры кода, проверка результата и типичные ошибки.

Под «каталогом пользователя» в контексте 1С обычно понимают три разных объекта: каталог временных файлов текущего пользователя 1С (результат функции КаталогПользователя()), папку профиля пользователя операционной системы и каталог, где хранятся служебные файлы информационной базы. Путать их нельзя: для сохранения временных файлов, выгрузок и настроек подходят разные пути, а ошибка в выборе приводит к потере данных или отказу в доступе.

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

Ниже разобраны все основные сценарии: встроенная функция КаталогПользователя(), получение папки профиля ОС через переменные окружения, каталоги файловой и клиент-серверной базы, а также проверка результата и типичные ошибки. Примеры кода приведены для управляемых форм, но работают и в обычном приложении с минимальными правками.

Что именно считается каталогом пользователя в 1С

Прежде чем писать код, определите, какой каталог нужен на самом деле. Встроенная функция КаталогПользователя() возвращает путь к каталогу временных файлов, выделенному текущему пользователю сеанса, — обычно это подпапка внутри системного временного каталога вида C:\Users\Имя\AppData\Local\Temp\ с добавлением идентификатора сеанса. Эта папка очищается системой, поэтому хранить там важные данные нельзя.

Каталог профиля ОС — это папка вида C:\Users\ИмяПользователя с подпапками «Документы», «Рабочий стол», «Загрузки». Она подходит для сохранения файлов, с которыми пользователь будет работать дальше. Отдельная группа — служебные каталоги 1С: кэш метаданных (AppData\Roaming\1C\1cv8 и AppData\Local\1C\1cv8) и каталог самой информационной базы при файловом режиме работы.

Получение каталога через КаталогПользователя()

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

Каталог = КаталогПользователя();

Сообщить(Каталог);

// Результат: C:\Users\Ivanov\AppData\Local\Temp\1cv8_...

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

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

Получение папки профиля ОС: Документы и Рабочий стол

Когда нужно сохранить файл в «Документы» или на «Рабочий стол» пользователя, встроенных функций недостаточно — используют объект WScript.Shell через COM или переменные окружения. Способ с COM-объектом работает только на клиенте под Windows и требует права на создание COM-объектов:

Shell = Новый COMОбъект("WScript.Shell");

РабочийСтол = Shell.SpecialFolders("Desktop");

Документы = Shell.SpecialFolders("MyDocuments");

Профиль = Shell.ExpandEnvironmentStrings("%USERPROFILE%");

Альтернатива без COM — чтение переменных окружения через тот же WScript.Shell или через объект ОболочкаWindows в тонком клиенте. Учтите, что в веб-клиенте и на Linux-сервере эти приёмы недоступны: там правильный путь — передать файл пользователю через ПолучитьФайл() или диалог сохранения, а папку выберет сам пользователь.

bsl
Shell = Новый COMОбъект("WScript.Shell");
Профиль = Shell.ExpandEnvironmentStrings("%USERPROFILE%");
Сообщить(Профиль); // C:\Users\ИмяПользователя

Каталог информационной базы и служебные папки 1С

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

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

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

// файловый режим, КаталогИБ() вернёт реальный путь

КонецЕсли;

Кэш метаданных и настройки пользователя платформа хранит в профиле ОС: обычно %APPDATA%\1C\1cv8 (роуминговый кэш и списки баз) и %LOCALAPPDATA%\1C\1cv8 (локальный кэш). Очистка этих папок — стандартный приём при ошибках вида «база не открывается» или глюках отображения, но перед удалением убедитесь, что сеанс 1С закрыт.

Какой каталог использовать

КаталогПользователя()

Временные файлы обработки: промежуточные XML, архивы. Очищается системой, не подходит для постоянного хранения.

Профиль ОС через WScript.Shell

Файлы для пользователя: выгрузки в Документы или на Рабочий стол. Только Windows-клиент, нужен COM.

КаталогИБ()

Файлы рядом с файловой базой. Не работает в клиент-серверном режиме.

Временное хранилище + диалог сохранения

Универсальный вариант для веб-клиента и тонкого клиента: папку выбирает сам пользователь.

Пошаговый сценарий: сохранить файл в каталог пользователя

Типовая задача — сформировать файл на сервере и отдать его пользователю. Безопасная последовательность выглядит так: сначала файл записывается во временный каталог сервера, затем помещается во временное хранилище, после чего клиент предлагает диалог сохранения. Это работает во всех клиентах, включая веб.

Порядок действий
  1. 1
    Определите контекст: где выполняется код — на клиенте или на сервере
  2. 2
    На сервере сформируйте файл и запишите его в КаталогВременныхФайлов() + уникальное имя
  3. 3
    Поместите файл во временное хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Путь), УникальныйИдентификаторФормы)
  4. 4
    Удалите временный файл на сервере вызовом УдалитьФайлы()
  5. 5
    На клиенте вызовите ПолучитьФайл() или диалог сохранения и передайте адрес хранилища
  6. 6
    Проверьте, что файл открылся у пользователя и содержит корректные данные

Если база файловая и работа идёт только в толстом или тонком клиенте под Windows, допустимо упростить схему: получить путь через КаталогПользователя() или профиль ОС и записать файл напрямую. Но даже в этом случае оборачивайте запись в попытку-исключение: у пользователя может не быть прав на целевую папку, а диск — свободного места.

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

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

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

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

Строка пути
Норма

Непустая, заканчивается слэшем, существует на диске

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

Пустая строка или путь к чужому компьютеру (серверу вместо клиента)

Запись тестового файла
Норма

Файл создаётся и удаляется без исключений

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

Ошибка доступа — нет прав или папка защищена

Контекст выполнения
Норма

Путь соответствует машине, где нужен файл

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

В клиент-серверном режиме получен серверный Temp вместо клиентского

Типичные ошибки и ограничения

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

Типичные ошибки
01
Вызов КаталогПользователя() на сервере и передача пути клиенту — клиент не имеет доступа к файловой системе сервера
02
Хранение постоянных данных во временном каталоге — файлы удаляются системой без предупреждения
03
Использование WScript.Shell в веб-клиенте или на Linux — COM-объекты там недоступны, код падает с ошибкой
04
Конкатенация пути без проверки завершающего слэша — получается несуществующий путь вида TempИмяФайла.txt
05
Отсутствие обработки исключений при записи — при нехватке прав или места пользователь видит необработанную ошибку

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

FAQ

Чем КаталогПользователя() отличается от КаталогВременныхФайлов()?

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

Почему КаталогИБ() возвращает пустую строку?

Это значит, что база работает в клиент-серверном режиме: данные хранятся в СУБД, и каталога базы как такового нет. Проверить режим можно по строке соединения — наличие параметра File= указывает на файловый режим.

Как получить папку «Документы» пользователя в веб-клиенте?

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

Можно ли хранить настройки обработки в каталоге пользователя?

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

Где 1С хранит кэш, который рекомендуют чистить при ошибках?

В профиле пользователя ОС: %APPDATA%\1C\1cv8 и %LOCALAPPDATA%\1C\1cv8. Перед очисткой закройте все сеансы базы, а папки лучше переименовать, а не удалять — при проблемах их можно вернуть.

Работает ли WScript.Shell на сервере 1С под Linux?

Нет, COM-технология доступна только в Windows. Для кроссплатформенного кода получайте пути через встроенные функции платформы или передавайте файлы через временное хранилище, не привязываясь к файловой системе конкретной ОС.

Итог

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

КаталогПользователя() даёт временную папку сеанса и зависит от контекста выполнения — клиент или сервер. Для файлов пользователя используйте профиль ОС через WScript.Shell (только Windows-клиент) или универсально — временное хранилище с диалогом сохранения. Не храните важные данные во временных каталогах и всегда проверяйте путь перед записью.