Почему фоновое задание в 1С не может записать файл в сетевую папку и как это исправить

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в клиент-серверном варианте 1С:Предприятие разработчики и администраторы часто сталкиваются с классической проблемой: внешне простой код, который отлично работает при запуске на клиенте, в интерактивном режиме выдает критическую ошибку при переносе его выполнения в фоновое или регламентное задание. Наиболее типичный симптом — ошибка вида "Ошибка при вызове метода контекста (Записать)" при попытке сохранить созданный текстовый документ, отчет или файл выгрузки в сетевую папку по пути вида \\192.168.1.1\Temp\1.txt. При этом запись на локальный диск сервера (например, C:\Temp\1.txt) проходит без каких-либо затруднений.

В этой статье мы подробно разберем, почему возникает данная ошибка, развенчаем популярные мифы о сетевых дисках в контексте служб Windows, а также предоставим пошаговую инструкцию по правильной настройке прав доступа для успешной работы фоновых заданий с сетевым окружением.

Понимание контекста выполнения: Клиент vs Сервер

Прежде чем переходить к настройке прав, давайте проанализируем, в чем заключается принципиальная разница между интерактивным запуском кода и его выполнением в рамках фонового задания:

  1. Интерактивный запуск (на клиенте): Когда пользователь запускает обработку вручную через тонкий или толстый клиент, все операции с файловой системой выполняются в контексте текущей сессии Windows этого пользователя. Если у пользователя есть доступ к сетевой папке, платформа 1С беспрепятственно записывает туда файл.
  2. Фоновое или регламентное задание (на сервере): Любое фоновое задание выполняется непосредственно на стороне сервера 1С:Предприятие. Вся работа происходит в контексте операционной системы сервера и под учетной записью, от имени которой запущена служба сервера 1С (обычно это служба ragent). Учетная запись текущего пользователя 1С при этом не играет никакой роли для операционной системы.

Таким образом, если служба сервера 1С работает под локальной учетной записью (например, стандартной USR1CV8), у нее по умолчанию нет и не может быть прав доступа к сетевым ресурсам других компьютеров в локальной сети.

Развенчиваем миф о сетевом диске Z: и изоляции сессий

Иногда администраторы пытаются решить проблему «обходным путем»: монтируют на сервере сетевой ресурс как диск (например, связывают \\192.168.1.1\Temp с буквой Z:) и указывают в коде путь Z:\1.txt. В некоторых случаях им кажется, что это сработало, однако такой подход является опасным заблуждением.

Выясним причину, почему сетевые диски с буквами не подходят для серверного кода:

Важное правило: При программировании фоновых заданий, работающих с сетевым окружением, всегда используйте исключительно UNC-пути формата \\ИмяСервера\ИмяШары\ИмяФайла.расширение.

Вариант решения №1: Настройка службы 1С под доменной учетной записью (Рекомендуемый способ)

Наиболее надежный и правильный с точки зрения безопасности способ предоставить серверу 1С доступ к сети — запустить его службу от имени специально созданной доменной учетной записи Active Directory.

Рассмотрим этот процесс по шагам:

Шаг 1. Создание учетной записи в домене.

Создайте в Active Directory выделенного пользователя, например, domain_1c_service. Задайте для него сложный пароль с неограниченным сроком действия.

Шаг 2. Настройка локальных прав на сервере 1С.

Для того чтобы служба сервера 1С смогла успешно запуститься под новой учетной записью, на самом сервере приложений 1С необходимо предоставить этой записи следующие права:

  1. Откройте консоль Локальной политики безопасности (выполните команду secpol.msc).
  2. Перейдите в раздел: Локальные политики -> Назначение прав пользователя.
  3. Найдите политику Вход в качестве службы (Log on as a service) и добавьте туда созданного пользователя domain_1c_service.
  4. Предоставьте пользователю полный доступ (на уровне NTFS) к каталогу служебных файлов сервера 1С (по умолчанию это C:\Program Files\1cv8\srvinfo или C:\ProgramData\1C). Без этого служба 1С не сможет создавать файлы журнала регистрации и упадет при запуске.

Шаг 3. Смена пользователя службы.

