Automation-сервер 1С: как управлять базой из внешней программы
Содержание
Запуск 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 /regserver | regsvr32 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С. Напишите экспортную функцию в общем модуле, которая сама выполняет запрос и возвращает готовый результат. Внешний код делает один вызов вместо сотен.
- Читать запросом, а не перебором объектов. Запрос, выгруженный в таблицу значений внутри 1С, работает быстрее, чем обход справочника по одному элементу через COM.
- Возвращать простые типы. Строки, числа и даты передаются легче, чем объекты 1С. Готовый текст в формате JSON или XML через одну строку часто быстрее всего.
- Отключать лишнее при старте. Обработчики при начале работы системы у пользователя-робота не должны открывать формы, показывать новости и проверять обновления.
Если робот выполняет только серверную работу, проверьте, не проще ли перейти на внешнее соединение: там нет клиентского процесса и запуска интерфейса, и обмен заметно легче.
Права пользователя и безопасность Automation
Automation даёт внешней программе те же возможности, что у пользователя, под которым она вошла. Поэтому главные правила — про этого пользователя и про пароль.
Отдельный пользователь для робота
- 🤖 Заведите отдельного пользователя информационной базы, например «Робот_Обмен». Не используйте учётную запись администратора или живого сотрудника.
- 🔐 Дайте ему роль с правом «Automation» и только теми объектами, которые нужны задаче. Право «Automation» в типовых конфигурациях входит в набор прав, назначаемых при настройке ролей и групп доступа.
- 🚫 Не давайте этому пользователю права «Администрирование» и «Режим всех функций», если задача их не требует.
- 🔕 Отключите ему показ в списке выбора при входе, чтобы им не входили вручную.
Где хранить пароль
Пароль в строке подключения передаётся открытым текстом. В скрипте .vbs или .py его видит любой, кто откроет файл.
- Храните пароль вне скрипта: в переменной окружения учётной записи, под которой работает задача, или в защищённом хранилище учётных данных Windows.
- Ограничьте доступ к папке со скриптами правами NTFS.
- Если база настроена на аутентификацию операционной системы, робот может войти без пароля в строке — под той учётной записью Windows, от которой запущен процесс.
Доступ к COM на уровне Windows
Создать объект V83.Application может любая программа, работающая на машине, если класс зарегистрирован. Поэтому защита держится на двух вещах: на правах пользователя базы и на том, кто вообще имеет доступ к компьютеру. Разрешения на запуск и удалённую активацию COM-сервера настраиваются в оснастке dcomcnfg. Удалённую активацию без необходимости не открывайте.
Не оставляйте на машине робота сохранённые в скриптах пароли администратора базы. Утечка такого файла равна передаче полного доступа к учёту.
Частые вопросы
Можно ли запустить Automation на тонком клиенте?
1cv8.exe. Для работы без интерфейса используйте внешнее соединение V83.COMConnector.Работает ли Automation с базой на Linux-сервере?
Занимает ли Automation лицензию?
Почему V83.Application запускает не ту версию платформы?
1cv8.exe /regserver из папки нужной версии.Нужно ли ставить 1С на машину, где работает скрипт?
1cv8.exe, поэтому на этой машине должна быть установлена платформа той же версии, что и сервер 1С для клиент-серверной базы.