Как исправить ошибку создания XML-файла на сетевом диске при выполнении регламентного задания в 1С?

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

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

Суть проблемы и анализ исходного кода

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


Каталог = "\\192.168.1.9\Public\Розница\ФайлыДляСопоставленияЦен\";
ФайлСтраницы = Каталог + ИмяФайла + ".xml";

Запись = Новый ЗаписьXML;
Попытка
    Запись.ОткрытьФайл(ФайлСтраницы);
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, 
        "Ошибка создания файла: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

Запись.ЗаписатьНачалоЭлемента("Данные");
Запись.ЗаписатьНачалоЭлемента("Строка");
Запись.ЗаписатьАтрибут("ТекущаяСтрока", СокрЛП(" " + Счетчик));
Запись.ЗаписатьКонецЭлемента; // Строка
Запись.ЗаписатьКонецЭлемента; // Данные
Запись.Закрыть();

При интерактивном запуске под пользователем в тонком или толстом клиенте код выполняется без ошибок. Однако при старте этого же кода в рамках регламентного задания метод Запись.ОткрытьФайл(ФайлСтраницы) вызывает сбой:

«Ошибка при вызове метода контекста (ОткрытьФайл): Ошибка при выполнении файловой операции '\\192.168.1.9\Public\Розница\ФайлыДляСопоставленияЦен\Файл.xml'»

Главное заблуждение: «Нужно просто подключить сетевой диск»

В конце обсуждения автор темы пришел к выводу: «к серверу не был подключен сетевой диск, поэтому и не находил такой путь». Это критическое заблуждение!

Подключение сетевого диска (например, как диска Z:\) в интерактивном сеансе администратора на сервере не решит проблему для регламентных заданий на постоянной основе. Операционная система Windows изолирует сетевые диски в контексте конкретного пользовательского сеанса. Служба сервера 1С (Агент сервера 1С:Предприятия), работающая в фоновом режиме, физически не может получить доступ к дискам, смонтированным пользователями.

Использование UNC-путей (вида \\192.168.1.9\Public\...) — это единственный правильный способ обращения к сетевым ресурсам из кода 1С. Но для работы этого способа необходимо правильно настроить права учетных записей операционной системы.

Почему возникает ошибка: разница контекстов выполнения

Выясним истинную причину блокировки записи:

  1. При работе клиента: файловые операции выполняются от имени текущего доменного или локального пользователя Windows, под которым запущен компьютер. У этого пользователя есть физический доступ к сетевой папке \\192.168.1.9\Public\, поэтому файл успешно создается.
  2. При работе регламентного задания: код выполняется на стороне сервера приложений 1С. Операционная система осуществляет файловые операции от имени учетной записи, под которой запущена служба сервера 1С (по умолчанию это локальный пользователь USR1CV8). Так как это локальный пользователь сервера, удаленный компьютер 192.168.1.9 отклоняет попытку авторизации. Права пользователя внутри базы данных 1С (даже роли «Полные права») не имеют никакого значения для файловой системы Windows.

---

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

Если в вашей организации развернут домен Active Directory, этот способ является наиболее надежным, безопасным и простым в обслуживании.

Проанализируем шаги по его реализации:

  1. Создайте в домене специальную служебную учетную запись без истекающего срока действия пароля (например, DOMAIN\usr-1c-service).
  2. На сервере, где установлен сервер приложений 1С, откройте оснастку «Службы» (нажмите Win + R, введите services.msc).
  3. Найдите службу Агент сервера 1С:Предприятия (или 1C:Enterprise 8.3 Server Agent), нажмите по ней правой кнопкой мыши и выберите «Свойства».
  4. Перейдите на вкладку «Вход в систему», переключите флажок в положение «С учетной записью» и укажите созданного доменного пользователя DOMAIN\usr-1c-service и его пароль.
  5. Предоставьте этому пользователю права на чтение и запись в локальную папку с кэшем сервера (обычно это C:\Program Files\1cv8\srvinfo), иначе служба сервера не сможет запуститься.
  6. Перезапустите службу сервера 1С.
  7. На удаленном компьютере 192.168.1.9 в свойствах общего доступа сетевой папки и во вкладке «Безопасность» (NTFS) добавьте пользователя DOMAIN\usr-1c-service и назначьте ему права «Изменение», «Чтение» и «Запись».

Вариант Б: Синхронизация локальных пользователей (Для одноранговых сетей)

Если в вашей ИТ-инфраструктуре нет домена Active Directory, авторизация между рабочими станциями строится на принципе совпадения локальных учетных записей.