Откройте оснастку «Службы» (services.msc), найдите службу Агент сервера 1С:Предприятия, зайдите в ее свойства на вкладку «Вход в систему», выберите «С учетной записью» и укажите вашего доменного пользователя domain_1c_service и пароль. Перезапустите службу.

Шаг 4. Настройка прав на целевой сетевой папке.

На компьютере или файловом сервере, где физически расположена сетевая папка (в нашем примере это 192.168.1.1), необходимо настроить права доступа для учетной записи domain_1c_service на двух уровнях одновременно:

  1. Права общего доступа (Share Permissions): Нажмите правой кнопкой на папку -> Свойства -> Доступ -> Расширенная настройка общего доступа -> Разрешения. Добавьте пользователя domain_1c_service и установите флаг «Изменение» или «Полный доступ».
  2. Права файловой системы (NTFS Permissions): Перейдите на вкладку «Безопасность» свойств папки. Нажмите «Изменить», добавьте пользователя domain_1c_service и предоставьте ему права «Запись» и «Модификация» (Modify).

Вариант решения №2: Использование учетной записи компьютера (для Network Service)

Если служба сервера 1С запущена под системной учетной записью Network Service (Сетевая служба) или Local System, и у вас нет возможности использовать выделенного доменного пользователя, задачу все равно можно решить в рамках доменной сети Active Directory.

В домене Windows любая локальная служба, выходящая за пределы своего сервера в сеть, представляется учетной записью самого компьютера в AD. Эта учетная запись имеет вид ИМЯ_ДОМЕНА\ИМЯ_КОМПЬЮТЕРА_СЕРВЕРА_1С$ (символ доллара на конце обязателен).

Разберем, как предоставить права учетной записи компьютера:

  1. На целевом файловом сервере откройте свойства общей сетевой папки.
  2. В окне выбора пользователей для настройки прав общего доступа (Share) и безопасности (NTFS) нажмите кнопку «Типы объектов» (Object Types).
  3. Убедитесь, что установлен флажок напротив пункта Компьютеры (Computers), так как по умолчанию Windows ищет только пользователей и группы.
  4. В поле поиска введите имя сервера, на котором крутится служба 1С (например, Server1C$).
  5. Предоставьте найденной учетной записи компьютера права на чтение и запись (как на уровне общего доступа, так и на уровне NTFS).

Вариант решения №3: Проверка ограничений безопасного режима 1С

Бывают ситуации, когда на уровне операционной системы все права настроены безупречно, однако платформа 1С все равно блокирует запись сетевого файла из фонового задания с той же ошибкой контекста. Виной этому может быть включенный Безопасный режим выполнения кода.

Если фоновое задание запускается из расширения конфигурации, внешней обработки или механизма дополнительных отчетов и обработок, платформа по умолчанию накладывает жесткие ограничения на использование файловой системы. В безопасном режиме разрешена работа только с временными файлами в специально отведенных локальных каталогах.

Для устранения этой проблемы выполните следующие действия:

Пример кода для проверки прав доступа на сервере

Для того чтобы локализовать проблему и убедиться, что серверная часть 1С имеет доступ к сетевому каталогу, создадим простую тестовую обработку. Разместим в ней кнопку, вызывающую серверную процедуру для записи проверочного файла:


&НаСервере
Процедура ПроверитьДоступКСетевойПапкеНаСервере()
    
    СетевойПуть = "\\192.168.1.1\Temp\test_1c_connection.txt";
    ТекстДокумента = Новый ТекстовыйДокумент;
    ТекстДокумента.УстановитьТекст("Тестовая запись из контекста сервера 1С:Предприятие. Время: " + ТекущаяДата());
    
    Попытка
        // Пытаемся записать файл по UNC-пути напрямую с сервера
        ТекстДокумента.Записать(СетевойПуть, КодировкаТекста.UTF8);
        Сообщить("Успешно! Сервер 1С имеет полный доступ на запись в каталог: " + СетевойПуть);
    Исключение
        // Ловим ошибку и выводим детальное системное описание
        ВызватьИсключение "Не удалось записать файл на сервере. Причина: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
КонецПроцедуры

Запуск этой процедуры из серверного контекста сразу покажет, корректно ли применились права операционной системы для службы сервера 1С после внесения изменений в настройки учетных записей.

← На главную