В процессе разработки часто возникает необходимость определить местоположение системных папок пользователя: будь то путь к рабочему столу для выгрузки отчета, каталог «Мои документы» или временная директория. В среде 1С:Предприятие существует несколько подходов к решению этой задачи — от штатных функций платформы до использования низкоуровневых объектов операционной системы. Разберем эти методы подробно, проанализируем их применимость в различных клиентах и выясним, как обеспечить максимальное удобство для конечного пользователя.
Начнем с наиболее простых и кроссплатформенных методов, которые предоставляет сама платформа. Рассмотрим глобальный контекст и методы работы с файловой системой. Самый распространенный запрос — получение пути к документам пользователя. Для этого в платформе реализован метод КаталогДокументов().
Разберем, как это работает на практике. Функция возвращает строку с полным путем к папке документов текущего пользователя. Важно понимать, что результат работы функции зависит от типа клиента и операционной системы:
C:\Users\ИмяПользователя\Documents.Пример использования встроенного метода:
ПутьКДокументам = КаталогДокументов();
Сообщить("Ваши документы хранятся здесь: " + ПутьКДокументам);
// Если нужно создать объект Файл для дальнейшего анализа
ФайлКаталога = Новый Файл(ПутьКДокументам);
Если ФайлКаталога.Существует() Тогда
// выполняем действия
КонецЕсли;
Если же ваша задача — работа с временными данными, которые не должны загромождать личные папки пользователя, проанализируем метод КаталогВременныхФайлов(). Он возвращает путь к директории, выделенной операционной системой для текущего сеанса пользователя. Это идеальное место для формирования промежуточных XML-файлов или временных картинок перед их обработкой.
Иногда штатных средств 1С недостаточно — например, когда требуется получить путь к «Рабочему столу» (Desktop), папке «Загрузки» или профилю пользователя (AppData). В таких случаях мы можем обратиться к возможностям операционной системы через COM-объект WScript.Shell. Рассмотрим этот способ как наиболее гибкий для Windows-инфраструктуры.
Объект SpecialFolders позволяет получить доступ ко всем именованным папкам профиля. Посмотрим на пример кода для получения пути к рабочему столу:
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
// Получаем путь к рабочему столу
ПутьРабочийСтол = WshShell.SpecialFolders.Item("Desktop");
Сообщить("Путь к рабочему столу: " + ПутьРабочийСтол);
// Получаем общую папку всех пользователей
ОбщийРабочийСтол = WshShell.SpecialFolders.Item("AllUsersDesktop");
Исключение
Сообщить("Не удалось создать COM-объект. Возможно, выполнение на сервере или под Linux.");
КонецПопытки;
Важный нюанс: использование COM-объектов доступно только в «Толстом клиенте» или в «Тонком клиенте» под управлением Windows. Если ваш код должен работать на сервере 1С (особенно под управлением Linux) или в веб-клиенте, данный метод вызовет исключение. Для подробного изучения принципов взаимодействия с внешними библиотеками подойдёт материал по основам работы с COM-объектами в 1С.
Проанализируем ситуацию, когда нам нужно получить базовый каталог профиля пользователя или специфические пути вроде %APPDATA%. Для этого отлично подходит метод ExpandEnvironmentStrings того же объекта WScript.Shell. Это позволяет динамически подставлять системные переменные Windows в путь.
WshShell = Новый COMОбъект("WScript.Shell");
// Получаем полный путь к профилю пользователя
ПрофильПользователя = WshShell.ExpandEnvironmentStrings("%USERPROFILE%");
// Получаем путь к папке настроек программ
AppDataLocal = WshShell.ExpandEnvironmentStrings("%LOCALAPPDATA%");
Сообщить("Ваш профиль: " + ПрофильПользователя);
Этот метод удобен тем, что позволяет обращаться к системным путям, даже если они были переопределены администратором (например, профили пользователей перенесены на другой диск).
Часто программисты сталкиваются с тем, что пользователь хочет, чтобы программа «запоминала» путь, в который он в последний раз сохранял файл. Платформа 1С при вызове ДиалогВыбораФайла без указания конкретного каталога автоматически открывает последнюю использованную папку. Однако программно получить этот путь напрямую из 1С невозможно.
Выясним причину: эти данные хранятся в реестре Windows в бинарном виде в ветке ComDlg32\OpenSavePidlMRU. Чтение этих данных — задача нетривиальная. Рассмотрим правильный архитектурный подход 1С для решения этой проблемы:
Разберем пример реализации через ХранилищеОбщихНастроек:
// При выборе файла сохраняем путь
Процедура ПослеВыбораФайла(ВыбранноеИмя, ДополнительныеПараметры) Экспорт
Если ВыбранноеИмя <> Неопределено Тогда
Файл = Новый Файл(ВыбранноеИмя);
ПутьКПапке = Файл.Путь;
// Сохраняем настройку для текущего пользователя
ХранилищеОбщихНастроек.Сохранить("МояОбработка_ПоследнийПуть", "Путь", ПутьКПапке);
КонецЕсли;
КонецПроцедуры
// При открытии диалога восстанавливаем путь
НачальныйПуть = ХранилищеОбщихНастроек.Загрузить("МояОбработка_ПоследнийПуть", "Путь");
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Если НачальныйПуть <> Неопределено Тогда
Диалог.Каталог = НачальныйПуть;
КонецЕсли;
Проанализируем работу с каталогами в веб-клиенте. Здесь возможности 1С сильно ограничены политиками безопасности браузеров. Напрямую узнать файловую структуру компьютера пользователя нельзя. Для работы с файлами необходимо подключать «Расширение работы с файлами». Для освоения тонкостей взаимодействия клиента и сервера подойдёт руководство по работе с файлами в управляемых формах 1С 8.3.
В веб-клиенте КаталогДокументов() может вернуть пустую строку, если расширение не установлено. Поэтому всегда проверяйте результат выполнения и предусматривайте резервный вариант, например, предложение пользователю самостоятельно указать путь в диалоге.
Для мобильной платформы (iOS, Android) пути строго изолированы. КаталогДокументов() вернет путь внутри песочницы приложения, доступ к которой с ПК обычно возможен только через специализированные утилиты или средства синхронизации (например, iTunes для iOS).
Подводя итог нашему разбору, можно выделить следующие правила выбора метода:
КаталогДокументов().WScript.Shell.ХранилищеОбщихНастроек или регистры сведений.Файл.Существует() или используйте СоздатьКаталог(), так как пути могут меняться или сетевые диски могут быть отключены.Применяя эти знания, мы создаем эргономичные и отказоустойчивые решения, которые корректно работают с файловой системой пользователя независимо от окружения.