Как внешняя программа работает с базой 1С:Предприятие 8.3 через COM, OLE и компоненты
Содержание
Программный интерфейс 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 API | 1С → ваша библиотека | Windows и Linux | Работа с оборудованием, своими DLL, нестандартными протоколами |
| Внешняя компонента COM | 1С → COM-объект | Только Windows | Старые компоненты, которые уже написаны под COM |
| HTTP-сервисы, OData | Любая программа → веб-публикация базы | Любая ОС | Интеграция по сети, мобильные приложения, сайты |
💡 Главное различие COM и OLE: COM-соединение не открывает окно программы и работает в серверном контексте. OLE Automation запускает полноценный клиент 1С как отдельный процесс. Поэтому OLE заметно тяжелее и медленнее стартует.
Ещё одно понятие часто путают с технологиями. В конфигурациях на базе БСП у общих модулей есть область #Область ПрограммныйИнтерфейс. Туда разработчики выносят экспортные процедуры, которые разрешено вызывать извне. Их сигнатуры фирма старается не менять между релизами. Если вы пишете интеграцию с типовой конфигурацией, опирайтесь на эти процедуры, а не на внутренние служебные.
Подготовка: регистрация comcntr.dll и параметры строки подключения
COM-соединение появляется в системе только после регистрации библиотеки comcntr.dll. Установщик платформы делает это не всегда, особенно если компонента «Сервер 1С:Предприятия» или COM-соединение не были отмечены.
Как зарегистрировать вручную:
- Откройте командную строку от имени администратора.
- Найдите папку нужной версии платформы, например
C:\Program Files\1cv8\8.3.24.1342\bin. - Выполните регистрацию:
regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\comcntr.dll"
- Дождитесь сообщения об успешной регистрации.
Разрядность должна совпадать. 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;
- 🔑 права на объекты — как у обычного пользователя.
Не давайте интеграционному пользователю роль «Полные права». Создайте роль только с теми объектами, которые читает и пишет обмен. Утечка пароля из скрипта тогда не откроет доступ ко всей базе.
Пароли в скриптах
Строка подключения содержит пароль открытым текстом. Минимальные меры:
- Храните строку в отдельном файле настроек, а не в коде.
- Ограничьте доступ к этому файлу правами ОС: только учётная запись, от которой работает скрипт.
- Не публикуйте скрипт в общем репозитории вместе с настройками.
Если в базе включена аутентификация операционной системы, параметры Usr и Pwd можно не указывать. Тогда 1С сопоставит пользователя с учётной записью Windows, от которой запущен процесс.
Лицензии
Сеанс COM-соединения и сеанс OLE Automation занимают клиентскую лицензию, как обычный пользователь. Если обмен запускается каждые пять минут и не закрывает соединение, через час все лицензии могут оказаться заняты «призраками». Без свободной лицензии платформа просто не установит соединение.
Безопасный режим и профили безопасности
В клиент-серверном варианте администратор кластера может назначить базе профиль безопасности. Он ограничивает доступ к файловой системе, COM-объектам, внешним компонентам и интернету. Если на сервере компонента или Новый COMОбъект вдруг перестали работать после настройки профиля, первым делом проверьте, что эти действия в нём разрешены.