Как 1С:Предприятие работает COM-сервером для внешних программ

· 9 мин

Содержание

Automation-сервер 1С — это не служба и не часть кластера серверов, а режим работы клиентского приложения 1cv8.exe. Внешняя программа (скрипт, Excel, другая база 1С) запускает 1С через COM по имени V83.Application, подключается к информационной базе и управляет ею так, будто за клиентом сидит пользователь.

Частое заблуждение — искать «automation-сервер» в консоли кластера или в списке служб Windows. Там его нет. Он появляется в момент, когда кто-то вызывает CreateObject("V83.Application"), и исчезает, когда программа-клиент отпускает объект. Работает только в Windows: механизм COM есть только там.

Какое место Automation-сервер занимает в архитектуре 1С

Схема клиент-серверной 1С 8.3 выглядит так:

  • 🖥️ клиент (толстый, тонкий, веб-клиент) — интерфейс пользователя;
  • ⚙️ агент сервера ragent — точка входа, порт 1540;
  • 🧭 менеджер кластера rmngr — порт 1541, распределяет сеансы;
  • 🔧 рабочие процессы rphost — исполняют серверный код, их порты задаются диапазоном в свойствах рабочего сервера;
  • 🗄️ СУБД — хранит данные.

Automation-сервер стоит в этой цепочке на месте клиента. Процесс 1cv8.exe, запущенный через COM, проходит тот же путь, что и обычный пользователь: обращается к агенту, получает от менеджера кластера рабочий процесс и открывает сеанс. В консоли кластера такой сеанс виден как сеанс толстого клиента с именем пользователя, под которым подключился скрипт.

Для файловой базы цепочка короче: процесс 1С сам открывает файл 1Cv8.1CD.

Отсюда практический вывод. Всё, что известно про клиента, верно и для Automation-сервера:

  • 📌 нужен свободный клиентский лицензионный слот;
  • 📌 при входе выполняются обработчики запуска приложения;
  • 📌 если база заблокирована для новых сеансов, подключение не пройдёт;
  • 📌 права определяет пользователь 1С, указанный в строке подключения.

Automation-сервер, внешнее соединение и сервер приложений

Эти три понятия путают постоянно. Их объединяет только слово «сервер» или «COM».

ЧтоЧем являетсяКак вызываетсяИнтерфейсГде работает
Automation-серверОтдельный процесс клиента 1СV83.ApplicationЕсть, можно показать или скрытьТолько Windows
Внешнее соединениеБиблиотека comcntr.dll внутри процесса вызывающей программыV83.COMConnectorНетТолько Windows
Сервер приложенийКластер: агент, менеджер, рабочие процессыКлиенты подключаются по сетиНетWindows и Linux

Чем Automation-сервер отличается от внешнего соединения

Внешнее соединение грузится внутрь вашей программы и не имеет интерфейса. При входе выполняется модуль внешнего соединения, а не модуль приложения. Работает быстрее и стабильнее для обменов и выгрузок.

Automation-сервер — это полноценное клиентское приложение в отдельном процессе. Он нужен, когда задача требует клиентского контекста:

  • 🖨️ сформировать и вывести печатную форму, которую строит клиентский код;
  • 🧩 вызвать процедуры, доступные только на клиенте;
  • 👀 показать пользователю окно 1С, открытое из другой программы, например из CRM.

Если интерфейс не нужен, почти всегда выгоднее внешнее соединение.

Тонкий клиент как Automation-сервер

В 8.3 COM-сервером может быть и тонкий клиент 1cv8c.exe, его имя — V83C.Application. Тонкий клиент не работает с данными напрямую: всё, что связано с базой, он делает через вызовы сервера. Поэтому из такого подключения доступно меньше, чем из толстого клиента. Для большинства задач автоматизации используют V83.Application.

Регистрация и подключение Automation-сервера 1С

Программа установки платформы обычно регистрирует COM-сервер сама. Проблемы начинаются, когда на компьютере стоит несколько версий платформы или установка шла без прав администратора.

Регистрация вручную

  1. Откройте командную строку от имени администратора.
  2. Перейдите в каталог bin нужной версии платформы, например C:\Program Files\1cv8\8.3.xx.xxxx\bin.
  3. Выполните регистрацию толстого клиента:
"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" /regserver
  1. Для тонкого клиента — та же команда с 1cv8c.exe.
  2. Чтобы снять регистрацию, используйте ключ /unregserver.

Внешнее соединение регистрируется отдельно, через системную утилиту:

regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll"

Регистрируется конкретная версия. Последняя выполненная команда /regserver определяет, какой 1cv8.exe запустится по имени V83.Application. После обновления платформы и удаления старой версии регистрацию нужно повторить, иначе COM будет искать удалённый файл.

Как проверить, что регистрация есть

Запрос к реестру показывает, зарегистрирован ли класс:

reg query "HKCR\V83.Application\CLSID"

Если ключа нет — сервер не зарегистрирован. Если ключ есть, но 1С не стартует, проверьте путь к исполняемому файлу в разделе HKCR\CLSID\{найденный CLSID}\LocalServer32: он должен вести на существующую версию платформы.

Подключение из кода

Пример на встроенном языке: одна база 1С подключается к другой и читает версию конфигурации. Код выполняется на клиенте под Windows.

СтрокаСоединения = "Srvr=""srv-1c"";Ref=""buh"";Usr=""Робот"";Pwd=""пароль"";";

V8 = Новый COMОбъект("V83.Application");
Если V8.Connect(СтрокаСоединения) Тогда
    V8.Visible = Ложь;
    Версия = V8.Метаданные.Версия;
    Сообщить("Версия конфигурации: " + Версия);
    V8.ЗавершитьРаботуСистемы(Ложь);
Иначе
    Сообщить("Подключиться не удалось");
КонецЕсли;
V8 = Неопределено;

Для файловой базы вместо Srvr и Ref указывают путь:

File="D:\Bases\Buh";Usr="Робот";Pwd="пароль";

Метод Connect возвращает Истина или Ложь. Свойство Visible управляет видимостью главного окна. По умолчанию окно скрыто, но явная установка делает поведение предсказуемым.

Тот же объект создаётся из VBScript (CreateObject("V83.Application")), PowerShell (New-Object -ComObject V83.Application), Excel VBA и любого языка с поддержкой COM.

Завершение работы

Самая частая причина «зависших» процессов 1cv8.exe — скрипт не закрыл сеанс. Порядок такой:

  1. Вызвать ЗавершитьРаботуСистемы(Ложь) у объекта подключения.
  2. Освободить ссылку: в 1С — V8 = Неопределено, в VBScript — Set v8 = Nothing.

Если скрипт упал с ошибкой посередине, процесс остаётся висеть и держит лицензию. Оборачивайте работу в Попытка…Исключение или On Error, а закрытие ставьте в обработку ошибки.

Почему Automation-сервер не запускается: разбор ошибок

Диагностика: выберите симптом

Прежде чем завершать «зависшие» процессы 1cv8.exe в диспетчере задач, убедитесь, что это именно процессы скрипта, а не живые пользователи на том же терминальном сервере. Ориентируйтесь на имя пользователя Windows и время запуска. Принудительное завершение обрывает сеанс без сохранения.

Ещё одна неочевидная причина — обновление конфигурации. Если в базе есть изменения, ожидающие применения, или релиз обновился и база требует подтверждения легального получения обновлений, первый вход пользователя открывает служебный диалог. Для Automation-сервера это означает бесконечное ожидание. Зайдите в базу под служебным пользователем вручную один раз после каждого обновления.

Как Automation-сервер влияет на производительность

Каждое подключение запускает полный клиент. Это заметно по ресурсам.

  • ⏱️ Время старта. Запуск процесса, вход в базу и выполнение обработчиков начала работы занимают от нескольких секунд до минуты на тяжёлых конфигурациях.
  • 💾 Память. Толстый клиент занимает сотни мегабайт. Десять параллельных подключений на терминальном сервере — это гигабайты.
  • 🔁 Межпроцессные вызовы. Каждое обращение к свойству или методу из внешней программы — отдельный COM-вызов между процессами с упаковкой параметров. Цикл по 10 000 элементам справочника, где на каждой строке читаются три реквизита, превращается в 30 000 таких вызовов.

