При настройке автоматической синхронизации данных между файловыми базами «1С:Предприятие» (например, между конфигурациями «Бухгалтерия предприятия» и «Управление торговлей») системные администраторы и разработчики часто сталкиваются с ошибкой доступа к временным файлам. Проблема обостряется тем, что при ручном запуске обмен проходит успешно, но при выполнении регламентного задания по расписанию процесс завершается аварийно.
В этой статье мы подробно проанализируем причины возникновения этой ошибки, разберем механизм работы временных файлов Windows при межпроцессном взаимодействии и рассмотрим несколько надежных способов решения проблемы.
Типичный сценарий возникновения проблемы выглядит следующим образом. В журнале регистрации фиксируется критическая ошибка следующего вида:
Ошибка при загрузке данных: {ОбщийМодуль.ОбменДаннымиXDTOСервер.Модуль(2173)}: Ошибка при вызове метода контекста (ОткрытьФайл)
по причине: Ошибка доступа к файлу 'C:\Windows\Temp\v8_3A9D_29.xml' (или 'C:\Users\USR1CV8\AppData\Local\Temp\v8_53F8_535.xml')
Давайте выясним причину, почему платформа пытается обратиться именно к этим каталогам и почему возникает конфликт прав доступа. Для этого рассмотрим разницу между ручным и автоматическим запуском синхронизации.
%TEMP% этого пользователя (C:\Users\ИмяПользователя\AppData\Local\Temp). Так как инициирующий процесс 1С и COM-соединение работают в рамках одного сеанса Windows, у них есть полные права на чтение и запись в данный каталог.V83.COMConnector. Если в операционной системе настроено COM+ приложение для этой компоненты, операционная система запускает отдельный суррогатный процесс dllhost.exe под учетной записью, указанной в настройках этого приложения (часто это системная служба Network Service, Local System или специальный пользователь USR1CV8).В результате возникает конфликт: процесс 1С выгружает временный XML-файл в локальный каталог Temp текущего пользователя Windows, а процесс COM-соединения (работающий под другой учетной записью) пытается прочитать этот файл из чужой папки, на которую у него нет прав NTFS. Либо наоборот — файл создается в системной папке C:\Windows\Temp, доступ к которой для обычных пользователей жестко ограничен политиками безопасности Windows.
Рассмотрим подробные шаги по устранению этой неисправности.
---
Если для работы COM-соединения используется обертка COM+, нам необходимо четко определить, под каким пользователем запускается процесс dllhost.exe, и предоставить ему необходимые права.
Выполним следующие шаги:
comexp.msc и нажмите Enter. Откроется окно «Службы компонентов».V83COMConnector (или аналогичное, настроенное для вашей платформы 1С).1c_exchange), и введите пароль.После сохранения настроек перезапустите приложение COM+ (кликнув по нему правой кнопкой мыши и выбрав «Выключить», а затем снова запустив его). Теперь процессы обмена и COM-подключения будут работать в едином контексте безопасности, используя общую папку Temp.
---
Если изменить учетную запись запуска COM-соединения невозможно или нежелательно по соображениям безопасности, мы можем пойти по пути предоставления точечных прав доступа на файловом уровне.
Рассмотрим ситуацию, когда ошибка указывает на недостаток прав в папке конкретного пользователя, например: C:\Users\USR1CV8\AppData\Local\Temp\.
Не рекомендуется давать права «Всем» (Everyone) на системные папки, так как это создает серьезную брешь в безопасности операционной системы. Вместо этого выполним безопасную настройку:
Temp пользователя USR1CV8). Обратите внимание, что папка AppData является скрытой, поэтому в настройках проводника должно быть включено отображение скрытых элементов.Temp и выберите Свойства.Аналогичные права необходимо предоставить пользователю USR1CV8 (или Network Service, в зависимости от настроек вашей системы) на папку Temp того пользователя, который запускает сеанс 1С.
---
Во многих случаях использование выделенного приложения COM+ не является строго обязательным. Если разрядность операционной системы, платформы источника и платформы приемника совпадает (например, везде используется 64-битная платформа 1С), мы можем отказаться от суррогатного процесса dllhost.exe.
При использовании внутрипроцессного подключения библиотека COM-соединения загружается непосредственно в адресное пространство процесса 1С. В этом случае права процесса полностью наследуются, а временные файлы создаются исключительно в локальной папке Temp активного пользователя 1С, что на корню исключает возникновение подобных ошибок.
Чтобы перевести подключение в режим In-Process, выполните следующие действия:
V83COMConnector из консоли «Службы компонентов».comcntr.dll напрямую в операционной системе. Для этого запустите командную строку от имени Администратора и выполните команду:
regsvr32 "C:\Program Files\1cv8\8.3.22.2239\bin\comcntr.dll"
Обратите внимание: путь к библиотеке должен соответствовать установленной у вас версии платформы 1С.
---
Для файловых баз, работающих локально на одном компьютере или сервере, эффективным решением является перенаправление путей временных файлов для конфликтующих учетных записей в один общий каталог.
Давайте настроим единую временную папку:
C:\1C_Temp.TEMP и TMP, указав созданный путь C:\1C_Temp.После перезагрузки операционной системы или перезапуска служб все временные файлы будут генерироваться в едином месте, защищенном от конфликтов прав доступа разных профилей пользователей Windows.
---
В заключение отметим, что использование прямого COM-соединения для обмена данными между базами 1С на сегодняшний день признано устаревшим технологическим подходом. Технология COM привязана к операционной системе Windows, чувствительна к обновлениям платформы 1С и часто вызывает сбои при переходе на новые релизы.
Фирма «1С» рекомендует использовать более современные и отказоустойчивые методы обмена: