Проблема доступа фоновых заданий к сетевым ресурсам — одна из классических задач, с которой сталкиваются разработчики и системные администраторы при настройке серверов 1С. Ситуация часто осложняется тем, что при интерактивном входе (через проводник Windows) папка доступна, а при выполнении того же кода в фоновом задании система выдает ошибку "Каталог не существует" или "Доступ запрещен". Разберем подробно, почему это происходит и как решить данную проблему несколькими способами.
Основная причина кроется в контексте безопасности, в котором выполняется код. Когда вы открываете папку вручную, вы используете свою доменную или локальную учетную запись. Фоновое же задание выполняется сервером 1С:Предприятие, который по умолчанию часто устанавливается под системной учетной записью LocalSystem (или NT AUTHORITY\SYSTEM).
Рассмотрим ключевые технические нюансы:
Z:, который вы видите в "Моем компьютере", для службы не существует).LocalSystem не имеет прав доступа к сетевым ресурсам в домене, так как она ограничена локальным компьютером. При попытке обращения к сети она представляется как компьютерный аккаунт (например, DOMAIN\SERVERNAME$), которому обычно не дают прав на общие папки.Если у вас нет возможности перенастроить службу сервера 1С на доменного пользователя (например, из-за политик безопасности), можно временно подключать сетевой ресурс прямо из кода 1С, передавая логин и пароль явно. Для этого мы будем использовать COM-объекты WScript.Network.
Рассмотрим пример кода, который позволяет подключить сетевой диск, выполнить необходимые действия и корректно отключить его:
// Создаем объекты для работы с сетью и файловой системой
Network = Новый COMОбъект("WScript.Network");
FileSys = Новый COMОбъект("Scripting.FileSystemObject");
ИмяДиска = "Z:";
СетевойПуть = "\\ServerName\SharedFolder";
Логин = "Domain\techman";
Пароль = "YourPassword";
Попытка
// Проверяем, не занята ли буква диска, и если да — удаляем старое подключение
Если FileSys.DriveExists(ИмяДиска) Тогда
Network.RemoveNetworkDrive(ИмяДиска, Истина, Истина);
КонецЕсли;
// Подключаем диск с передачей явных учетных данных
// Параметры: ИмяДиска, Путь, СохранятьПодключение(Ложь), Логин, Пароль
Network.MapNetworkDrive(ИмяДиска, СетевойПуть, Ложь, Логин, Пароль);
// Теперь можем работать с файлами через стандартный объект "Файл"
КаталогНаДиске = Новый Файл(ИмяДиска + "\");
Если КаталогНаДиске.Существует() Тогда
// Выполняем действия с файлами
// ...
КонецЕсли;
// Важно: отключаем диск после завершения работы
Network.RemoveNetworkDrive(ИмяДиска, Истина, Истина);
Исключение
ЗаписьЖурналаРегистрации("Ошибка доступа к сети", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Обратите внимание: При использовании метода RemoveNetworkDrive рекомендуется передавать второй и третий параметры как Истина. Это гарантирует принудительное отключение, даже если файлы открыты, и удаление информации из профиля пользователя.
Это самый правильный и надежный способ с точки зрения администрирования. Вместо того чтобы прописывать пароли в коде (что небезопасно), мы заставим саму службу 1С "представляться" в сети конкретным пользователем.
Разберем этот процесс по шагам:
usr1cv8_service).C:\Program Files\1cv8\srvinfo).После этого код КаталогНаДиске.Существует() для пути вида \\Server\Folder будет возвращать Истина без каких-либо дополнительных манипуляций с дисками.
Если домен отсутствует или серверы находятся в разных рабочих группах, можно применить метод "зеркальных" учетных записей. Выясним, как это работает:
На Сервере А (где 1С) и на Сервере Б (где папка) создаются локальные пользователи с абсолютно одинаковыми именами и паролями. Если служба 1С на Сервере А работает под этим пользователем, то при обращении к Серверу Б система Windows попробует авторизоваться под теми же данными. Если они совпадут, доступ будет предоставлен. Это часто выручает в простых сетевых окружениях.
Проанализируем еще несколько важных моментов, которые помогут избежать ошибок:
Использование UNC-путей: Старайтесь всегда использовать пути вида \\Server\Share\File.txt вместо обращений к буквам дисков (Z:\File.txt). Буквы дисков — это виртуальные сущности пользовательского интерфейса, и в контексте серверных процессов они крайне нестабильны. Даже если вы подключили диск через WScript.Network, работа по прямому пути считается более надежной.
Права доступа к Share vs NTFS: Проверьте, что права даны в двух местах. Часто разработчики забывают про вкладку "Доступ" (Share Permissions), ограничиваясь только вкладкой "Безопасность" (NTFS). Для работы фонового задания доступ должен быть разрешен в обоих окнах свойств папки.
Кэширование прав: Помните, что Windows кэширует данные об авторизации. Если вы изменили права доступа или сменили пароль учетной записи, под которой работает служба, может потребоваться перезагрузка сервера 1С или принудительная очистка сессий на файловом сервере через команду net sessions /delete.
Выясним, какой метод подходит вам: если нужна быстрая правка "здесь и сейчас" — используйте программный маппинг из Способа 1. Если вы строите стабильную систему — настаивайте на реализации Способа 2 через доменную учетную запись.