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

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

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

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

Способ 1. Программный маппинг сетевого диска через COM-объект WScript.Network

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

Для реализации этого метода мы воспользуемся возможностями операционной системы Windows через OLE/COM-соединение с объектом WScript.Network. Давайте разберем готовый шаблон кода:


// Создаем COM-объект для работы с сетевым окружением Windows
СетевоеОкружение = Новый COMОбъект("WScript.Network");

ИмяСетевогоДиска = "M:"; // Выбираем свободную букву диска в системе
СетевойПуть = "\\server\share";
ИспользоватьПостоянноеПодключение = Ложь;
ПользовательДомена = "domain\username";
ПарольПользователя = "strong_password";

Попытка
    // Подключаем сетевой диск с явным указанием учетных данных
    СетевоеОкружение.MapNetworkDrive(ИмяСетевогоДиска, СетевойПуть, ИспользоватьПостоянноеПодключение, ПользовательДомена, ПарольПользователя);
    
    // Теперь мы можем работать с файлами стандартными методами 1С, используя букву диска "M:\"
    // Например, найдем нужные файлы
    НайденныеФайлы = НайтиФайлы("M:\", "*.xlsx");
    Для Каждого Файл Из НайденныеФайлы Цикл
        ЗаписьЛога = "Найден файл: " + Файл.Имя;
        // Обработка файла...
    КонецЦикла;
    
    // Обязательно отключаем сетевой диск после завершения работы
    СетевоеОкружение.RemoveNetworkDrive(ИмяСетевогоДиска, Истина);
Исключение
    Предупреждение("Ошибка при работе с сетевым диском: " + ОписаниеОшибки());
КонецПопытки;

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

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

Если мы не хотим занимать конкретные буквы дисков (такие как M:, Z: и другие) и рисковать конфликтами параллельных сеансов, мы можем авторизовать сетевую сессию для конкретного сетевого UNC-пути. Windows позволяет авторизоваться на сетевом ресурсе "в фоне". После этого стандартные методы 1С (например, КопироватьФайл) будут успешно обращаться к сетевому пути напрямую.

Для этого мы воспользуемся встроенной утилитой Windows net use. Проанализируем алгоритм работы:

  1. Выполняем системную команду авторизации на ресурсе с логином и паролем.
  2. Проводим все необходимые дисковые операции в 1С, обращаясь напрямую по UNC-пути (например, \\server\share\file.xml).
  3. Удаляем авторизованную сессию, чтобы закрыть доступ.

Давайте посмотрим на программный пример реализации этой логики:


СетевойПуть = "\\server\share";
Пользователь = "domain\username";
Пароль = "password123";

// Формируем команду авторизации
КомандаАвторизации = "net use " + СетевойПуть + " /user:" + Пользователь + " " + Пароль;

// Запускаем команду в скрытом режиме и ждем завершения ее выполнения
КодВозврата = 1;
ЗапуститьПриложение(КомандаАвторизации, , Истина, КодВозврата);

Если КодВозврата = 0 Тогда
    // Авторизация прошла успешно. Теперь 1С видит эту папку без ограничений прав
    ПутьКФайлу = СетевойПуть + "\data.txt";
    Если НайтиФайлы(ПутьКФайлу).Количество() > 0 Тогда
        // Выполняем чтение или копирование файла
        КопироватьФайл(ПутьКФайлу, "C:\LocalPath\data.txt");
    КонецЕсли;
    
    // После завершения обязательно сбрасываем авторизованную сессию
    КомандаЗакрытия = "net use " + СетевойПуть + " /delete /y";
    ЗапуститьПриложение(КомандаЗакрытия, , Истина);
Иначе
    ВызватьИсключение "Не удалось авторизоваться на сетевом ресурсе. Код ошибки: " + Строка(КодВозврата);
EndIf;

Способ 3. Диспетчер учетных данных Windows (Административный подход)

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

Суть метода заключается в том, чтобы сохранить доменные учетные данные целевого ресурса непосредственно в шифрованном хранилище Windows (Credential Manager) для профиля пользователя USR1CV8.

Выполним настройку по шагам:

  1. Поскольку служба сервера 1С работает в фоновом режиме, нам нужно запустить Диспетчер учетных данных именно в контексте пользователя USR1CV8. Для этого можно воспользоваться системной утилитой PsExec из пакета Sysinternals или временно разрешить пользователю USR1CV8 локальный интерактивный вход в систему.
  2. От имени пользователя USR1CV8 открываем командную строку и запускаем Диспетчер учетных данных командой: control /name Microsoft.CredentialManager.
  3. В открывшемся окне переходим в раздел "Учетные данные Windows" (Windows Credentials).
  4. Нажимаем кнопку "Добавить учетные данные Windows".
  5. В поле "Сетевой адрес" вводим имя целевого сервера (например, server-share или IP-адрес 192.168.10.25), а ниже указываем логин доменного пользователя и его пароль.

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

Способ 4. Предоставление доступа учетной записи компьютера (Computer Account)

Если сетевой каталог находится внутри одного домена Active Directory с сервером 1С, существует элегантный административный способ решения проблемы без использования паролей пользователей. Мы можем предоставить права доступа на сетевую папку непосредственно самому серверу, на котором крутится служба 1С.

Для этого в настройках безопасности целевой сетевой папки на удаленном сервере необходимо добавить в список разрешений учетную запись компьютера, на котором развернут сервер 1С. Имя учетной записи компьютера в домене выглядит как ИМЯ_СЕРВЕРА$ (знак доллара в конце обязателен).

После того как учетной записи сервера предоставлены права "Чтение" и "Запись", служба сервера 1С, работающая под локальной учетной записью USR1CV8 или NetworkService, получит беспрепятственный доступ к сетевой шаре.

Способ 5. Решение для Linux-окружения (Монтирование CIFS)

В современных реалиях серверная часть 1С все чаще разворачивается на базе операционных систем Linux (например, Astra Linux, RedOS, Ubuntu). В Linux-окружении COM-объекты Windows и команды net use недоступны. Здесь используется стандартный системный подход монтирования сетевых ресурсов.

Рассмотрим, как правильно примонтировать сетевую папку Windows-домена в локальную директорию Linux-сервера так, чтобы процесс 1С под управлением пользователя usr1cv8 имел к ней полноценный доступ.

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

  1. Создаем на Linux-сервере файл, где будут безопасно храниться доменные логин и пароль. Например, создадим файл /etc/1c_credentials:
    
    username=domain_user
    password=domain_password
    domain=your_domain.local
    
  2. Задаем жесткие права доступа к этому файлу, чтобы его не могли прочитать другие пользователи системы: chmod 600 /etc/1c_credentials
  3. Создаем локальную точку монтирования на сервере 1С: mkdir -p /mnt/network_share
  4. Для автоматического монтирования ресурса при старте системы добавляем строку в файл конфигурации /etc/fstab. Крайне важно передать владение точкой монтирования пользователю и группе сервера 1С (обычно это usr1cv8:grp1cv8):
    
    //windows-server/share /mnt/network_share cifs credentials=/etc/1c_credentials,uid=usr1cv8,gid=grp1cv8,iocharset=utf8,nofail 0 0
    
  5. Применяем монтирование без перезагрузки сервера: mount -a

После выполнения этих шагов в коде 1С мы можем работать с сетевым каталогом как с самой обычной локальной папкой по пути /mnt/network_share/. Вся низкоуровневая доменная авторизация будет прозрачно обрабатываться ядром Linux. Для интерактивной проверки каталогов и работы с файлами на сервере можно использовать файловый менеджер для обмена файлами между клиентом и сервером.

← На главную