Как программно обратиться к сетевой папке с авторизацией в 1С

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

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

Разбор базового метода: использование системной команды net use

Рассмотрим самый распространенный способ — использование встроенной консольной утилиты Windows net use. Основная ошибка новичков заключается в попытке обратиться напрямую к файлу, не подключив предварительно сетевой ресурс как логический диск или не установив сессию с сервером. Проанализируем правильный синтаксис команды:


// Пример формирования команды для Windows
КомандаСистемы("net use X: \\ИмяСервера\ИмяПапки Пароль /user:ИмяПользователя /persistent:no");

Разберем по шагам параметры этой команды:

  1. X: — это буква диска, которую мы хотим назначить сетевому ресурсу. Рекомендуется использовать буквы из конца алфавита, чтобы избежать конфликтов с локальными устройствами.
  2. \\ИмяСервера\ИмяПапки — путь к сетевому ресурсу в формате UNC. Важно указывать путь именно к папке (шаре), а не к конкретному файлу.
  3. Пароль и /user:ИмяПользователя — учетные данные для авторизации. Если пользователь доменный, имя указывается в формате ДОМЕН\Логин.
  4. /persistent:no — этот флаг указывает системе, что подключение не нужно восстанавливать после перезагрузки ОС. Для программных задач в 1С это наиболее безопасный вариант.

После выполнения данной команды мы можем обращаться к файлам через букву диска X:\file.jpg или через исходный UNC-путь, так как Windows уже установила доверенную сессию с сервером.

Особенности выполнения на стороне сервера (Session 0 Isolation)

Выясним причину, по которой код, успешно работающий на компьютере программиста, часто "падает" при выполнении на сервере 1С. Большинство серверов 1С работают в виде службы (Service) под специальной учетной записью (например, USR1CV8). Службы Windows работают в изолированной Сессии 0.

Проанализируем последствия этой изоляции:

Рассмотрим эффективное решение: вместо манипуляций с буквами дисков в коде, попросим системного администратора дать права на сетевую папку непосредственно учетной записи, под которой запущен Агент сервера 1С. В этом случае авторизация будет происходить прозрачно, и мы сможем использовать стандартные функции 1С, такие как КопироватьФайл() или НайтиФайлы(), напрямую по UNC-пути:


// Прямое обращение без назначения буквы диска
ПутьКФайлу = "\\192.168.1.100\Public\images\photo.jpg";
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
    Сообщить("Доступ успешно получен!");
КонецЕсли;

Использование объекта WScript.Network для гибкого управления

Если нам необходимо программно управлять процессом и получать внятную информацию об ошибках, рассмотрим использование COM-объекта WScript.Network. Этот метод более "чистый" с точки зрения интеграции, так как позволяет избежать появления консольных окон cmd.exe.

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


Сеть = Новый COMОбъект("WScript.Network");
Попытка
    // Параметры: ЛокальноеИмя, УдаленныйПуть, ОбновлятьПрофиль, Пользователь, Пароль
    Сеть.MapNetworkDrive("Z:", "\\Server\Share", Ложь, "Domain\User", "Password");
    Сообщить("Диск успешно подключен");
Исключение
    Сообщить("Ошибка при подключении: " + ОписаниеОшибки());
КонецПопытки;

После завершения работы с файлами крайне важно освободить ресурс, чтобы не блокировать сессии на сервере:


Сеть.RemoveNetworkDrive("Z:", Истина, Истина);

Доступ через SQL Server (xp_cmdshell)

В некоторых сложных архитектурах, когда 1С не имеет прямого доступа к сети, но такой доступ есть у сервера базы данных, можно использовать возможности MS SQL Server. Посмотрим на пример вызова системных команд через SQL-запрос:


// Пример использования через COM-соединение с SQL
Рекордсет = COMОбъект.Execute("EXEC xp_cmdshell 'net use Z: \\Storage\Files /user:Admin Pass'");
// Выполняем действия, например, защищенный бэкап или чтение
// ...
// Удаляем подключение
Рекордсет = COMОбъект.Execute("EXEC xp_cmdshell 'net use Z: /delete'");

Важно: Этот метод требует включенной опции xp_cmdshell на уровне SQL-сервера, что часто запрещено политиками безопасности из-за высоких рисков взлома системы.

Безопасное хранение учетных данных с помощью cmdkey

Рассмотрим ситуацию, когда мы не хотим "светить" пароли в открытом виде в коде, ведь всем известно, почему хранить пароли и ключи API прямо в модуле — это плохая практика. Для особо критичных систем можно настроить хранение секретов в Hashicorp Vault, но для базовых задач Windows проанализируем встроенный инструмент Credential Manager. С помощью утилиты cmdkey можно один раз сохранить учетные данные на сервере под тем пользователем, который запускает 1С.

Алгоритм действий:

  1. Зайдите на сервер под учетной записью службы 1С.
  2. Выполните команду: cmdkey /add:ИмяСервера /user:Логин /pass:Пароль.
  3. Теперь в коде 1С достаточно просто обращаться к \\ИмяСервера\Папка, и система сама подставит сохраненные учетные данные.

Рекомендации по работе с файлами в стиле БСП

Если вы работаете в современной конфигурации на базе БСП (Библиотека стандартных подсистем), рекомендуется использовать механизмы работы с файлами, заложенные в библиотеке. Также полезно изучить полезный код для асинхронной работы с файловой системой, который дополняет стандарты БСП. Рассмотрим логику, которую предлагает библиотека:

  1. Серверный вызов: Весь поиск и чтение файлов выполняются на сервере.
  2. Передача данных: Файл считывается в ДвоичныеДанные и передается на клиент через временное хранилище.
  3. Интерактивность: Клиент получает файл, редактирует его локально и отправляет обратно на сервер для сохранения.

Такой подход минимизирует проблемы с правами доступа, так как полномочия на сетевой ресурс нужны только одной учетной записи — серверу приложений 1С.

Итоги и выводы

Мы проанализировали различные сценарии доступа к закрытым сетевым папкам. Если ручная реализация кажется избыточной, можно рассмотреть готовые инструменты, например O-Bridges для простого обмена данными. Подведем итоги нашей работы:

Выбор конкретного метода зависит от вашей ИТ-инфраструктуры и требований безопасности, но наиболее профессиональным подходом считается настройка прав на уровне ОС без явной передачи паролей внутри программного кода.

← На главную