Automation-сервер 1С: как управлять базой из внешней программы

· 9 мин

Содержание

Запуск Automation 1С — это старт полноценного клиента 1С:Предприятия 8.3 как COM-сервера, которым управляет другая программа: скрипт, Excel, Python или вторая база 1С. Внешний код создаёт объект V83.Application, вызывает Connect со строкой подключения и дальше работает со справочниками, документами и общими модулями так, будто сам сидит в базе.

Обычно про этот режим вспоминают, когда нужно выгружать данные по расписанию, запускать обработку без человека или связать 1С с чужой системой. Работает это только на Windows и только через толстый клиент. Главные подводные камни — регистрация класса, зависшие процессы без окна и пароль робота в открытом скрипте.

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

Automation — это технология Windows COM, при которой одна программа управляет другой через опубликованные объекты. Платформа 1С регистрирует в системе класс с идентификатором V83.Application. Когда внешний код создаёт этот объект, Windows запускает отдельный процесс 1cv8.exe.

Ключевые свойства режима:

  • 🖥️ Это толстый клиент. Запускается тот же исполняемый файл, что и при обычной работе. Тонкий клиент 1cv8c.exe сервером Automation не служит.
  • 🔌 Отдельный процесс. Код вызывающей программы и 1С живут в разных процессах. Каждый вызов метода идёт через границу процессов.
  • 👁️ Окно скрыто по умолчанию. Пока не установить свойство Visible = True, пользователь ничего не увидит, но процесс будет висеть в диспетчере задач.
  • 👤 Полноценный сеанс. Подключение идёт под пользователем информационной базы, с его ролями и правами. Сеанс виден в списке активных пользователей.

Схема простая: вызывающая программа → COM → процесс 1cv8.exe → информационная база (файловая или на сервере 1С). Для клиент-серверной базы процесс-клиент дальше обращается к кластеру так же, как при ручном входе.

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

Рядом с V83.Application есть второй класс — V83.COMConnector. Его путают постоянно, хотя это разные механизмы.

ПараметрAutomation (V83.Application)Внешнее соединение (V83.COMConnector)
Где выполняетсяОтдельный процесс 1cv8.exeБиблиотека comcntr.dll внутри вызывающего процесса
ИнтерфейсЕсть, можно показать окноНет интерфейса вообще
Контекст кодаКлиентский контекст толстого клиентаКонтекст внешнего соединения
Регистрация1cv8.exe /regserverregsvr32 comcntr.dll
РазрядностьНе важна: процессы разныеДолжна совпадать с разрядностью вызывающей программы
Право в роли«Automation»«Внешнее соединение»

Если окно 1С не нужно, а задача — быстро прочитать или записать данные, внешнее соединение обычно удобнее и легче. Automation выбирают, когда нужны клиентские формы, печать, интерактивные действия или код, который работает только на клиенте.

Для каких задач запускают 1С как Automation-сервер

Режим остался в платформе ради совместимости и для узких сценариев. Типичные из них:

  • 📊 Выгрузка в Excel и обратно. Макрос VBA создаёт V83.Application, читает остатки или цены и раскладывает их по листам.
  • ⏰ Задачи по расписанию на рабочей станции. Скрипт из планировщика Windows открывает базу, запускает обработку, закрывает базу.
  • 🔗 Связь со сторонней программой. Складская, CRM или самописная система на Windows управляет 1С без веб-сервисов.
  • 🧪 Автотесты и демонстрации. Окно показывается, и внешний код ведёт клиента по формам.
  • 🔁 Обмен между двумя базами. Одна база 1С через Новый COMОбъект("V83.Application") открывает другую. Так часто делали обмены со старыми конфигурациями на обычных формах.

Для новых интеграций по сети этот режим подходит плохо. Он требует Windows, установленного клиента 1С и регистрации COM на той же машине. Для обмена между серверами чаще берут HTTP-сервисы или стандартный интерфейс OData.

Запуск Automation: регистрация, подключение, примеры кода

Шаг 1. Зарегистрировать сервер Automation

Установщик платформы обычно регистрирует класс сам. Если внешний код получает ошибку создания объекта, регистрацию повторяют вручную из командной строки, открытой от имени администратора:

cd "C:\Program Files\1cv8\8.3.24.1342\bin"
1cv8.exe /regserver

