При разработке обработок в системе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда код, успешно работающий на локальном компьютере, выдает ошибку при переносе его в серверный контекст. Одной из самых коварных является ошибка файловой операции при попытке записи или чтения файла по сетевому адресу (UNC-пути), например \\10.8.1.27\Exchange\1C\001z.xml. Рассмотрим подробнее, почему возникают ошибки доступа и как правильно настроить систему для стабильной работы.
Главное, что нам нужно понять: когда код выполняется в процедуре с директивой &НаСервере, все действия с файловой системой выполняются не от лица текущего пользователя Windows, который запустил 1С, а от имени системной учетной записи, под которой запущена служба Агент сервера 1С:Предприятия.
Проанализируем стандартную ситуацию: по умолчанию служба 1С устанавливается под локальным пользователем USR1CV8. Этот пользователь является локальным для того сервера, где установлена 1С, и он «не знает» паролей для доступа к другим ресурсам в сети. Даже если вы дали права «Всем» на сетеваю папку, Windows может блокировать доступ анонимным или локальным системным учетным записям из соображений безопасности.
Разберем по шагам, как обеспечить серверу 1С доступ к сетевому ресурсу:
.\USR1CV8, то это локальная учетная запись.DOMAIN\1c_service). В этом случае этой учетке можно выдать права на чтение и запись непосредственно на целевом сервере \\10.8.1.27. Подробнее о безопасной организации среды можно узнать в публикации про концепцию защищенной IT-инфраструктуры предприятия.Начиная с версии 8.3.9, в платформу встроен механизм «Защита от опасных действий». Даже если с правами в Windows всё в порядке, сама 1С может блокировать запись файла. Разберем, как это регулировать.
Если вы столкнулись с блокировкой, можно программно отключить защиту для конкретного пользователя или через параметры информационной базы. Рассмотрим пример кода, который позволяет запустить процедуру без этой проверки:
// Пример отключения защиты от опасных действий для текущего сеанса
ПараметрыДоступа = Новый ПараметрыДоступаПрофиляБезопасности;
ПараметрыДоступа.ЗащитаОтОпасныхДействий = Ложь;
// Данная настройка актуальна при работе в профилях безопасности
Также важно проверить свойство «Защита от опасных действий» в карточке пользователя в Конфигураторе. Снятие этой галочки часто помогает убрать лишние диалоговые окна и ошибки при выполнении операций записи на сервере.
Если настроить права доступа к сетевой папке для серверной учетной записи невозможно (например, из-за жестких политик безопасности), проанализируем альтернативный путь: сформировать файл на сервере, а сохранение выполнить на стороне клиента, где у пользователя точно есть все необходимые права. Чтобы автоматизировать такие процессы, можно использовать обработку для копирования файлов и каталогов между Клиентом и Сервером.
Для этого мы будем использовать Временное хранилище. Посмотрим на пример реализации этой схемы:
&НаСервере
Функция СформироватьФайлНаСервере()
// Создаем временное имя файла на сервере
ИмяФайлаСервер = ПолучитьИмяВременногоФайла("xml");
// Формируем XML или любой другой документ
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаСервер);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
// Помещаем файл в двоичные данные и во временное хранилище
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаСервер);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
// Удаляем временный файл на сервере после помещения в хранилище
УдалитьФайлы(ИмяФайлаСервер);
Возврат АдресХранилища;
КонецФункции
&НаКлиенте
Процедура СохранитьФайл(Команда)
Адрес = СформироватьФайлНаСервере();
// На клиенте определяем, куда сохранять (сетевой путь доступен пользователю)
ПутьКФайлу = "\\10.8.1.27\Exchange\1C\001z.xml";
// Получаем файл из хранилища и записываем его силами клиента
ПолучитьФайл(Адрес, ПутьКФайлу, Ложь);
КонецПроцедуры
В данном примере функция ПолучитьФайл на клиенте выполнит запись от имени текущего пользователя Windows. Это самый надежный способ, если речь идет о пользовательских обработках.
Проанализируем еще несколько причин, которые могут вызывать «Ошибку файловой операции»:
Z:\Folder\file.xml в серверном коде. Диск Z: подключен в сессии пользователя, а сервер 1С работает в своей изолированной сессии, где никаких «букв дисков» не существует. Используйте только полные UNC-пути. СоздатьКаталог(Путь). Это особенно актуально, когда вы настраиваете автоматическую выгрузку внешних отчетов и обработок в сетевой каталог.rphost.exe, воспринимая удаленную запись файла как атаку. Попробуйте временно отключить антивирус или добавить процесс сервера 1С в исключения.mount, и обращаться к ней как к локальной директории (например, /mnt/exchange/file.xml).Используя комплексный подход — проверку прав учетной записи USR1CV8, использование доменных имен и, при необходимости, механизм временного хранилища — вы сможете эффективно решать задачи интеграции и обмена данными в 1С без ошибок доступа.