При работе в клиент-серверном варианте 1С:Предприятие разработчики и администраторы часто сталкиваются с классической проблемой: внешне простой код, который отлично работает при запуске на клиенте, в интерактивном режиме выдает критическую ошибку при переносе его выполнения в фоновое или регламентное задание. Наиболее типичный симптом — ошибка вида "Ошибка при вызове метода контекста (Записать)" при попытке сохранить созданный текстовый документ, отчет или файл выгрузки в сетевую папку по пути вида \\192.168.1.1\Temp\1.txt. При этом запись на локальный диск сервера (например, C:\Temp\1.txt) проходит без каких-либо затруднений.
В этой статье мы подробно разберем, почему возникает данная ошибка, развенчаем популярные мифы о сетевых дисках в контексте служб Windows, а также предоставим пошаговую инструкцию по правильной настройке прав доступа для успешной работы фоновых заданий с сетевым окружением.
Прежде чем переходить к настройке прав, давайте проанализируем, в чем заключается принципиальная разница между интерактивным запуском кода и его выполнением в рамках фонового задания:
ragent). Учетная запись текущего пользователя 1С при этом не играет никакой роли для операционной системы.Таким образом, если служба сервера 1С работает под локальной учетной записью (например, стандартной USR1CV8), у нее по умолчанию нет и не может быть прав доступа к сетевым ресурсам других компьютеров в локальной сети.
Иногда администраторы пытаются решить проблему «обходным путем»: монтируют на сервере сетевой ресурс как диск (например, связывают \\192.168.1.1\Temp с буквой Z:) и указывают в коде путь Z:\1.txt. В некоторых случаях им кажется, что это сработало, однако такой подход является опасным заблуждением.
Выясним причину, почему сетевые диски с буквами не подходят для серверного кода:
Session 0. Пользовательские сетевые диски, смонтированные администратором через RDP-сессию, создаются в сеансах пользователей (Session 1, Session 2 и т.д.) и для службы в Session 0 абсолютно невидимы.Важное правило: При программировании фоновых заданий, работающих с сетевым окружением, всегда используйте исключительно UNC-пути формата \\ИмяСервера\ИмяШары\ИмяФайла.расширение.
Наиболее надежный и правильный с точки зрения безопасности способ предоставить серверу 1С доступ к сети — запустить его службу от имени специально созданной доменной учетной записи Active Directory.
Рассмотрим этот процесс по шагам:
Шаг 1. Создание учетной записи в домене.
Создайте в Active Directory выделенного пользователя, например, domain_1c_service. Задайте для него сложный пароль с неограниченным сроком действия.
Шаг 2. Настройка локальных прав на сервере 1С.
Для того чтобы служба сервера 1С смогла успешно запуститься под новой учетной записью, на самом сервере приложений 1С необходимо предоставить этой записи следующие права:
secpol.msc).domain_1c_service.C:\Program Files\1cv8\srvinfo или C:\ProgramData\1C). Без этого служба 1С не сможет создавать файлы журнала регистрации и упадет при запуске.Шаг 3. Смена пользователя службы.
Откройте оснастку «Службы» (services.msc), найдите службу Агент сервера 1С:Предприятия, зайдите в ее свойства на вкладку «Вход в систему», выберите «С учетной записью» и укажите вашего доменного пользователя domain_1c_service и пароль. Перезапустите службу.
Шаг 4. Настройка прав на целевой сетевой папке.
На компьютере или файловом сервере, где физически расположена сетевая папка (в нашем примере это 192.168.1.1), необходимо настроить права доступа для учетной записи domain_1c_service на двух уровнях одновременно:
domain_1c_service и установите флаг «Изменение» или «Полный доступ».domain_1c_service и предоставьте ему права «Запись» и «Модификация» (Modify).Если служба сервера 1С запущена под системной учетной записью Network Service (Сетевая служба) или Local System, и у вас нет возможности использовать выделенного доменного пользователя, задачу все равно можно решить в рамках доменной сети Active Directory.
В домене Windows любая локальная служба, выходящая за пределы своего сервера в сеть, представляется учетной записью самого компьютера в AD. Эта учетная запись имеет вид ИМЯ_ДОМЕНА\ИМЯ_КОМПЬЮТЕРА_СЕРВЕРА_1С$ (символ доллара на конце обязателен).
Разберем, как предоставить права учетной записи компьютера:
Server1C$).Бывают ситуации, когда на уровне операционной системы все права настроены безупречно, однако платформа 1С все равно блокирует запись сетевого файла из фонового задания с той же ошибкой контекста. Виной этому может быть включенный Безопасный режим выполнения кода.
Если фоновое задание запускается из расширения конфигурации, внешней обработки или механизма дополнительных отчетов и обработок, платформа по умолчанию накладывает жесткие ограничения на использование файловой системы. В безопасном режиме разрешена работа только с временными файлами в специально отведенных локальных каталогах.
Для устранения этой проблемы выполните следующие действия:
БезопасныйРежим при программном вызове имеет значение Ложь.Для того чтобы локализовать проблему и убедиться, что серверная часть 1С имеет доступ к сетевому каталогу, создадим простую тестовую обработку. Разместим в ней кнопку, вызывающую серверную процедуру для записи проверочного файла:
&НаСервере
Процедура ПроверитьДоступКСетевойПапкеНаСервере()
СетевойПуть = "\\192.168.1.1\Temp\test_1c_connection.txt";
ТекстДокумента = Новый ТекстовыйДокумент;
ТекстДокумента.УстановитьТекст("Тестовая запись из контекста сервера 1С:Предприятие. Время: " + ТекущаяДата());
Попытка
// Пытаемся записать файл по UNC-пути напрямую с сервера
ТекстДокумента.Записать(СетевойПуть, КодировкаТекста.UTF8);
Сообщить("Успешно! Сервер 1С имеет полный доступ на запись в каталог: " + СетевойПуть);
Исключение
// Ловим ошибку и выводим детальное системное описание
ВызватьИсключение "Не удалось записать файл на сервере. Причина: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
Запуск этой процедуры из серверного контекста сразу покажет, корректно ли применились права операционной системы для службы сервера 1С после внесения изменений в настройки учетных записей.