Номер версии в пути подставьте свой. Регистрируется та платформа, из папки которой запущена команда. Если на машине стоит несколько версий, класс будет указывать на последнюю зарегистрированную. Снять регистрацию можно ключом /unregserver.

Шаг 2. Собрать строку подключения

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

БазаПример строки
ФайловаяFile="C:\Bases\Trade";Usr="Robot";Pwd="пароль";
Клиент-сервернаяSrvr="srv1c";Ref="trade";Usr="Robot";Pwd="пароль";

Srvr — имя сервера 1С (при нестандартном порту — с портом через двоеточие), Ref — имя базы в кластере, а не её представление в списке.

Шаг 3. Подключиться из скрипта

Пример на VBScript. Он открывает базу, выводит имя и версию конфигурации и корректно закрывает процесс:

Dim App, ok
Set App = CreateObject("V83.Application")
ok = App.Connect("File=""C:\Bases\Trade"";Usr=""Robot"";Pwd=""secret"";")
If ok Then
    WScript.Echo App.Metadata.Name & " " & App.Metadata.Version
    App.Exit False
Else
    WScript.Echo "Не удалось подключиться"
End If
Set App = Nothing

Connect возвращает True или False. Объекты глобального контекста доступны по английским именам: Metadata, Catalogs, Documents, Exit. Это те же Метаданные, Справочники, Документы и ЗавершитьРаботуСистемы.

Тот же сценарий на Python через пакет pywin32:

import win32com.client

app = win32com.client.Dispatch("V83.Application")
if app.Connect('Srvr="srv1c";Ref="trade";Usr="Robot";Pwd="secret";'):
    print(app.Metadata.Name, app.Metadata.Version)
    app.Exit(False)
app = None

Шаг 4. Вызов из другой базы 1С

Из кода 1С объект создаётся через COMОбъект. Код должен выполняться там, где доступен COM: на клиенте толстого клиента или на сервере под Windows.

Приложение = Новый COMОбъект("V83.Application");
Если Приложение.Connect("File=""C:\Bases\Trade"";Usr=""Robot"";Pwd=""secret"";") Тогда
    ИмяКонфигурации = Приложение.Метаданные.Имя;
    Приложение.ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
Приложение = Неопределено;

Если такой код стоит на сервере 1С, процесс 1cv8.exe поднимется на машине сервера под учётной записью службы. Для этого на сервере должен быть установлен клиент 1С и зарегистрирован класс.

Запуск клиента 1С на сервере кластера из серверного кода — рискованная схема. Процесс без окна легко зависает на модальном вопросе и держит лицензию. Для обмена между базами на одном сервере надёжнее внешнее соединение или HTTP-сервис.

Альтернатива: пакетный запуск без COM

Если нужно только выполнить обработку по расписанию, COM вообще не нужен. Платформа умеет открыть базу и запустить внешнюю обработку из командной строки:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"C:\Bases\Trade" /N"Robot" /P"secret" /Execute"C:\Tasks\upload.epf" /DisableStartupMessages

Обработка выполняет работу при открытии формы и в конце сама закрывает приложение. Такой вариант проще отлаживать, чем связку скрипта и COM.

Ошибки запуска Automation и контроль работы

Типичные ошибки и что они значат

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

Как перехватывать ошибки в коде

Ошибка внутри 1С приходит в вызывающую программу как исключение COM. Её текст совпадает с тем, что 1С показала бы пользователю. Ловить её нужно на стороне скрипта:

  • VBScript — On Error Resume Next, затем проверка Err.Number и Err.Description после каждого важного вызова.
  • Python — try / except pywintypes.com_error.
  • Код 1С — Попытка ... Исключение ... КонецПопытки и ОписаниеОшибки() в блоке исключения.

Внутри самой базы полезно писать события в журнал регистрации методом ЗаписьЖурналаРегистрации. Тогда при разборе сбоя видно, на каком шаге остановился робот, даже если скрипт ничего не записал в свой лог.

Как следить за процессами и сеансами

  • 🔍 Процессы. Команда tasklist /FI "IMAGENAME eq 1cv8.exe" показывает все запущенные клиенты. Если после каждого запуска их становится больше, скрипт не закрывает приложение.
  • 👥 Сеансы. В клиент-серверной базе сеансы робота видны в консоли кластера или через rac session list. Флаг --licenses показывает, какую лицензию занял сеанс.
  • 📜 Журнал регистрации. Отбор по пользователю-роботу показывает время входа, выхода и ошибки.

