Как внешняя программа работает с базой 1С:Предприятие 8.3 через COM, OLE и компоненты

· 9 мин

Содержание

Программный интерфейс 1С:Предприятие — это набор способов, которыми внешняя программа читает и меняет данные базы без участия пользователя. На Windows основных три: COM-соединение через объект V83.COMConnector, OLE Automation через V83.Application и внешние компоненты, которые сама 1С загружает в свой процесс. Для обмена по сети, в том числе с Linux, к ним добавляются HTTP-сервисы и OData.

Типичная ситуация: сайт или скрипт на Python должен каждый час забирать из 1С:Бухгалтерии остатки по складу. Ставить ради этого оператора с выгрузками никто не хочет. Нужно подключиться к базе программно, вызвать одну функцию и закрыть соединение. Как это настроить и где обычно ломается — по порядку.

Какие технологии подключения есть у 1С 8.3

Сначала выберите технологию. От неё зависит, что нужно установить, сколько ресурсов уйдёт и будет ли это работать не на Windows.

ТехнологияКто кого вызываетГде работаетКогда выбирать
COM-соединение (V83.COMConnector)Внешняя программа → база 1СТолько WindowsБыстрый обмен данными без интерфейса: скрипты, другие базы 1С, Excel
OLE Automation (V83.Application)Внешняя программа → запущенный клиент 1СТолько WindowsНужен именно клиентский контекст: формы, печать, отчёты на экране
Внешняя компонента Native API1С → ваша библиотекаWindows и LinuxРабота с оборудованием, своими DLL, нестандартными протоколами
Внешняя компонента COM1С → COM-объектТолько WindowsСтарые компоненты, которые уже написаны под COM
HTTP-сервисы, ODataЛюбая программа → веб-публикация базыЛюбая ОСИнтеграция по сети, мобильные приложения, сайты

💡 Главное различие COM и OLE: COM-соединение не открывает окно программы и работает в серверном контексте. OLE Automation запускает полноценный клиент 1С как отдельный процесс. Поэтому OLE заметно тяжелее и медленнее стартует.

Ещё одно понятие часто путают с технологиями. В конфигурациях на базе БСП у общих модулей есть область #Область ПрограммныйИнтерфейс. Туда разработчики выносят экспортные процедуры, которые разрешено вызывать извне. Их сигнатуры фирма старается не менять между релизами. Если вы пишете интеграцию с типовой конфигурацией, опирайтесь на эти процедуры, а не на внутренние служебные.

Подготовка: регистрация comcntr.dll и параметры строки подключения

COM-соединение появляется в системе только после регистрации библиотеки comcntr.dll. Установщик платформы делает это не всегда, особенно если компонента «Сервер 1С:Предприятия» или COM-соединение не были отмечены.

Как зарегистрировать вручную:

  1. Откройте командную строку от имени администратора.
  2. Найдите папку нужной версии платформы, например C:\Program Files\1cv8\8.3.24.1342\bin.
  3. Выполните регистрацию:
regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\comcntr.dll"
  1. Дождитесь сообщения об успешной регистрации.

Разрядность должна совпадать. 32-битный Excel не увидит коннектор 64-битной платформы, и наоборот. Если вызывающая программа 32-битная, ставьте и регистрируйте 32-битную платформу из C:\Program Files (x86)\1cv8\.

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

Строка подключения

Строка состоит из пар Параметр="значение" через точку с запятой.

📁 Файловая база:

File="D:\Bases\Buh";Usr="Обмен";Pwd="пароль"

🖥️ Клиент-серверная база :

Srvr="srv1c";Ref="buh_main";Usr="Обмен";Pwd="пароль"

Здесь Srvr — имя сервера 1С (при нестандартном порте агента — srv1c:2541), Ref — имя информационной базы в кластере. Сеть должна пропускать порт агента 1540, менеджера кластера 1541 и диапазон рабочих процессов, который задан в свойствах рабочего сервера.

💡 Заведите для интеграции отдельного пользователя, например «Обмен». Так в журнале регистрации видно, какие изменения сделал скрипт, а не человек.

Как установить соединение и вызвать функцию базы

Порядок действий одинаков для любого языка: создать коннектор, вызвать метод Connect, работать с полученным объектом, освободить его.

