Часто при переходе с файловой версии базы данных на клиент-серверную программисты и администраторы сталкиваются с неприятной особенностью: код, который успешно открывал файлы в сетевой папке, внезапно начинает выдавать ошибку "Доступ запрещен" или "Файл не найден". Проблема осложняется тем, что под обычным пользователем Windows папка открывается без проблем, а сервер 1С её "не видит".
В этой статье мы подробно разберем, почему возникает эта ошибка, как работает механизм аутентификации служб Windows и какими способами можно обеспечить стабильный доступ сервера 1С к сетевым ресурсам.
Разберем первопричину. Когда вы запускаете 1С в файловом режиме, все операции с файлами выполняются от имени вашей текущей учетной записи Windows. У вас есть права на сетевую папку — у 1С они тоже есть.
В клиент-серверном варианте код, исполняемый в процедурах НаСервере, выполняется службой «Агент сервера 1С:Предприятия». По умолчанию при установке 1С создается специальный локальный пользователь (обычно это USR1CV8), от имени которого и работает эта служба. Этот пользователь существует только на том сервере, где установлена 1С, и «другой компьютер», на котором лежат файлы, ничего не знает о существовании этого локального пользователя. В итоге при попытке доступа удаленный компьютер видит «Анонимный вход» (Anonymous Logon), который из соображений безопасности заблокирован.
Проанализируем самый распространенный вариант решения в сетях без домена (Workgroup). Чтобы один компьютер «узнал» пользователя с другого компьютера, нам нужно создать идентичную среду на обоих узлах.
Рассмотрим по шагам, что необходимо сделать:
USR1CV8).USR1CV8, его придется сменить на обоих ПК.USR1CV8 даем права «Чтение и запись» как на уровне общего доступа к папке (Sharing), так и на уровне файловой системы (вкладка Безопасность/Security в свойствах папки).Выясним еще одну важную деталь. Службы Windows работают в так называемой «Сессии 0». В этой сессии не существуют подключенные сетевые диски (например, диск Z:\). Даже если вы зашли на сервер под администратором и подключили диск, сервер 1С его не увидит.
Правило: Всегда используйте полные сетевые пути в формате UNC:
\\ИмяКомпьютера\ИмяПапки\ИмяФайла.расширение
Если в вашем коде или настройках прописан путь через букву диска, его необходимо заменить на сетевой путь, иначе серверная процедура никогда не найдет файл.
Рассмотрим ситуацию с точки зрения архитектуры 1С. Зачастую правильнее не мучиться с правами доступа сервера к чужим папкам, а передать файл с клиента на сервер программно. Это наиболее надежный способ для управляемых форм.
Разберем пример кода, который позволяет загрузить файл, выбранный пользователем, на сервер:
&НаКлиенте
Процедура ВыбратьИЗагрузитьФайл()
// Выбираем файл на локальном ПК пользователя
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки";
Если Диалог.Выбрать() Тогда
// Помещаем файл во временное хранилище
АдресХранилища = "";
ИмяВыбранногоФайла = Диалог.ПолноеИмяФайла;
ПоместитьФайл(АдресХранилища, ИмяВыбранногоФайла, , Ложь);
// Передаем адрес хранилища на сервер для обработки
ОбработатьФайлНаСервере(АдресХранилища);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
// Получаем данные из хранилища
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
// Создаем временное имя файла на самом сервере 1С
ВременноеИмяСервер = ПолучитьИмяВременногоФайла("xlsx");
// Записываем данные на локальный диск сервера для чтения
ДанныеФайла.Записать(ВременноеИмяСервер);
// Теперь сервер 1С гарантированно имеет доступ к этому файлу
// Здесь выполняем чтение файла, например через Новый COMОбъект("Excel.Application")
// ...
// Не забываем удалить временный файл после работы
УдалитьФайлы(ВременноеИмяСервер);
КонецПроцедуры
Этот метод хорош тем, что серверу 1С вообще не нужны права на доступ к компьютеру пользователя. Он работает со своим локальным диском.
Если ваша сеть управляется контроллером домена Active Directory, задача упрощается. Вам не нужно создавать одинаковых пользователей вручную.
DOMAIN\1C_Service).LocalSystem, то на папку нужно дать права учетной записи самого компьютера, на котором стоит сервер 1С (имя вида SERVERNAME$).Если вы запутались и не понимаете, от чьего имени 1С пытается достучаться до файла, воспользуйтесь системной диагностикой. Напишите простую обработку, которая выполнит команду whoami на стороне сервера и запишет результат в текстовый файл.
КомандаСистемы("whoami > C:\temp\user_info.txt");
Проанализировав содержимое файла user_info.txt, вы увидите реальное имя пользователя, под которым работает процесс rphost. Именно этому пользователю нужно давать права на сетевые ресурсы.
Проанализируем дополнительные факторы, которые могут блокировать доступ:
USR1CV8 есть полные права на папку C:\Windows\Temp и на свою папку профиля. Часто 1С не может прочитать файл, потому что не может создать его временную копию.rphost.exe.Подводя итог, можно сказать: наиболее стабильным и правильным с точки зрения разработки решением является использование Временного хранилища. Это избавляет администраторов от лишней настройки прав и делает систему более защищенной. Однако, если архитектура требует прямой работы сервера с сетевым диском, использование идентичных учетных записей (сквозная аутентификация) остается единственным надежным способом в простых сетях.