Разберем алгоритм действий:

  1. Выясните точное имя локального пользователя, под которым запускается служба 1С на сервере (например, по умолчанию это USR1CV8). Узнайте его точный пароль.
  2. На удаленном компьютере 192.168.1.9 (где находится сетевой ресурс) создайте точно такого же локального пользователя с именем USR1CV8 и установите ему абсолютно такой же пароль, как на сервере 1С.
  3. В свойствах сетевой папки \\192.168.1.9\Public\ предоставьте права на чтение и запись созданному пользователю USR1CV8.
  4. При попытке сетевого обращения сервер Windows автоматически сопоставит переданные сервером 1С учетные данные с локальной учетной записью, и доступ будет предоставлен.

Вариант В: Сохранение авторизационных данных через Диспетчер учетных данных

Если изменение учетной записи службы сервера 1С нежелательно, вы можете сохранить сетевые реквизиты доступа непосредственно в профиле системной учетной записи Windows.

Выполним следующие шаги:

  1. Разрешите пользователю USR1CV8 интерактивный вход на сервер 1С (через локальные политики безопасности secpol.msc -> Локальные политики -> Назначение прав пользователя -> удалите учетную запись из правила «Запретить локальный вход»).
  2. Зайдите на рабочий стол сервера 1С по RDP под учетной записью USR1CV8.
  3. Откройте Проводник и в адресной строке введите UNC-путь к сетевой папке: \\192.168.1.9\Public\.
  4. В появившемся окне авторизации введите логин и пароль пользователя, у которого есть права на запись в эту папку. Обязательно установите флажок «Запомнить учетные данные».
  5. Убедитесь, что вы можете создавать файлы в этой папке из проводника под сессией USR1CV8.
  6. Выйдите из учетной записи. Верните обратно запрет локального входа для безопасности. Теперь Windows будет автоматически подставлять сохраненные учетные данные при фоновых запросах службы 1С.

Вариант Г: Архитектурный обход через временные файлы

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

Рассмотрим пример кода, реализующий этот подход:


// Шаг 1: Создаем файл в гарантированно доступной локальной временной папке сервера
ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла + ".xml";

Запись = Новый ЗаписьXML;
Попытка
    Запись.ОткрытьФайл(ИмяВременногоФайла);
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, 
        "Не удалось создать локальный временный файл: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    Возврат;
КонецПопытки;

// Записываем данные в XML
Запись.ЗаписатьНачалоЭлемента("Данные");
Запись.ЗаписатьНачалоЭлемента("Строка");
Запись.ЗаписатьАтрибут("ТекущаяСтрока", СокрЛП(" " + Счетчик));
Запись.ЗаписатьКонецЭлемента;
Запись.ЗаписатьКонецЭлемента;
Запись.Закрыть();

// Шаг 2: Переносим готовый файл на удаленный ресурс
КаталогНазначения = "\\192.168.1.9\Public\Розница\ФайлыДляСопоставленияЦен\";
ФайлНазначения = КаталогНазначения + ИмяФайла + ".xml";

Попытка
    // КопироватьФайл выполнит операцию под учетной записью службы сервера 1С
    КопироватьФайл(ИмяВременногоФайла, ФайлНазначения);
    // Удаляем временный файл после успешного копирования
    УдалитьФайлы(ИмяВременногоФайла);
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Предупреждение,,, 
        "Файл создан локально, но не скопирован на сетевой ресурс: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Для еще большей надежности вместо копирования средствами ОС Windows можно использовать протоколы передачи файлов, которые поддерживают явную передачу авторизации в коде 1С, например FTP или SFTP:


Попытка
    // Параметры: Сервер, Порт, Пользователь, Пароль
    Соединение = Новый FTPСоединение("192.168.1.9", 21, "ЛогинОбмена", "ПарольОбмена");
    Соединение.УстановитьТекущийКаталог("/Public/Розница/ФайлыДляСопоставленияЦен/");
    Соединение.Записать(ИмяВременногоФайла, ИмяФайла + ".xml");
    УдалитьФайлы(ИмяВременногоФайла);
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, 
        "Ошибка передачи файла по FTP: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Важное предупреждение по безопасности ИТ-инфраструктуры

На форумах часто встречаются два вредных совета:

Ни в коем случае не делайте этого! Доступ для группы «Все» открывает двери для вирусов-шифровальщиков, которые могут уничтожить ваши файлы. Запуск службы 1С под Администратором Домена создает критическую уязвимость: в случае выполнения вредоносного кода через внешнюю обработку злоумышленник моментально получит полный контроль над всеми серверами вашей компании.

← На главную