При работе с обработкой Универсальный обмен данными в формате XML (УОД) специалисты часто сталкиваются с ситуацией, когда при попытке прочитать правила или загрузить данные в серверном режиме работы базы возникает ошибка «Указанный файл не существует». При этом тот же самый файл прекрасно открывается в файловой версии базы или при интерактивном выборе на клиенте. В данной статье мы подробно разберем причины этого поведения и рассмотрим шаги по исправлению ситуации. Для автоматического контроля результатов миграции и оперативного выявления расхождений в проводках после завершения обмена можно использовать сервис сверки бухгалтерских и налоговых проводок между базами 1С.
Первое и самое важное, что нам необходимо понять: в серверном режиме код обработки выполняется не от имени текущего пользователя Windows, который запустил сеанс 1С, а от имени специальной технической учетной записи, под которой запущена служба Агент сервера 1С:Предприятие. Обычно это USR1CV8 или 1CV8. Для быстрого перемещения файлов в каталоги, доступные серверной службе, можно использовать файловый менеджер для обмена файлами между клиентом и сервером.
Рассмотрим, почему это приводит к ошибке:
D:\Правила.xml, сервер ищет этот файл на своем локальном диске D. Если сервер 1С физически находится на другом компьютере, он не сможет обратиться к вашему локальному диску.Z:\ или X:\. Эти диски существуют только внутри вашей пользовательской сессии.Даже если файл физически лежит на сервере, ошибка «Указанный файл не существует» часто означает «Доступ запрещен». Проанализируем, какие права должны быть настроены:
Для корректной работы серверу (пользователю USR1CV8) требуются права на чтение и просмотр содержимого папки. Причем эти права должны быть предоставлены не только на конечный файл, но и на всю цепочку папок, начиная от корня диска. Проверим это по шагам:
USR1CV8) и предоставьте ему права на чтение.Рассмотрим ситуацию, когда базы источника и приемника находятся на разных серверах. В этом случае использование локальных путей (диск C или D) становится невозможным. Выясним, как правильно указывать путь в таком случае. При необходимости регулярной передачи информации между удаленными серверами ручной перенос файлов можно исключить с помощью программы автоматического обмена данными между конфигурациями 1С по расписанию.
Единственно верный способ — использование UNC-путей (Universal Naming Convention). Вместо буквы диска указывается сетевое имя компьютера:
\\ИмяСервера\ИмяШары\Папка\Файл.xml
При этом важно, чтобы сетевая папка была «расшарена» не только на уровне прав доступа Windows (Share Permissions), но и на уровне файловой системы (NTFS Permissions) для учетной записи службы 1С.
Чтобы избежать проблем с правами доступа и сетевыми путями, рассмотрим программный способ решения, который часто упоминается опытными разработчиками. Вместо того чтобы заставлять сервер искать файл по адресу на диске, мы можем передать сам файл с клиента на сервер через Временное хранилище. Для детального изучения этой методики и особенностей её применения в управляемом приложении полезно изучить руководство по программной работе с файлами в управляемых формах.
Посмотрим на пример логики, которую можно реализовать в коде:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
// 1. Выбираем файл на клиенте интерактивно
Диалог = Новый ДиалогВыбора Файла(РежимДиалогаВыбораФайла.Открытие);
Если Диалог.Выбрать() Тогда
// 2. Помещаем файл во временное хранилище
ДанныеФайла = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла);
// 3. Передаем адрес на сервер
ЗагрузитьНаСервере(АдресХранилища);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(АдресХранилища)
// 4. Получаем данные из хранилища на стороне сервера
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
Данные.Записать(ИмяВременногоФайла);
// Теперь сервер гарантированно имеет доступ к этому файлу по пути ИмяВременногоФайла
// Можно вызывать чтение правил
КонецПроцедуры
Этот метод полностью снимает проблему «Указанный файл не существует», так как сервер 1С всегда имеет полные права на свои собственные временные папки, создаваемые через ПолучитьИмяВременногоФайла().
Если ваша «Универсальная загрузка» использует COM-объекты (например, для чтения данных из Excel на сервере), вы можете столкнуться со специфической ошибкой. Даже если путь верный и права есть, Excel.Application на сервере может выдать ошибку «Файл не найден».
Выясним причину: для работы Excel в серверном (неинтерактивном) режиме требуется наличие определенных системных папок Desktop. Проверьте наличие следующих директорий на сервере:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных ОС)Если этих папок нет, их нужно создать вручную. Это известная техническая особенность работы COM-интерфейсов Microsoft Office под системными учетными записями.
Если вы хотите быстро проверить, «видит» ли сервер файл по указанному пути, создайте небольшую внешнюю обработку и выполните на сервере следующий код:
&НаСервере
Процедура ПроверитьФайлНаСервере(ПутьКФайлу)
Проверка = Новый Файл(ПутьКФайлу);
Если Проверка.Существует() Тогда
Сообщить("Сервер видит файл. Размер: " + Проверка.Размер());
Иначе
Сообщить("Сервер НЕ видит файл по указанному пути!");
КонецЕсли;
КонецПроцедуры
Использование объекта Файл и его метода Существует() в серверном контексте — самый надежный способ диагностики проблем с путями и правами доступа.
Для решения проблемы «Указанный файл не существует» при универсальном обмене данными, выполните следующие действия:
\\Server\Share\file.xml.rphost.exe (обычно USR1CV8).