При работе с интеграциями между различными базами 1С через механизм COM-соединения программисты часто сталкиваются с неочевидной проблемой: программный код, который успешно отрабатывает в обычном сеансе или регламентном задании, внезапно выдает ошибку «Отказ в доступе» при выполнении через COM. Чаще всего это происходит при попытке записи файлов на диск или обращении к сетевым ресурсам. В рамках данной статьи мы разберем, как определить «личность» процесса, создающего соединение, и как правильно настроить права в операционной системе Windows. Для ознакомления с базовыми принципами настройки подключения можно использовать руководство по работе с COM-объектами в 1С.
Для начала проанализируем базовые правила, по которым определяется учетная запись процесса в клиент-серверном варианте работы 1С. Рассмотрим два основных сценария:
COMConnector происходит в коде, исполняемом на клиенте (например, в форме обработки), то соединение работает от имени того пользователя Windows, под которым запущена текущая сессия 1С.USR1CV82 или USR1CV83).Однако на практике ситуация часто усложняется из-за использования суррогатных процессов Windows, особенно когда возникает конфликт разрядности (например, 64-битный сервер 1С пытается вызвать 32-битную компоненту COM).
Если вы столкнулись с ошибкой доступа, первым делом нужно выяснить, под каким именно пользователем «представляется» ваше соединение операционной системе. Разберем эффективный способ диагностики, предложенный в обсуждении:
В коде, который выполняется внутри COM-соединения, можно вызвать системную команду для вывода переменных окружения в текстовый файл. Это позволит нам увидеть реальное имя пользователя (переменная USERNAME). Посмотрим на пример кода:
// Выполняем команду внутри контекста COM-соединения
КомандаСистемы("set > C:\Temp\debug_user.txt");
После выполнения этого кода откройте созданный файл. В нем вы найдете список всех переменных окружения. Особое внимание обратите на параметр USERDOMAIN и USERNAME. Как показывает практика, в проблемных случаях там часто фигурирует LOCAL SERVICE или NETWORK SERVICE, а не ожидаемый пользователь сервера 1С.
Альтернативный метод — создать любой файл на диске из-под COM-соединения и посмотреть в свойствах файла на вкладке «Безопасность» (кнопка «Дополнительно»), кто является его владельцем (Owner). Если владельцем значится LOCAL SERVICE, значит, ваше соединение работает с минимальными правами в изолированной среде.
Проанализируем причину, по которой операционная система подменяет пользователя. Если вы используете 64-битный сервер 1С, то для работы с 32-битной компонентой V83.COMConnector вам необходимо настроить приложение в консоли Службы компонентов (Component Services). В этом случае Windows запускает отдельный процесс dllhost.exe, который служит оболочкой для COM-объекта.
Для исправления ситуации выполним следующие шаги в настройке comexp.msc:
USR1CV83), у которого точно есть права на нужные папки и сетевые пути.Важный нюанс: После изменения настроек на вкладке «Удостоверение» обязательно нужно принудительно остановить приложение в консоли (через контекстное меню «Завершить»), чтобы при следующем вызове оно запустилось с новыми правами.
Разберем ситуацию, когда COM-соединение должно сохранить файл на сетевой шаре. Даже если вы настроили запуск от имени доменного пользователя, вы можете столкнуться с проблемой «второго прыжка». Когда сервер 1С (первый узел) запускает COM-процесс и тот пытается обратиться к серверу файлов (второй узел), Windows может заблокировать передачу учетных данных (делегирование).
Проанализируем ключевые моменты для работы с сетью:
LOCAL SERVICE никогда не имеет прав доступа к сетевым ресурсам за пределами локального компьютера.Everyone (что небезопасно), либо используйте NETWORK SERVICE (если права даны учетной записи компьютера в домене).Temp находятся в глубоких системных папках (например, C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp). Если у процесса нет прав на создание файлов в этой папке, соединение может упасть еще до начала основной работы.Посмотрим на ситуацию, когда используется V83.Application вместо V83.COMConnector. В этом случае объект запускается как полноценное приложение (EXE-файл). Его права регулируются через настройки DCOM:
dcomcnfg найдите объект 1C83 Application.Подводя итог, можно сказать, что стабильность работы COM-соединения напрямую зависит от прозрачности прав доступа. Лучшим решением будет создание выделенного сервисного пользователя в домене, от имени которого будут работать и служба сервера 1С, и настроенное приложение в COM+. Для решения сопутствующих системных вопросов пригодится справочник по типовым задачам администрирования Windows и 1С.