При разработке и администрировании систем на базе 1С:Предприятие часто возникает задача организации доступа к файлам, расположенным не на локальном диске сервера приложений, а в сетевой папке на другом компьютере. Обычный пользователь открывает такую папку через проводник без проблем, однако серверная часть 1С, работающая как служба Windows, часто сталкивается с ошибками доступа. В этой статье мы подробно разберем, почему это происходит, и как правильно «подружить» сервер 1С с сетевыми ресурсами. В качестве альтернативы для передачи файлов по сети можно использовать инструмент для обмена данными между базами 1С и внешними приложениями.
Для начала проанализируем ситуацию с точки зрения операционной системы. Когда вы заходите в Windows под своей учетной записью, вы создаете интерактивный сеанс. В этом сеансе вам доступны подключенные сетевые диски (например, Z:) и права вашего пользователя. Агент сервера 1С:Предприятие — это служба, которая запускается в фоновом режиме (обычно в «сессии 0»). У этой службы нет своих подключенных дисков, и она обладает правами только того пользователя, который указан в настройках службы.
Чаще всего служба запускается от имени специального локального пользователя USR1CV8. Этот пользователь является локальным для того сервера, где установлена 1С, и «ничего не знает» о ресурсах в сети. Именно поэтому простое копирование пути из проводника в код 1С часто не дает результата.
Прежде чем настраивать доступы, нам необходимо выяснить, от чьего имени работает сервер. Рассмотрим, как это сделать:
Win+R и введите services.msc).Здесь вы увидите конкретного пользователя. Чаще всего это .\USR1CV8. Запомните это имя, именно ему мы будем давать права доступа к сетевой папке.
Выясним важную техническую деталь: служба сервера 1С никогда не увидит диск Z:, даже если вы подключили его в своем сеансе. Для сервера таких дисков не существует. Поэтому в коде 1С мы должны использовать только UNC-пути (Universal Naming Convention).
Вместо пути Z:\Files\report.xlsx всегда используйте формат:
\\ИмяКомпьютера\ИмяПапки\report.xlsx
Проанализируем пример кода, который будет корректно работать на стороне сервера:
ПутьКФайлу = "\\Server-Data\Exchange\Export\data.xml";
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
// Продолжаем работу с файлом
Сообщить("Файл успешно найден сервером");
Иначе
// Обработка ошибки доступа
Сообщить("Файл не найден. Проверьте права доступа пользователя службы 1С.");
КонецЕсли;
Ситуация осложняется, если ваша сеть работает без контроллера домена. В доменной сети мы бы просто добавили доменного пользователя в права папки. В рабочей группе компьютер с папкой «не знает» о существовании пользователя USR1CV8 на другом сервере.
Рассмотрим проверенный метод решения — создание одноименных учетных записей:
USR1CV8 пароль Pass123, то и на компьютере с папкой создаем USR1CV8 с паролем Pass123.Теперь, когда сервер 1С попытается обратиться к папке \\Comp-1\Share, он передаст свои учетные данные. Удаленный компьютер увидит, что к нему «стучится» пользователь с известным ему именем и верным паролем, и разрешит вход.
Часто права настраивают только в одном месте, что является ошибкой. Разберем, где именно нужно проставить «галочки»:
1. Вкладка «Общий доступ» (Share Permissions):
Нажмите правой кнопкой на папку — «Свойства» — «Общий доступ» — «Расширенная настройка общего доступа» — «Разрешения». Добавьте сюда созданного пользователя (или группу «Все», если это допустимо политикой безопасности) и установите права на «Изменение» и «Чтение».
2. Вкладка «Безопасность» (NTFS Permissions):
В тех же свойствах папки перейдите на вкладку «Безопасность». Нажмите «Изменить» — «Добавить». Введите имя пользователя USR1CV8. Установите флажки на пунктах «Чтение», «Запись», «Список содержимого папки» и «Изменение».
Помните: Итоговые права доступа — это пересечение прав общего доступа и прав NTFS. Если в одном месте разрешено чтение, а в другом — полный доступ, у пользователя будет только право на чтение.
Иногда внешние компоненты или старый код 1С категорически требуют «локального» пути и не умеют работать с сетевыми адресами \\server\.... В этом случае мы можем обмануть систему, создав символическую ссылку на директорию.
Рассмотрим, как создать такую ссылку через командную строку (запущенную от имени администратора):
mklink /d C:\NetworkData \\RemoteServer\ShareFolder
После выполнения этой команды на диске C: появится папка NetworkData. Для 1С она будет выглядеть как обычная локальная папка, но при обращении к ней данные будут прозрачно для системы уходить в сеть. Это элегантное решение многих проблем совместимости.
Если настроить права на уровне операционной системы по каким-то причинам невозможно, проанализируем программный метод «подключения» ресурса непосредственно из кода 1С. Мы можем использовать COM-объект WScript.Network для временной авторизации под конкретными учетными данными.
Посмотрим на пример функции для подключения сетевого ресурса:
Процедура ПодключитьСетевойРесурс(ПутьКРесурсу, Логин, Пароль)
Попытка
Network = Новый COMОбъект("WScript.Network");
// Пытаемся подключить ресурс без назначения буквы диска
// Параметры: ИмяДиска (пусто), Путь, СохранятьСвязь, Пользователь, Пароль
Network.MapNetworkDrive("", ПутьКРесурсу, Ложь, Логин, Пароль);
Исключение
ЗаписьЖурналаРегистрации("Доступ к папке", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось авторизоваться в папке: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот метод создаст временную сессию доступа между сервером 1С и удаленным компьютером. После этого стандартные команды работы с файлами начнут выполняться без ошибок доступа.
Если после всех настроек доступ не появился, проанализируем следующие моменты:
Используя эти методы в комплексе, вы сможете обеспечить надежную и стабильную работу 1С с любыми сетевыми ресурсами, независимо от сложности вашей сетевой инфраструктуры. Для интерактивной проверки серверных каталогов и передачи данных подойдёт файловый менеджер для обмена файлами между клиентом и сервером.