Что с этим делать:

  1. Держите одно подключение на всю пачку работы, а не открывайте его заново для каждого документа.
  2. Переносите логику внутрь 1С. Вместо перебора объектов снаружи вызовите одну функцию общего модуля, которая сделает всё на стороне 1С и вернёт результат строкой, XML или JSON.
  3. Используйте запросы, а не перебор объектов через Выбрать().
  4. Не держите подключение открытым после окончания работы — оно занимает лицензию и память.

Если задача — регулярная выгрузка данных без интерфейса, перевод её с V83.Application на внешнее соединение V83.COMConnector обычно сразу убирает затраты на запуск интерфейса.

Для сервера приложений Automation-подключение — обычный сеанс. Серверную нагрузку оно создаёт ровно такую, как пользователь, выполняющий те же действия.

Права доступа и безопасность подключения

Здесь два уровня: права в самой 1С и права Windows на запуск COM-сервера.

Пользователь 1С

  • 👤 Заведите отдельного служебного пользователя под автоматизацию, с минимальным набором ролей для конкретной задачи.
  • 🚫 Не подключайтесь под администратором: ошибка в скрипте получит полный доступ к базе.
  • 🔑 Пароль в строке соединения хранится в открытом виде. Не кладите скрипт в общую папку и в репозиторий с паролем внутри.
  • 🪪 Альтернатива паролю — аутентификация Windows. В карточке пользователя 1С включают аутентификацию операционной системы и указывают доменную учётную запись. Тогда строку соединения пишут без Usr и Pwd, а 1С сопоставляет пользователя по учётной записи, под которой запущен скрипт.

Права DCOM

Когда Automation-сервер вызывает служба, планировщик заданий или веб-приложение, процесс-клиент работает не от вошедшего пользователя. Windows проверяет права на запуск и активацию COM-сервера.

  1. Нажмите Win+R, выполните dcomcnfg.
  2. Откройте Службы компонентов → Компьютеры → Мой компьютер → Настройка DCOM.
  3. Найдите в списке приложение 1С — ориентируйтесь на упоминание 1C и V83 в названии.
  4. В свойствах на вкладке «Безопасность» дайте права запуска и активации нужной учётной записи.
  5. На вкладке «Удостоверение» выберите, от чьего имени запускается процесс.

Не выдавайте права запуска группе «Все». Любой, кто может выполнить код на этом компьютере, сможет запустить 1С от указанной учётной записи.

Ограничения среды:

  • серверный код на сервере 1С под Linux не может создать COMОбъект — COM в Linux нет;
  • на Windows-сервере код из рабочего процесса создаёт объект от имени учётной записи службы 1С, у которой нет рабочего стола; клиентский процесс в такой среде ведёт себя непредсказуемо.

Когда Automation-сервер — неудачный выбор

Automation-сервер хорош для локальных сценариев на рабочем месте с Windows. Для интеграции между системами чаще есть способы надёжнее.

Какая у вас задача?

Отказываться от Automation-сервера стоит, если:

  • 🐧 сервер или вызывающая система работает под Linux;
  • 🌐 вызов идёт с другого компьютера по сети — COM для этого неудобен;
  • 🔄 нужны десятки параллельных подключений — каждое стоит процесс и лицензию.

Частые вопросы

Нужна ли отдельная лицензия для Automation-сервера?
Отдельной лицензии нет. Подключение — обычный клиентский сеанс и занимает клиентскую лицензию, как пользователь.
Можно ли подключиться к базе, которая открыта у других пользователей?
Да. Automation-сервер открывает ещё один сеанс. Монопольный режим не нужен, если скрипт не выполняет операции, требующие его.
Почему V83.Application запускает не ту версию платформы?
COM запускает версию, зарегистрированную последней. Выполните /regserver из каталога bin нужной версии.
Работает ли Automation-сервер с веб-клиентом?
Нет. COM-сервером выступают только толстый клиент (V83.Application) и тонкий клиент (V83C.Application).
Как увидеть, что делает скрытый Automation-сеанс?
Установите свойство Visible в Истина: откроется главное окно, и станет видно, на каком диалоге остановился запуск.