Из другой базы 1С

Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""srv1c"";Ref=""buh_main"";Usr=""Обмен"";Pwd=""пароль""";

Попытка
    База = Коннектор.Connect(СтрокаПодключения);
Исключение
    ЗаписьЖурналаРегистрации("Интеграция.Подключение", УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    Возврат;
КонецПопытки;

Остатки = База.ОбменСайтом.ОстаткиПоСкладу("Основной склад");

Код выполняется на сервере. Модуль ОбменСайтом — это общий модуль в базе-приёмнике, где у функции стоит Экспорт.

Из Python

import win32com.client
import pywintypes

conn_str = 'Srvr="srv1c";Ref="buh_main";Usr="Обмен";Pwd="пароль"'
connector = win32com.client.Dispatch("V83.COMConnector")

try:
    base = connector.Connect(conn_str)
    module = getattr(base, "ОбменСайтом")
    result = module.ОстаткиПоСкладуСтрокой("Основной склад")
    print(result)
except pywintypes.com_error as err:
    print("Ошибка 1С:", err.excepinfo[2] if err.excepinfo else err)
finally:
    base = None
    connector = None

Для работы нужен пакет pywin32. Метод ОстаткиПоСкладуСтрокой в примере возвращает строку JSON — так проще передать результат во внешний мир.

Почему лучше вызывать один общий модуль

Через COM можно обращаться к справочникам, документам и запросам напрямую. Но каждое обращение к свойству — это отдельный вызов между процессами. Цикл по тысяче строк превращается в тысячи вызовов и идёт минутами.

Надёжная схема такая:

  • 🧩 в базе 1С создаётся общий модуль с флажком Внешнее соединение (и Сервер);
  • 📦 вся логика — запрос, обход, сборка результата — внутри одной экспортной функции;
  • 📤 наружу уходит примитивное значение: строка, число, дата или JSON.

Без флажка «Внешнее соединение» модуль из COM не виден, и вызов падает с ошибкой «Метод объекта не обнаружен ».

Объектная модель внешнего соединения

После Connect вы получаете объект, через который доступен серверный глобальный контекст базы. Через него видны коллекции Справочники, Документы, РегистрыСведений, глобальные методы и общие модули с нужным флагом.

Что работает и что нет:

ВозможностьЧерез COM-соединение
Запросы, чтение и запись объектов✅ Да
Общие модули с флагом «Внешнее соединение»✅ Да
Глобальные функции (ТекущаяДатаСеанса(), Формат() и др.)✅ Да
Формы, диалоги, Предупреждение()❌ Нет, клиентского контекста нет
Клиентские общие модули❌ Нет

Создание объектов и передача значений

Объекты платформы внутри внешней базы создают методом NewObject:

Запрос = База.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();

Обычный Новый Запрос создаст запрос в вашей базе, а не во внешней. Это частая ошибка при обмене между двумя базами 1С.

Примитивные типы (строка, число, дата, булево) передаются через COM как есть. Ссылки, структуры и таблицы значений остаются COM-объектами чужой базы. Передать ссылку из одной базы в другую напрямую нельзя: передавайте уникальный идентификатор строкой и ищите элемент на стороне приёмника.

Обработка ошибок и закрытие соединения

Любое исключение в коде 1С приходит к вызывающей стороне как ошибка COM. Текст исключения 1С при этом сохраняется, его достаточно вывести в журнал.

Типичные ошибки подключения

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

Как закрыть соединение

У COM-соединения нет метода «Отключиться». Сеанс завершается, когда освобождены все ссылки на объект базы и на объекты, полученные через него.

  • в 1С — присвойте переменным значение Неопределено;
  • в Python — None и выход из функции;
  • в VBScript — Set base = Nothing.

Если ссылка «утекла» в глобальную переменную или кеш, сеанс останется висеть и занимать лицензию. Такие сеансы видны в консоли кластера с типом приложения «COM-соединение».

Завершать висящие сеансы из консоли кластера можно, но скрипт, который в этот момент пишет данные, оборвётся посреди транзакции. Убедитесь, что обмен сейчас не идёт.

OLE Automation и внешние компоненты

OLE Automation: когда нужен клиент

Объект V83.Application запускает клиент 1С как отдельный процесс и даёт доступ к клиентскому контексту:

Приложение = Новый COMОбъект("V83.Application");
Приложение.Connect("File=""D:\Bases\Buh"";Usr=""Обмен"";Pwd=""пароль""");
Приложение.Visible = Ложь;
// ... работа с приложением ...
Приложение = Неопределено;