Завершать зависший процесс 1cv8.exe через диспетчер задач можно, но незаписанные данные этого сеанса пропадут. Если на машине работают люди, сначала убедитесь, что вы снимаете именно процесс робота: смотрите пользователя процесса и время запуска.

Как ускорить работу через Automation

Медленнее всего в этом режиме не сама 1С, а переходы между процессами. Каждое обращение App.Catalogs.Номенклатура.FindByCode(...) — это несколько вызовов COM. На тысяче строк задержка становится заметной.

Что реально помогает:

  1. Держать одно подключение. Старт клиента и вход в базу занимают секунды. Открывайте базу один раз на весь пакет работ, а не на каждую операцию.
  2. Переносить логику внутрь 1С. Напишите экспортную функцию в общем модуле, которая сама выполняет запрос и возвращает готовый результат. Внешний код делает один вызов вместо сотен.
  3. Читать запросом, а не перебором объектов. Запрос, выгруженный в таблицу значений внутри 1С, работает быстрее, чем обход справочника по одному элементу через COM.
  4. Возвращать простые типы. Строки, числа и даты передаются легче, чем объекты 1С. Готовый текст в формате JSON или XML через одну строку часто быстрее всего.
  5. Отключать лишнее при старте. Обработчики при начале работы системы у пользователя-робота не должны открывать формы, показывать новости и проверять обновления.

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

Права пользователя и безопасность Automation

Automation даёт внешней программе те же возможности, что у пользователя, под которым она вошла. Поэтому главные правила — про этого пользователя и про пароль.

Отдельный пользователь для робота

  • 🤖 Заведите отдельного пользователя информационной базы, например «Робот_Обмен». Не используйте учётную запись администратора или живого сотрудника.
  • 🔐 Дайте ему роль с правом «Automation» и только теми объектами, которые нужны задаче. Право «Automation» в типовых конфигурациях входит в набор прав, назначаемых при настройке ролей и групп доступа.
  • 🚫 Не давайте этому пользователю права «Администрирование» и «Режим всех функций», если задача их не требует.
  • 🔕 Отключите ему показ в списке выбора при входе, чтобы им не входили вручную.

Где хранить пароль

Пароль в строке подключения передаётся открытым текстом. В скрипте .vbs или .py его видит любой, кто откроет файл.

  • Храните пароль вне скрипта: в переменной окружения учётной записи, под которой работает задача, или в защищённом хранилище учётных данных Windows.
  • Ограничьте доступ к папке со скриптами правами NTFS.
  • Если база настроена на аутентификацию операционной системы, робот может войти без пароля в строке — под той учётной записью Windows, от которой запущен процесс.

Доступ к COM на уровне Windows

Создать объект V83.Application может любая программа, работающая на машине, если класс зарегистрирован. Поэтому защита держится на двух вещах: на правах пользователя базы и на том, кто вообще имеет доступ к компьютеру. Разрешения на запуск и удалённую активацию COM-сервера настраиваются в оснастке dcomcnfg. Удалённую активацию без необходимости не открывайте.

Не оставляйте на машине робота сохранённые в скриптах пароли администратора базы. Утечка такого файла равна передаче полного доступа к учёту.

Перед запуском робота в работу
Выполнено: 0 / 6

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

Можно ли запустить Automation на тонком клиенте?
Нет. Сервером Automation служит только толстый клиент 1cv8.exe. Для работы без интерфейса используйте внешнее соединение V83.COMConnector.
Работает ли Automation с базой на Linux-сервере?
Да, если сам клиент запускается на Windows. Технология COM есть только в Windows, а база может стоять на сервере 1С под любой ОС.
Занимает ли Automation лицензию?
Да, это обычный клиентский сеанс. Каждый одновременно открытый процесс робота учитывается так же, как вход живого пользователя.
Почему V83.Application запускает не ту версию платформы?
Класс указывает на ту версию, которая зарегистрирована последней. Выполните 1cv8.exe /regserver из папки нужной версии.
Нужно ли ставить 1С на машину, где работает скрипт?
Да. Automation запускает локальный клиент 1cv8.exe, поэтому на этой машине должна быть установлена платформа той же версии, что и сервер 1С для клиент-серверной базы.