При интеграции 1С с внешними хранилищами данных часто возникает задача запуска или открытия файлов, расположенных на защищенных сетевых ресурсах (UNC-пути вида \\Server\Share\file.ext). Если в операционной системе текущего пользователя доступ к сетевой папке не настроен с автоматическим сохранением учетных данных, стандартный метод платформы ЗапуститьПриложение() завершится ошибкой доступа, поскольку он не позволяет напрямую передать логин и пароль к ресурсу.
Разберем основные практические подходы к решению этой задачи: авторизацию в сетевом ресурсе на стороне клиента перед запуском файла и получение файла через серверную процедуру с сохранением во временный каталог.
Проанализируем работу со встроенной консольной командой Windows net use. С ее помощью можно авторизоваться на сетевом ресурсе для текущего сеанса пользователя без необходимости обязательно привязывать ресурс к букве локального диска.
Рассмотрим по шагам выполнение этой операции:
ЗапуститьПриложение().Посмотрим на пример кода с подключением сетевого диска и прямым копированием файла во временную папку:
ИмяСервера = "\\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");
Вместо вызова командной строки операционной системы можно использовать возможности Windows Script Host через объект WScript.Network. Этот метод позволяет подключить сетевой ресурс напрямую из кода 1С с передачей учетных данных.
Посмотрим на пример подключения сетевого диска и последующего отключения:
СетевойДиск = "Z:";
СетевойПуть = "\\dsk\FileStore";
Логин = "DSK\1CUser";
Пароль = "pass1CUser";
WshNetwork = Новый COMОбъект("WScript.Network");
Попытка
// Подключаем сетевой диск с логином и паролем
WshNetwork.MapNetworkDrive(СетевойДиск, СетевойПуть, Ложь, Логин, Пароль);
// Запускаем нужный файл
ЗапуститьПриложение(СетевойДиск + "\file_name.xlsx");
// При необходимости отключаем диск (первый параметр - буква, второй - принудительно)
// WshNetwork.RemoveNetworkDrive(СетевойДиск, Истина);
Исключение
Сообщить("Ошибка при подключении сетевого диска: " + ОписаниеОшибки());
КонецПопытки;
Если 1С работает в клиент-серверном режиме и служба сервера 1С (ragent) запущена под доменной или локальной учетной записью, у которой уже есть права на чтение сетевой папки, выполнять авторизацию на клиенте не требуется.
Разберем схему работы:
ДвоичныеДанные.ХранилищеЗначения на сторону клиента.ЗапуститьПриложение().Рассмотрим пример реализации:
// Серверная функция
Функция ПолучитьФайлССервера(ПолныйПутьКФайлу) Экспорт
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолныйПутьКФайлу);
Возврат Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
КонецФункции
// Клиентская процедура открытия
Процедура ОткрытьФайлИзСети()
ПутьНаСервере = "\\dsk\FileStore\file_name.xlsx";
ИмяФайла = "file_name.xlsx";
// Получаем данные с сервера
Хранилище = ПолучитьФайлССервера(ПутьНаСервере);
ДвоичныеДанныеФайла = Хранилище.Получить();
// Формируем путь во временном каталоге клиента
ЛокальныйПуть = КаталогВременныхФайлов() + ИмяФайла;
ДвоичныеДанныеФайла.Записать(ЛокальныйПуть);
// Открываем локальный файл
ЗапуститьПриложение(ЛокальныйПуть);
КонецПроцедуры
Ограничение данного способа: если пользователю требуется не просто просмотреть файл, но и сохранить изменения обратно в сетевую папку, потребуется дополнительно отслеживать момент закрытия файла на клиенте и передавать измененные двоичные данные обратно на сервер для перезаписи исходного файла.
Если требуется долговременный доступ к серверу без повторной передачи логина и пароля при каждом запуске файла, можно разово зарегистрировать учетные данные в диспетчере учетных данных 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.
Выясним частые проблемы, возникающие при авторизации в сетевых папках:
net use выдаст ошибку. Для исправления перед новой авторизацией выполните сброс старых подключений: net use \\dsk /delete.net use создаются в контексте текущей сессии пользователя Windows и не мешают другим пользователям терминального сервера.