Свойство Visible управляет показом окна. Для пакетной работы держите его выключенным. Используйте OLE, только когда COM-соединения действительно мало. Каждый запуск — это загрузка полного клиента с памятью и временем старта, а у пользователя должно быть право «Автоматизация».

Внешние компоненты: 1С вызывает ваш код

Внешняя компонента работает в обратную сторону: это библиотека, которую загружает сама 1С. Так подключают сканеры, весы, кассы, криптографию и любые свои DLL.

Современный формат — Native API. Компоненту собирают для нужных ОС и разрядностей, упаковывают в ZIP с файлом MANIFEST.XML и кладут в общий макет конфигурации. Подключение на сервере:

Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаВесы", "Весы",
    ТипВнешнейКомпоненты.Native);
Если Не Подключено Тогда
    ВызватьИсключение "Не удалось подключить компоненту «Весы»";
КонецЕсли;

Весы = Новый("AddIn.Весы.Драйвер");

Последняя строка создаёт объект по шаблону AddIn.<имя подключения>.<имя класса>. Имя класса задаёт разработчик компоненты, его берут из документации к ней.

На клиенте компоненту сначала устанавливают, а потом подключают, причём асинхронно: методы НачатьУстановкуВнешнейКомпоненты и НачатьПодключениеВнешнейКомпоненты. При первой установке пользователь увидит запрос подтверждения.

💡 Компоненты в формате COM работают только на Windows. Если базу когда-нибудь перенесут на сервер под Linux, они перестанут подключаться. Новые компоненты пишите на Native API.

Права, лицензии и безопасность

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

Права пользователя

В роли на уровне всей конфигурации есть отдельные права на способы подключения:

  • 🔌 Внешнее соединение — для COM-соединения;
  • 🖥️ Автоматизация — для OLE Automation;
  • 🔑 права на объекты — как у обычного пользователя.

Не давайте интеграционному пользователю роль «Полные права». Создайте роль только с теми объектами, которые читает и пишет обмен. Утечка пароля из скрипта тогда не откроет доступ ко всей базе.

Пароли в скриптах

Строка подключения содержит пароль открытым текстом. Минимальные меры:

  1. Храните строку в отдельном файле настроек, а не в коде.
  2. Ограничьте доступ к этому файлу правами ОС: только учётная запись, от которой работает скрипт.
  3. Не публикуйте скрипт в общем репозитории вместе с настройками.

Если в базе включена аутентификация операционной системы, параметры Usr и Pwd можно не указывать. Тогда 1С сопоставит пользователя с учётной записью Windows, от которой запущен процесс.

Лицензии

Сеанс COM-соединения и сеанс OLE Automation занимают клиентскую лицензию, как обычный пользователь. Если обмен запускается каждые пять минут и не закрывает соединение, через час все лицензии могут оказаться заняты «призраками». Без свободной лицензии платформа просто не установит соединение.

Безопасный режим и профили безопасности

В клиент-серверном варианте администратор кластера может назначить базе профиль безопасности. Он ограничивает доступ к файловой системе, COM-объектам, внешним компонентам и интернету. Если на сервере компонента или Новый COMОбъект вдруг перестали работать после настройки профиля, первым делом проверьте, что эти действия в нём разрешены.

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

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

Работает ли COM-соединение на Linux?
Нет. COM — технология Windows. Для интеграции с базой на Linux используйте HTTP-сервисы, веб-сервисы или стандартный интерфейс OData через веб-публикацию.
Можно ли подключиться через COM к базе в облаке 1С:Фреш?
Нет. COM-соединению нужен прямой доступ к файлам базы или к серверу 1С. Облачные сервисы такого доступа не дают, там обмен идёт через веб-интерфейсы.
Что быстрее: COM-соединение или HTTP-сервис?
При одном вызове общего модуля разница невелика. COM дольше устанавливает соединение, зато не требует веб-сервера. Для частых коротких запросов по сети удобнее HTTP-сервис.
Можно ли держать одно COM-соединение открытым весь день?
Технически да, но сеанс всё это время занимает лицензию и память рабочего процесса. После обновления конфигурации или перезапуска сервера соединение порвётся, так что код всё равно должен уметь переподключаться.
Нужно ли менять интеграцию после обновления типовой конфигурации?
Если вы вызываете процедуры из области «ПрограммныйИнтерфейс» или свой общий модуль в расширении — обычно нет. Если обращаетесь к служебным процедурам или реквизитам напрямую, проверяйте обмен после каждого обновления.