Как в 1С программно открыть файл из сетевой папки с паролем?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними хранилищами данных часто возникает задача запуска или открытия файлов, расположенных на защищенных сетевых ресурсах (UNC-пути вида \\Server\Share\file.ext). Если в операционной системе текущего пользователя доступ к сетевой папке не настроен с автоматическим сохранением учетных данных, стандартный метод платформы ЗапуститьПриложение() завершится ошибкой доступа, поскольку он не позволяет напрямую передать логин и пароль к ресурсу.

Разберем основные практические подходы к решению этой задачи: авторизацию в сетевом ресурсе на стороне клиента перед запуском файла и получение файла через серверную процедуру с сохранением во временный каталог.

Способ 1. Авторизация к UNC-пути через системную утилиту net use

Проанализируем работу со встроенной консольной командой Windows net use. С ее помощью можно авторизоваться на сетевом ресурсе для текущего сеанса пользователя без необходимости обязательно привязывать ресурс к букве локального диска.

Рассмотрим по шагам выполнение этой операции:

  1. Выполняем команду авторизации к сетевому каталогу под нужными учетными данными.
  2. Запускаем файл с помощью метода ЗапуститьПриложение().
  3. При необходимости отключаем сессию, чтобы не оставлять открытый доступ к ресурсу.

Посмотрим на пример кода с подключением сетевого диска и прямым копированием файла во временную папку:


ИмяСервера = "\\dsk\FileStore";
Логин = "DSK\1CUser";
Пароль = "pass1CUser";
ИмяФайла = "file_name.xlsx";

// Подключаем сетевой ресурс как диск R:
КомандаСистемы("net use R: " + ИмяСервера + " " + Пароль + " /USER:" + Логин);

// Копируем файл во временный каталог
КаталогВременный = КаталогВременныхФайлов();
КомандаСистемы("copy R:\" + ИмяФайла + " """ + КаталогВременный + """");

// Запускаем файл
ЗапуститьПриложение(КаталогВременный + ИмяФайла);

// Отключаем диск
КомандаСистемы("net use R: /DELETE /YES");

Чтобы избежать выделения буквы диска и запускать файл напрямую по UNC-пути, можно авторизовать сам сетевой путь:


СетевойПуть = "\\dsk\FileStore";
Логин = "DSK\1CUser";
Пароль = "pass1CUser";

// Авторизация к UNC-пути
КомандаСистемы("net use " + СетевойПуть + " " + Пароль + " /USER:" + Логин);

// Запуск файла напрямую из сетевой папки
ЗапуститьПриложение(СетевойПуть + "\file_name.xlsx");

Важный момент: если использовать вызов КомандаСистемы(), на экране пользователя может кратковременно появляться черное окно командной строки. Чтобы выполнить команду в скрытом режиме, используем COM-объект WScript.Shell с параметром скрытия окна 0:


WshShell = Новый COMОбъект("WScript.Shell");
Команда = "cmd.exe /c net use \\dsk\FileStore pass1CUser /USER:DSK\1CUser";
WshShell.Run(Команда, 0, Истина);

ЗапуститьПриложение("\\dsk\FileStore\file_name.xlsx");

Способ 2. Подключение ресурса через COM-объект WScript.Network

Вместо вызова командной строки операционной системы можно использовать возможности Windows Script Host через объект WScript.Network. Этот метод позволяет подключить сетевой ресурс напрямую из кода 1С с передачей учетных данных.

Посмотрим на пример подключения сетевого диска и последующего отключения:


СетевойДиск = "Z:";
СетевойПуть = "\\dsk\FileStore";
Логин = "DSK\1CUser";
Пароль = "pass1CUser";

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

Попытка
    // Подключаем сетевой диск с логином и паролем
    WshNetwork.MapNetworkDrive(СетевойДиск, СетевойПуть, Ложь, Логин, Пароль);
    
    // Запускаем нужный файл
    ЗапуститьПриложение(СетевойДиск + "\file_name.xlsx");
    
    // При необходимости отключаем диск (первый параметр - буква, второй - принудительно)
    // WshNetwork.RemoveNetworkDrive(СетевойДиск, Истина);
Исключение
    Сообщить("Ошибка при подключении сетевого диска: " + ОписаниеОшибки());
КонецПопытки;

Способ 3. Получение файла через сервер 1С (клиент-серверный вариант)

Если 1С работает в клиент-серверном режиме и служба сервера 1С (ragent) запущена под доменной или локальной учетной записью, у которой уже есть права на чтение сетевой папки, выполнять авторизацию на клиенте не требуется.

Разберем схему работы:

  1. На стороне сервера считываем файл из сетевой папки в объект ДвоичныеДанные.
  2. Помещаем двоичные данные во временное хранилище или передаем через ХранилищеЗначения на сторону клиента.
  3. На клиенте сохраняем полученные данные во временный файл и вызываем ЗапуститьПриложение().

Рассмотрим пример реализации:


// Серверная функция
Функция ПолучитьФайлССервера(ПолныйПутьКФайлу) Экспорт
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьКФайлу);
    Возврат Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
КонецФункции

// Клиентская процедура открытия
Процедура ОткрытьФайлИзСети()
    ПутьНаСервере = "\\dsk\FileStore\file_name.xlsx";
    ИмяФайла = "file_name.xlsx";
    
    // Получаем данные с сервера
    Хранилище = ПолучитьФайлССервера(ПутьНаСервере);
    ДвоичныеДанныеФайла = Хранилище.Получить();
    
    // Формируем путь во временном каталоге клиента
    ЛокальныйПуть = КаталогВременныхФайлов() + ИмяФайла;
    ДвоичныеДанныеФайла.Записать(ЛокальныйПуть);
    
    // Открываем локальный файл
    ЗапуститьПриложение(ЛокальныйПуть);
КонецПроцедуры

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

Способ 4. Добавление учетных данных через диспетчер Windows (cmdkey)

Если требуется долговременный доступ к серверу без повторной передачи логина и пароля при каждом запуске файла, можно разово зарегистрировать учетные данные в диспетчере учетных данных Windows (Windows Credential Manager) с помощью утилиты cmdkey:


Сервер = "dsk";
Логин = "DSK\1CUser";
Пароль = "pass1CUser";

WshShell = Новый COMОбъект("WScript.Shell");
Команда = "cmdkey /add:" + Сервер + " /user:" + Логин + " /pass:" + Пароль;
WshShell.Run(Команда, 0, Истина);

// Теперь доступ к ресурсу будет выполняться прозрачно
ЗапуститьПриложение("\\dsk\FileStore\file_name.xlsx");

При необходимости удаление сохраненных данных выполняется командой cmdkey /delete:dsk.

Возможные ошибки и нюансы

Выясним частые проблемы, возникающие при авторизации в сетевых папках:

  1. Ошибка Windows 1219 (Множественные подключения): подсистема SMB не позволяет подключаться к одному серверу под разными учетными записями одновременно. Если до выполнения скрипта к серверу уже было выполнено гостевое или неавторизованное подключение, команда net use выдаст ошибку. Для исправления перед новой авторизацией выполните сброс старых подключений: net use \\dsk /delete.
  2. Терминальный режим (RDP): сетевые диски и авторизации через net use создаются в контексте текущей сессии пользователя Windows и не мешают другим пользователям терминального сервера.
← На главную