Как получить путь к рабочему столу в 1С:Предприятие 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Способ 1. Использование встроенного метода SpecialFolders (Рекомендуемый)

Самым надежным, лаконичным и кроссплатформенным способом решения нашей задачи является использование специализированного объекта Windows Script Host (WSH) — WScript.Shell. Этот объект предоставляет коллекцию SpecialFolders, которая содержит актуальные пути ко всем важным системным папкам текущего пользователя, включая «Мои документы», «Шаблоны», «Старт» и, конечно же, «Рабочий стол».

Рассмотрим подробнее пример кода для реализации этого метода в модуле 1С 7.7:


// Создаем объект для работы со сценариями Windows
ШелСкрипт = СоздатьОбъект("WScript.Shell");

// Получаем путь к рабочему столу из коллекции специальных папок
ПутьКРабочемуСтолу = ШелСкрипт.SpecialFolders("Desktop");

// Выводим результат в окно сообщений
Сообщить("Путь к рабочему столу: " + ПутьКРабочемуСтолу);

Давайте выясним причину, почему этот способ считается оптимальным:

  1. Независимость от версии Windows. Код будет корректно работать как на старых ОС (Windows XP/7), так и на современных (Windows 10/11).
  2. Учет локализации интерфейса. В русскоязычных версиях Windows XP папка физически называлась «Рабочий стол», а в английских или современных версиях — «Desktop». Метод SpecialFolders автоматически вернет правильное имя папки с учетом языка операционной системы.
  3. Поддержка сетевых профилей и облачных хранилищ. Если на предприятии настроено перенаправление папок (например, рабочий стол синхронизируется с Microsoft OneDrive), данный метод вернет фактический путь (например, C:\Users\Имя\OneDrive\Desktop), а не стандартный локальный путь.

Способ 2. Чтение пути напрямую из системного реестра Windows

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

Разберем по шагам, как прочитать этот параметр с помощью метода RegRead объекта WScript.Shell:


// Инициализируем COM-объект WScript.Shell
WshShell = СоздатьОбъект("WScript.Shell");

// Определяем путь к ветке реестра, где хранятся пути Shell-папок
ПутьРеестра = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop";

// Выполняем чтение значения ключа реестра в попытке
Попытка
    ПутьКРабочемуСтолу = WshShell.RegRead(ПутьРеестра);
    Сообщить("Путь к рабочему столу из реестра: " + ПутьКРабочемуСтолу);
Исключение
    Сообщить("Не удалось прочитать данные из реестра! Ошибка: " + ОписаниеОшибки(), "!");
КонецПопытки;

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

Способ 3. Использование объекта Shell.Application

Еще один профессиональный подход, пришедший из системного программирования под Windows — использование интерфейса прикладного уровня Shell.Application. Этот объект работает с пространствами имен операционной системы (Namespace) и использует системные идентификаторы папок (CSIDL). Рабочему столу текущего пользователя соответствует числовой идентификатор 16 (константа CSIDL_DESKTOPDIRECTORY).

Посмотрим на пример практической реализации данного подхода в 1С 7.7:


// Создаем объект Shell.Application
ShellApp = СоздатьОбъект("Shell.Application");

// Получаем путь к специальной папке по ее CSIDL (16 - Desktop)
ПутьКРабочемуСтолу = ShellApp.Namespace(16).Self.Path;

// Выводим результат пользователю
Сообщить("Путь через Shell.Application: " + ПутьКРабочемуСтолу);

Этот метод работает чрезвычайно быстро и корректно во всех версиях операционных систем семейства Windows, гарантируя точное определение целевой директории.

Почему ручная сборка пути через %UserProfile% — это плохая практика?

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


WshShell = СоздатьОбъект("WScript.Shell");
ПрофильПользователя = WshShell.ExpandEnvironmentStrings("%UserProfile%");

// КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ТАК ДЕЛАТЬ:
ПутьКРабочемуСтолу = ПрофильПользователя + "\Desktop";

Никогда не используйте этот подход на практике! И вот почему:

  1. Если у пользователя установлена русскоязычная Windows XP, папка физически называется «Рабочий стол». Ваша программа попытается сохранить файл по пути C:\Users\Имя\Desktop, получит ошибку отсутствия каталога и аварийно завершит работу.
  2. Если на компьютере настроено облачное резервное копирование папок (OneDrive), реальный рабочий стол перемещается в подпапку OneDrive. Ручная склейка проигнорирует это перемещение, и файлы либо будут записываться «в никуда», либо вызовут системную ошибку доступа.

Универсальная функция для вашей конфигурации

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


// ==========================================
// Функция возвращает полный путь к рабочему столу текущего пользователя.
// Если получить путь не удалось, возвращает пустую строку.
//
Функция глПолучитьПутьКРабочемуСтолу() Экспорт
    
    // Пытаемся получить путь самым надежным способом через SpecialFolders
    Попытка
        ШелСкрипт = СоздатьОбъект("WScript.Shell");
        Возврат ШелСкрипт.SpecialFolders("Desktop");
    Исключение
        // Если первый способ вызвал ошибку, пробуем альтернативный Shell.Application
        Попытка
            ShellApp = СоздатьОбъект("Shell.Application");
            Возврат ShellApp.Namespace(16).Self.Path;
        Исключение
            // Если все варианты завершились неудачей, фиксируем ошибку
            ЗаписьЖурналаРегистрации("Ошибка получения пути к Рабочему столу: " + ОписаниеОшибки(), "Система", "Ошибка", , 3);
            Возврат "";
        КонецПопытки;
    КонецПопытки;
    
КонецФункции

Использование этой функции в коде вашей обработки будет выглядеть очень просто и лаконично:


ПутьДляСохранения = глПолучитьПутьКРабочемуСтолу();

Если ПутьДляСохранения = "" Тогда
    Предупреждение("Не удалось автоматически определить путь к Рабочему столу. Файл будет сохранен в корень диска C:\");
    ПутьДляСохранения = "C:\";
КонецЕсли;

// Дальнейший код сохранения файла...
ИмяФайла = ПутьДляСохранения + "\ВыгрузкаДанных.xls";

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

← На главную