При разработке и администрировании систем на базе 1С:Предприятие часто возникает классическая проблема: служба сервера 1С работает под локальной служебной учетной записью (например, USR1CV8), а целевой сетевой каталог находится в домене Active Directory и требует авторизации под конкретным доменным пользователем. В такой ситуации стандартные механизмы 1С для работы с файлами возвращают ошибку доступа.
В этой статье мы подробно разберем, как обойти это ограничение, выполнив авторизацию на ресурсе под произвольной учетной записью. Мы рассмотрим эффективные методы как для операционной системы Windows, так и для Linux-серверов.
Этот способ отлично подходит, если вам необходимо быстро подключить сетевой ресурс прямо из программного кода 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С одновременно выполняется несколько фоновых заданий, которые пытаются смонтировать одну и ту же букву диска, возникнет конфликт совместного доступа. Поэтому данный метод лучше использовать в монопольных режимах или динамически подбирать свободную букву.
Если мы не хотим занимать конкретные буквы дисков (такие как M:, Z: и другие) и рисковать конфликтами параллельных сеансов, мы можем авторизовать сетевую сессию для конкретного сетевого UNC-пути. Windows позволяет авторизоваться на сетевом ресурсе "в фоне". После этого стандартные методы 1С (например, КопироватьФайл) будут успешно обращаться к сетевому пути напрямую.
Для этого мы воспользуемся встроенной утилитой Windows net use. Проанализируем алгоритм работы:
\\server\share\file.xml).Давайте посмотрим на программный пример реализации этой логики:
СетевойПуть = "\\server\share";
Пользователь = "domain\username";
Пароль = "password123";
// Формируем команду авторизации
КомандаАвторизации = "net use " + СетевойПуть + " /user:" + Пользователь + " " + Пароль;
// Запускаем команду в скрытом режиме и ждем завершения ее выполнения
КодВозврата = 1;
ЗапуститьПриложение(КомандаАвторизации, , Истина, КодВозврата);
Если КодВозврата = 0 Тогда
// Авторизация прошла успешно. Теперь 1С видит эту папку без ограничений прав
ПутьКФайлу = СетевойПуть + "\data.txt";
Если НайтиФайлы(ПутьКФайлу).Количество() > 0 Тогда
// Выполняем чтение или копирование файла
КопироватьФайл(ПутьКФайлу, "C:\LocalPath\data.txt");
КонецЕсли;
// После завершения обязательно сбрасываем авторизованную сессию
КомандаЗакрытия = "net use " + СетевойПуть + " /delete /y";
ЗапуститьПриложение(КомандаЗакрытия, , Истина);
Иначе
ВызватьИсключение "Не удалось авторизоваться на сетевом ресурсе. Код ошибки: " + Строка(КодВозврата);
EndIf;
Это один из наиболее надежных и безопасных способов, поскольку он полностью исключает необходимость хранения паролей пользователей в кодовой базе 1С или конфигурационных файлах. Настройка выполняется один раз силами системного администратора на сервере 1С.
Суть метода заключается в том, чтобы сохранить доменные учетные данные целевого ресурса непосредственно в шифрованном хранилище Windows (Credential Manager) для профиля пользователя USR1CV8.
Выполним настройку по шагам:
USR1CV8. Для этого можно воспользоваться системной утилитой PsExec из пакета Sysinternals или временно разрешить пользователю USR1CV8 локальный интерактивный вход в систему.USR1CV8 открываем командную строку и запускаем Диспетчер учетных данных командой: control /name Microsoft.CredentialManager.server-share или IP-адрес 192.168.10.25), а ниже указываем логин доменного пользователя и его пароль.После сохранения этих данных операционная система Windows будет автоматически подставлять нужные реквизиты авторизации каждый раз, когда служба сервера 1С попытается обратиться к указанному сетевому адресу. В кодовой базе 1С при этом не потребуется писать никакой дополнительный код авторизации — обращение будет выполняться стандартным образом.
Если сетевой каталог находится внутри одного домена Active Directory с сервером 1С, существует элегантный административный способ решения проблемы без использования паролей пользователей. Мы можем предоставить права доступа на сетевую папку непосредственно самому серверу, на котором крутится служба 1С.
Для этого в настройках безопасности целевой сетевой папки на удаленном сервере необходимо добавить в список разрешений учетную запись компьютера, на котором развернут сервер 1С. Имя учетной записи компьютера в домене выглядит как ИМЯ_СЕРВЕРА$ (знак доллара в конце обязателен).
После того как учетной записи сервера предоставлены права "Чтение" и "Запись", служба сервера 1С, работающая под локальной учетной записью USR1CV8 или NetworkService, получит беспрепятственный доступ к сетевой шаре.
В современных реалиях серверная часть 1С все чаще разворачивается на базе операционных систем Linux (например, Astra Linux, RedOS, Ubuntu). В Linux-окружении COM-объекты Windows и команды net use недоступны. Здесь используется стандартный системный подход монтирования сетевых ресурсов.
Рассмотрим, как правильно примонтировать сетевую папку Windows-домена в локальную директорию Linux-сервера так, чтобы процесс 1С под управлением пользователя usr1cv8 имел к ней полноценный доступ.
Разберем по шагам процесс настройки через файл учетных данных:
/etc/1c_credentials:
username=domain_user
password=domain_password
domain=your_domain.local
chmod 600 /etc/1c_credentials
mkdir -p /mnt/network_share
/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
mount -a
После выполнения этих шагов в коде 1С мы можем работать с сетевым каталогом как с самой обычной локальной папкой по пути /mnt/network_share/. Вся низкоуровневая доменная авторизация будет прозрачно обрабатываться ядром Linux. Для интерактивной проверки каталогов и работы с файлами на сервере можно использовать файловый менеджер для обмена файлами между клиентом и сервером.