При организации обмена данными между различными базами 1С через COM-соединение (особенно при использовании разных версий платформы, например 8.3.10 и 8.3.12) часто возникает критическая проблема: соединение устанавливается успешно, но любая попытка работы с файлами завершается ошибкой «Ошибка доступа к файлу». Эта ситуация особенно характерна для обменов, построенных на базе универсальных обработок XML, где данные сначала выгружаются во временный файл, а затем считываются другой стороной.
В этой статье мы подробно разберем, почему возникают такие ошибки, как правильно настроить права в операционной системе и компонентах COM+, а также проанализируем нюансы работы под различными учетными записями.
Разберем стандартную ситуацию: сервер 1С часто запускается под встроенной системной учетной записью LocalSystem (или «система»). Рассмотрим, к чему это приводит. У этой учетной записи есть неограниченные права на локальном компьютере, но она абсолютно «бесправна» во внешней сети. Если ваш файл обмена лежит на сетевом ресурсе, 1С под системной учеткой просто не сможет до него «дотянуться».
Проанализируем решение этой проблемы. Для корректной работы с сетевыми путями необходимо:
usr1cv8_service).Когда мы настраиваем приложение в Службах компонентов (COM+) для разделения версий платформы, крайне важно обратить внимание на вкладку «Удостоверение» (Identity). Если там выбрано значение «Интерактивный пользователь», то COM-объект будет пытаться запуститься от имени того, кто в данный момент залогинен на сервере через RDP. Если на сервере никого нет, вы получите ошибку доступа.
Рассмотрим правильный алгоритм настройки приложения COM+:
comcnctr перейдем на вкладку «Удостоверение».Важно: именно под этой учетной записью будет выполняться код внутри COM-соединения. Следовательно, именно у этого пользователя должны быть полные права на каталог, возвращаемый функцией ПолучитьИмяВременногоФайла().
Выясним причину еще одной неочевидной ошибки. Функция 1С ПолучитьИмяВременногоФайла() возвращает путь в зависимости от контекста пользователя. Если основной процесс сервера 1С работает под пользователем System, временная папка будет находиться по пути C:\Windows\Temp. Однако процесс COM+, запущенный под другой учетной записью, имеет свою переменную среды %TEMP%, указывающую на профиль пользователя (например, C:\Users\usr1cv8\AppData\Local\Temp).
В результате возникает ситуация: сервер 1С создает файл в одной папке, а COM-объект пытается найти его в своей «песочнице» или не имеет прав на доступ к системной папке Windows\Temp. Чтобы этого избежать, рекомендуем использовать фиксированный путь для обмена, например C:\Exchange\, и явно прописывать его в правилах обмена, предварительно наделив сервисную учетную запись правами на этот каталог.
Рассмотрим ситуацию, когда базы находятся в разных доменах. В этом случае обычных прав NTFS может быть недостаточно. Проанализируем пример кода, который помогает принудительно авторизоваться в сетевом каталоге перед началом файловых операций:
// Пример принудительного подключения сетевого ресурса
ИмяПользователяОС = "DOMAIN_NAME\ExchangeUser";
ПарольПользователяОС = "SuperPassword123";
ПутьКОбмену = "\\10.0.13.219\ASK-BASE$";
КомандаСистемы("net use " + ПутьКОбмену + " /user:" + ИмяПользователяОС + " " + ПарольПользователяОС);
После выполнения этой команды операционная система закэширует учетные данные для данного сетевого пути на время сеанса, и Connect() через COM-соединение сможет успешно прочитать 1Cv8.cdn или файлы выгрузки.
Поскольку хранить пароли в открытом виде в коде — плохая практика, разберем, как сделать это безопаснее. Мы можем использовать ХранилищеЗначения с шифрованием или хранить настройки в защищенных регистрах сведений, доступ к которым ограничен на уровне RLS.
Пример записи и чтения пароля из хранилища:
// Запись пароля (выполняется администратором)
Настройка = Новый Структура;
Настройка.Вставить("Пароль", "MySecretPassword");
Хранилище = Новый ХранилищеЗначения(Настройка, Новый СжатиеДанных(9));
// Далее записываем 'Хранилище' в ресурс регистра или константу
// Чтение пароля в коде обмена
Хранилище = Константы.ПарольОбмена.Получить();
Настройки = Хранилище.Получить();
Если Настройки <> Неопределено Тогда
ТекущийПароль = Настройки.Пароль;
КонецЕсли;
Подводя итог, для устранения ошибки доступа к файлу при COM-обмене выполним следующие действия:
UNC (например, \\server\folder), так как диски типа Z:\ серверу 1С недоступны.net use для предварительной авторизации.Соблюдение этих архитектурных правил позволит избежать большинства проблем с правами доступа при использовании COM-соединения в среде 1С:Предприятие.