Часто разработчики 1С сталкиваются с ситуацией, когда процедура, успешно работающая на клиенте, падает с ошибкой «Ошибка доступа к файлу» при переносе в общий серверный модуль. Давайте разберемся, почему это происходит и как исправить эту проблему совместными усилиями.
Основная причина кроется в контексте выполнения вашего кода. Когда вы запускаете обработку вручную в 1С:Предприятии, код выполняется от имени того пользователя Windows, под которым открыт клиент. Этот пользователь авторизован в сети, имеет права на сетевые папки, и Windows «передает» эти права при обращении к ресурсу.
Когда же процедура выполняется в общем модуле на сервере (с галками Сервер, Вызов сервера), код исполняется процессом rphost.exe. Этот процесс запускается службой 1C:Enterprise Server Agent. По умолчанию данная служба работает под учетной записью LocalSystem (Локальная система). Это системная запись, которая не имеет прав доступа к сетевым ресурсам других компьютеров в локальной сети, так как у нее нет пароля для авторизации в домене или рабочей группе.
Важно понимать: даже если вы заходите через Проводник под своей учетной записью и видите папку, сервер 1С этого не видит. Проводник — это интерактивное приложение вашего пользователя, а служба 1С — это фоновый системный процесс.
Чтобы предоставить серверу 1С доступ к сетевым ресурсам, необходимо изменить учетную запись, от имени которой запущена служба 1C:Enterprise Server Agent. Рассмотрим этот процесс по шагам:
services.msc).1C:Enterprise Server Agent, нажмите правой кнопкой мыши — Свойства.Важное примечание: выбранный пользователь должен обладать правом Log on as a service (Вход в качестве службы) на сервере 1С. Также убедитесь, что у него есть права на локальные папки сервера, где хранятся базы, srvinfo (журнал регистрации) и временные файлы, иначе сервер может не запуститься.
Если смена пользователя службы невозможна, можно попробовать примонтировать сетевой ресурс как локальный диск от имени той же учетной записи, под которой работает служба 1С. Это делается с помощью команды net use.
Рассмотрим, как можно автоматизировать подключение:
// Пример команды для командной строки:
net use Z: \\192.168.0.1\Папка /user:ИмяПользователя Пароль /persistent:yes
После выполнения этой команды система «запомнит» подключение. Однако помните, что сетевые диски, подключенные в сеансе одного пользователя, обычно не видны другому. Поэтому выполнение этой команды должно производиться в контексте той же SYSTEM или той учетной записи, которая запускает службу 1С. Для этого иногда используют планировщик заданий, настроенный на запуск при старте системы от имени нужной учетной записи.
Многие пытаются решить проблему, предоставив права пользователю СИСТЕМА (SYSTEM) на компьютере с общей папкой. Это не сработает. Пользователь SYSTEM является локальным для конкретной машины и не может авторизоваться на другом компьютере. Кроме того, попытка открытия сетевого доступа для учетной записи SYSTEM является грубым нарушением правил безопасности вашей IT-инфраструктуры.
Проводнике с правами доступа системной службы.\\server\share) в коде 1С, избегая привязки к буквам дисков, так как буквы дисков могут быть не определены для контекста службы сервера 1С.Применяя данные методы, вы сможете успешно организовать взаимодействие 1С с сетевыми хранилищами, обеспечив безопасность и стабильность работы ваших процедур.