Каждый разработчик 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С. Но для работы этого способа необходимо правильно настроить права учетных записей операционной системы.
Выясним истинную причину блокировки записи:
\\192.168.1.9\Public\, поэтому файл успешно создается.USR1CV8). Так как это локальный пользователь сервера, удаленный компьютер 192.168.1.9 отклоняет попытку авторизации. Права пользователя внутри базы данных 1С (даже роли «Полные права») не имеют никакого значения для файловой системы Windows.---
Если в вашей организации развернут домен Active Directory, этот способ является наиболее надежным, безопасным и простым в обслуживании.
Проанализируем шаги по его реализации:
DOMAIN\usr-1c-service).Win + R, введите services.msc).1C:Enterprise 8.3 Server Agent), нажмите по ней правой кнопкой мыши и выберите «Свойства».DOMAIN\usr-1c-service и его пароль.C:\Program Files\1cv8\srvinfo), иначе служба сервера не сможет запуститься.192.168.1.9 в свойствах общего доступа сетевой папки и во вкладке «Безопасность» (NTFS) добавьте пользователя DOMAIN\usr-1c-service и назначьте ему права «Изменение», «Чтение» и «Запись».Если в вашей ИТ-инфраструктуре нет домена Active Directory, авторизация между рабочими станциями строится на принципе совпадения локальных учетных записей.
Разберем алгоритм действий:
USR1CV8). Узнайте его точный пароль.192.168.1.9 (где находится сетевой ресурс) создайте точно такого же локального пользователя с именем USR1CV8 и установите ему абсолютно такой же пароль, как на сервере 1С.\\192.168.1.9\Public\ предоставьте права на чтение и запись созданному пользователю USR1CV8.Если изменение учетной записи службы сервера 1С нежелательно, вы можете сохранить сетевые реквизиты доступа непосредственно в профиле системной учетной записи Windows.
Выполним следующие шаги:
USR1CV8 интерактивный вход на сервер 1С (через локальные политики безопасности secpol.msc -> Локальные политики -> Назначение прав пользователя -> удалите учетную запись из правила «Запретить локальный вход»).USR1CV8.\\192.168.1.9\Public\.USR1CV8.Чтобы полностью исключить зависимость регламентных заданий от капризов сетевой авторизации 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С под Администратором Домена создает критическую уязвимость: в случае выполнения вредоносного кода через внешнюю обработку злоумышленник моментально получит полный контроль над всеми серверами вашей компании.