При организации интеграции между конфигурациями 1С часто используется программное подключение через COM-соединение с помощью объекта V83.COMConnector. Однако при попытке подключиться к файловой информационной базе, расположенной на удаленном компьютере или сервере вне домена, разработчики регулярно сталкиваются с системной ошибкой доступа к файлам.
Проанализируем типовую ситуацию: в коде 1С выполняется попытка инициализации подключения к сетевому ресурсу:
COMConnector = Новый COMОбъект("V83.COMConnector");
V8 = COMConnector.Connect("File=""\\192.168.17.20\buhdb""; Usr=""User""; Pwd=""Password"";");
В результате выполнения этого кода возникает исключение:
Ошибка при выполнении файловой операции '\\192.168.17.20\buhdb\1Cv8.cdn'. 1326(0x0000052E): Вход в систему не произведен: имя пользователя или пароль не опознаны.
Выясним причину такого поведения и разберем по шагам все способы решения этой проблемы.
Разберем природу возникшей ошибки. Параметры Usr и Pwd в строке подключения Connect предназначены исключительно для внутренней аутентификации пользователя в самой базе данных 1С:Предприятия. В платформе 1С отсутствуют штатные параметры для передачи логина и пароля учетной записи операционной системы.
Ошибка 1326 генерируется операционной системой Windows на сетевом уровне (протокол SMB) еще до того, как платформа 1С приступает к проверке пользователя информационной базы. При попытке прочитать файл блокировок 1Cv8.cdn или файл таблиц 1Cv8.1CD по UNC-пути операционная система запрашивает учетные данные для доступа к общему сетевому ресурсу. Если компьютеры находятся в рабочей группе (не в домене) или у текущего пользователя Windows нет прав на сетевую папку, соединение аварийно завершается.
Рассмотрим самый простой и быстрый способ решения задачи непосредственно из программного кода 1С. Перед вызовом метода Connect мы можем выполнить системную команду авторизации на удаленном сетевом ресурсе с помощью встроенной утилиты Windows net use.
Посмотрим на пример реализации в коде:
// Выполняем предварительную авторизацию на сетевом ресурсе Windows
КомандаСистемы("net use \\192.168.17.20\buhdb /user:ИмяПользователя Пароль");
// Выполняем стандартное подключение через COM-соединение
COMConnector = Новый COMОбъект("V83.COMConnector");
ПараметрыПодключения = "File=""\\192.168.17.20\buhdb""; Usr=""User""; Pwd=""Password"";";
V8 = COMConnector.Connect(ПараметрыПодключения);
После выполнения команды net use в текущей пользовательской сессии создается авторизованное сетевое подключение к серверу, и последующее обращение COM-объекта к файлам базы проходит успешно.
Использование метода КомандаСистемы может приводить к кратковременному появлению консольного окна командной строки (cmd.exe), что не всегда удобно пользователям. Разберем более аккуратный программный подход с использованием COM-объекта WScript.Network.
Посмотрим на пример подключения сетевого каталога в виде сетевого диска с обработкой исключений:
СетевойДиск = Новый COMОбъект("WScript.Network");
Попытка
// Подключаем сетевую папку как локальный диск Z:
СетевойДиск.MapNetworkDrive("Z:", "\\192.168.17.20\buhdb", Ложь, "ИмяПользователяОС", "ПарольОС");
Исключение
// Диск уже может быть подключен в сессии, продолжаем работу
КонецПопытки;
COMConnector = Новый COMОбъект("V83.COMConnector");
// Обращаемся к базе как к локальному каталогу
V8 = COMConnector.Connect("File=""Z:""; Usr=""User""; Pwd=""Password"";");
// При необходимости после завершения работы диск можно отключить:
// СетевойДиск.RemoveNetworkDrive("Z:", Истина, Истина);
Если требуется избавиться от хранения паролей операционной системы в открытом виде в модулях 1С, рассмотрим вариант сохранения сетевых реквизитов в системном Диспетчере учетных данных Windows. Это достаточно сделать один раз на рабочем месте, откуда выполняется запуск.
Разберем порядок действий:
cmdkey /add:192.168.17.20 /user:ИмяПользователяОС /pass:ПарольОС
\\192.168.17.20, включая вызовы из V83.COMConnector.В сетях без доменной структуры (рабочая группа) можно применить механизм сквозной NTLM-аутентификации. Для этого администратор создает на компьютере с расшаренной базой локальную учетную запись Windows, имя и пароль которой в точности совпадают с учетной записью пользователя на клиентском компьютере. В этом случае операционная система Windows выполняет вход на сетевой ресурс автоматически в фоновом режиме без необходимости ручного ввода паролей.
Обратим внимание на критически важный нюанс: если описанный код выполняется не в толстом или тонком клиенте, а на стороне сервера 1С (в серверном вызове, регламентном или фоновом задании), методы интерактивного входа работать не будут.
ragent.exe / rphost.exe) функционирует в изолированной нулевой сессии под системной учетной записью (по умолчанию usr1cv8). Ей недоступны сетевые диски и кэш паролей интерактивных пользователей.cmdkey необходимо добавлять именно от имени пользователя службы usr1cv8, либо запускать службу сервера от учетной записи, обладающей прямым доступом к сетевой папке.comcntr.dll (x86 или x64) должна строго совпадать с разрядностью процесса, выполняющего вызов. Для 64-битного сервера 1С требуется регистрация 64-битного COM-коннектора.Прямое подключение по протоколу SMB к файловой базе данных 1С через сетевые папки несет в себе риски повреждения файла 1Cv8.1CD при сетевых сбоях и нестабильности канала связи. Для стабильной интеграции рекомендуется рассмотреть следующие альтернативы:
Srvr="ServerName"; Ref="BaseName";), что исключает необходимость работы с файловой системой удаленного компьютера.