Как в 1С обратиться к сетевому диску или папке с сервера под определенной учетной записью?

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

Часто при разработке фоновых заданий или серверных модулей возникает задача прочитать файл из сетевой папки или сохранить отчет на другой сервер. Однако стандартные методы 1С могут выдавать ошибку «Каталог не существует», даже если при ручном копировании всё работает. В этой статье мы подробно разберем, почему так происходит, и рассмотрим пошагово все способы решения этой проблемы.

Выясним причину: почему сервер 1С «не видит» сеть

Прежде чем приступать к коду, давайте проанализируем ситуацию с точки зрения операционной системы. Когда вы заходите на сервер под своей учетной записью и копируете файл «руками», вы работаете в своем интерактивном сеансе. Фоновое же задание 1С выполняется в контексте службы «Агент сервера 1С:Предприятия».

По умолчанию эта служба устанавливается от имени локального пользователя USR1CV8. Эта учетная запись «живет» только на текущем компьютере и не имеет никаких прав в доменной сети. Именно поэтому при попытке обратиться к пути \\Server2\Share сервер 1С получает отказ в доступе.

Кроме того, важно помнить: сетевые диски (например, диск Z:) существуют только внутри сеанса конкретного пользователя. Для службы 1С, работающей в «нулевой» сессии, никаких букв дисков не существует, даже если вы их подключили под своим логином.

Решение 1: Смена учетной записи службы 1С

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

  1. Создайте в домене специального пользователя (например, 1C_Service).
  2. На сервере, где установлена 1С, откройте «Службы» (services.msc).
  3. Найдите службу «Агент сервера 1С:Предприятия», перейдите в «Свойства» на вкладку «Вход в систему».
  4. Укажите данные доменного пользователя и пароль.
  5. Важно: Этой учетной записи необходимо дать права «Вход в систему как служба» (Log on as a service) в локальных политиках безопасности сервера.
  6. Также не забудьте дать этому пользователю права на чтение и запись в свойствах целевой сетевой папки на удаленном сервере (вкладки «Доступ» и «Безопасность»).

После перезапуска службы 1С все методы работы с файлами, такие как КопироватьФайл() или НайтиФайлы(), начнут видеть сетевые ресурсы по UNC-путям.

Решение 2: Использование UNC-путей

Как мы уже выяснили, использовать буквы дисков (Z:\...) в серверном коде нельзя. Мы должны использовать полные сетевые имена. Давайте посмотрим на пример правильного обращения к файлу:


// Неправильно:
ПутьКФайлу = "Z:\Reports\Sales.xlsx"; 

// Правильно:
ПутьКФайлу = "\\ИмяСервераХранилища\ОбщаяПапка\Reports\Sales.xlsx";

ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
    // Продолжаем работу
КонецЕсли;

Решение 3: Программная авторизация через COM-объект

Если сменить пользователя службы нет возможности (например, из-за политик безопасности компании), мы можем попробовать «представиться» удаленному серверу прямо из кода. Для этого воспользуемся объектом WScript.Network. Проанализируем пример кода, который временно подключает ресурс:


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

ПутьКРесурсу = "\\Server2\ShareName";
Логин = "DOMAIN\UserName";
Пароль = "P@ssw0rd123";

Попытка
    // Подключаем сетевой ресурс без назначения буквы диска
    // Третий параметр Ложь - не сохранять подключение постоянно
    Network.MapNetworkDrive("", ПутьКРесурсу, Ложь, Логин, Пароль);
    
    // Теперь сервер 1С авторизован для этого пути
    КопироватьФайл(ПутьКРесурсу + "\file.txt", "C:\Temp\file.txt");
    
    // После работы желательно отключить ресурс
    Network.RemoveNetworkDrive(ПутьКРесурсу);
Исключение
    Сообщить("Ошибка авторизации: " + ОписаниеОшибки());
КонецПопытки;

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

Решение 4: Использование системной команды net use

Рассмотрим еще один вариант авторизации — через вызов командной строки Windows. Это позволяет «объяснить» операционной системе, под какими данными нужно ходить на конкретный сервер.


// Формируем команду авторизации
Команда = "net use \\Server2\ShareName /user:DOMAIN\Login MyPassword";

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

// Теперь можно обращаться к файлу напрямую
Если НайтиФайлы("\\Server2\ShareName", "data.xml").Количество() > 0 Тогда
    // Код обработки файла
КонецЕсли;

// После завершения можно сбросить авторизацию
ЗапуститьПриложение("net use \\Server2\ShareName /delete", , Истина);

Важные нюансы и типичные ошибки

Проанализируем несколько критических моментов, которые часто упускают из виду:

  1. Права NTFS против прав доступа к папке: Помните, что доступ настраивается в двух местах. Вкладка «Доступ» открывает «дверь» в сеть, а вкладка «Безопасность» (NTFS) разрешает конкретные действия с файлами. Учетная запись сервера 1С должна быть прописана в обоих местах.
  2. Интерактивная проверка: Чтобы проверить доступ максимально точно, попробуйте запустить командную строку (cmd) от имени пользователя службы 1С. Используйте команду: runas /user:DOMAIN\1C_Service cmd. В открывшемся окне введите dir \\Server2\ShareName. Если вы видите список файлов — значит, и 1С их увидит.
  3. Проблема «двойного прыжка» (Double Hop): Если ваша 1С обращается к одному серверу, а тот должен передать ваши полномочия дальше на третий сервер, это работать не будет без настройки делегирования в Active Directory. Старайтесь избегать таких цепочек и настраивать доступ напрямую.

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

← На главную