При работе в клиент-серверном режиме 1С:Предприятие часто возникает ситуация, когда привычные операции с файлами, работавшие в файловой версии, начинают выдавать ошибку: «Ошибка при выполнении файловой операции...» с указанием пути к временному файлу в профиле пользователя. Рассмотрим подробно, почему это происходит и как системно решить эту проблему, проанализировав настройки прав доступа, контекст выполнения кода и внешние блокирующие факторы.
Первое, что мы должны понять — это различие в контексте выполнения кода. В клиент-серверной архитектуре код может исполняться либо на стороне клиента (на терминальном сервере или локальном ПК), либо на стороне сервера (в процессе rphost на сервере приложений 1С). Если в тексте ошибки фигурирует путь вида C:\Users\agent\AppData\Local\Temp\..., а служба 1С:Предприятие запущена от имени пользователя agent, это однозначно указывает на то, что операция выполняется на сервере.
Проанализируем ситуацию: пользователь запускает выгрузку в терминальной сессии, но сам процесс формирования файла и записи данных в него инициирует сервер приложений. Ошибка возникает из-за того, что серверная служба не может корректно создать, записать или закрыть файл в своей собственной временной директории. Это может быть связано как с правами файловой системы, так и с захватом файла сторонними процессами.
Одной из самых частых причин является некорректная настройка прав NTFS для учетной записи, под которой работает служба 1С. Даже если вы дали «Полный доступ» конкретной папке, механизмы Windows могут блокировать операции из-за ограничений в родительских каталогах.
Выясним причину через аудит прав:
Temp, но и на всю цепочку: C:\Users\agent.Иногда помогает перенос временных папок (переменных окружения TEMP и TMP) для пользователя, под которым работает сервер, в корень диска (например, C:\1C_Temp). Это исключает влияние сложных путей профиля Windows.
Проанализируем программный код выгрузки. Часто разработчики используют метод ПолучитьИмяВременногоФайла(). В клиент-серверном режиме этот метод, вызванный в серверном модуле, вернет путь на диске сервера. Если после этого программа пытается передать этот путь клиенту для открытия, клиент (терминальный пользователь) не сможет найти файл по этому пути, так как у него свой диск C:, а файл лежит на сервере.
Для правильной работы в такой связке следует использовать следующий алгоритм:
// Код на сервере
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла("txt");
// Производим запись в файл
Текст = Новый ЗаписьТекста(ИмяФайлаНаСервере, КодировкаТекста.ANSI);
Текст.ЗаписатьСтроку(ДанныеДляВыгрузки);
Текст.Закрыть();
// Помещаем файл во временное хранилище, чтобы передать на клиент
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаНаСервере));
УдалитьФайлы(ИмяФайлаНаСервере);
Возврат АдресХранилища;
Затем на клиенте мы получаем эти данные и сохраняем их уже в локальную папку пользователя. Если ошибка «плавающая» (то работает, то нет), скорее всего, дело в блокировках на уровне ОС.
Если права настроены, а ошибка возникает рандомно (например, на 10-й раз), рассмотрим вероятность «вклинивания» сторонних служб. Когда 1С создает временный файл .txt или .xml, операционная система реагирует на создание нового объекта.
Проверим следующие компоненты:
rphost.exe, rmngr.exe в исключения антивируса.Чтобы не гадать, какой процесс блокирует файл, воспользуемся утилитой Process Monitor от Sysinternals. Это наиболее эффективный метод диагностики «рандомных» ошибок файловых операций.
Разберем порядок действий по шагам:
Process Name is rphost.exe и Result is ACCESS DENIED (или SHARING VIOLATION).System или SearchIndexer.exe), который обращается к этому же файлу в ту же миллисекунду.В некоторых случаях, как было замечено на платформе версии 8.3.14, ошибка может быть связана с внутренними механизмами платформы по очистке временных файлов. Если сервер 1С не успевает корректно освободить дескриптор файла при интенсивном обращении, повторная попытка создать файл с тем же именем (или в той же сессии) может вызвать конфликт.
Рассмотрим дополнительные меры:
srvinfo\reg_1541\snccntx... (при остановленной службе сервера).agent не установлены ограничения на объем дискового пространства в Windows.Резюме: Чаще всего ошибка «Ошибка при выполнении файловой операции» в связке с временными файлами на сервере лечится правильной настройкой прав доступа для сервисного аккаунта, добавлением папок в исключения антивируса и корректным разделением кода на «серверную» часть (подготовка данных) и «клиентскую» часть (сохранение файла на диск пользователя).