Перейти к содержанию

Интеграция: PostgreSQL/MSSQL (1С) → API Gateway

Архитектура

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  PostgreSQL     │────▶│    Debezium     │────▶│   API Gateway   │
│  или MSSQL      │     │  CDC Connector  │     │     (mTLS)      │
│  (БД 1С)        │     │  + Avro Convert │     │                 │
└─────────────────┘     └─────────────────┘     └──────┬──────────┘
                                                 ┌─────────────────┐
                                                 │  Kafka raw      │
                                                 └─────────────────┘

Варианты интеграции

1. CDC через Debezium (Рекомендуется)

Для: Real-time данных (заказы, платежи, остатки)

Плюсы: - Минимальная задержка (~секунды) - Автоматическая отправка при изменениях - Не нагружает 1С - Guaranteed delivery

Минусы: - Требует настройки Debezium - Нужен PostgreSQL с logical replication или MSSQL с CDC

Пример конфигурации Debezium для PostgreSQL

{
  "name": "1c-orders-connector",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "database.hostname": "1c-db.company.local",
    "database.port": "5432",
    "database.user": "debezium_user",
    "database.password": "${file:/secrets/debezium-password}",
    "database.dbname": "trade_database",
    "database.server.name": "1c_trade",

    "table.include.list": "public._document263,public._document263_goods",

    "plugin.name": "pgoutput",
    "slot.name": "debezium_1c_orders",
    "publication.name": "orders_publication",

    "transforms": "unwrap,rename,route",

    "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
    "transforms.unwrap.drop.tombstones": "false",

    "transforms.rename.type": "org.apache.kafka.connect.transforms.ReplaceField$Value",
    "transforms.rename.renames": "_idrref:order_id,_fld263sp4:customer_id,_fld263:total_amount",

    "transforms.route.type": "org.apache.kafka.connect.transforms.RegexRouter",
    "transforms.route.regex": ".*",
    "transforms.route.replacement": "sales.orders.raw"
  }
}

Важно: Таблицы в 1С PostgreSQL имеют служебные имена (типа _document263). Нужно: 1. Найти нужную таблицу в БД 1С 2. Настроить mapping полей в transforms

SQL для создания publication в PostgreSQL

-- На сервере PostgreSQL с БД 1С
CREATE PUBLICATION orders_publication FOR TABLE public._document263;

-- Проверка
SELECT * FROM pg_publication_tables WHERE pubname = 'orders_publication';

2. Batch экспорт из БД (Для справочников и истории)

Для: Справочники, исторические данные, периодические выгрузки

Плюсы: - Простая реализация - Контролируемая нагрузка - Легко тестировать

Минусы: - Задержка (зависит от расписания) - Не для real-time данных

Python скрипт для batch экспорта

См. файл batch_producer.py в этой директории - он читает напрямую из PostgreSQL/MSSQL базы 1С и отправляет в API Gateway.

3. Триггеры БД + NOTIFY (Hybrid)

Для: Средний путь между CDC и batch

PostgreSQL триггер →LISTEN/NOTIFY → Python consumer → API Gateway

См. пример в ../postgresql/notify_listener.py

Типичные схемы БД 1С

PostgreSQL (1С:Предприятие 8.3+)

Структура:

_document263           - Документ "Заказ клиента" (заголовок)
_document263_goods     - Табличная часть "Товары"
_reference115          - Справочник "Контрагенты"
_reference142          - Справочник "Номенклатура"

Соединение полей:

-- Пример запроса для получения заказов
SELECT 
    doc._idrref AS order_id,
    doc._number AS order_number,
    doc._fld263sp4 AS customer_ref,
    doc._fld263 AS total_amount,
    doc._date_time AS created_at
FROM public._document263 AS doc
WHERE doc._marked = 0  -- не помечен на удаление
  AND doc._posted = 1  -- проведён

MSSQL (1С:Предприятие 8.2+)

Аналогичная структура, но с учётом особенностей MSSQL CDC.

Рекомендации

Что использовать когда

Данные Частота Метод
Заказы Real-time CDC (Debezium)
Платежи Real-time CDC (Debezium)
Остатки Real-time CDC (Debezium)
Справочники 1/день Batch ETL
История (backfill) Однократно Batch ETL

Мониторинг

  1. Debezium lag - отставание от WAL
  2. Connector status - проверка работоспособности
  3. Schema changes - алерты при изменении структуры БД 1С

Troubleshooting

Проблема: Debezium не видит изменения

Решение:

-- Проверить replication slot
SELECT * FROM pg_replication_slots WHERE slot_name = 'debezium_1c_orders';

-- Проверить publication
SELECT * FROM pg_publication_tables WHERE pubname = 'orders_publication';

Проблема: Неизвестные имена таблиц 1С

Решение:

-- Найти таблицу по комментарию
SELECT 
    c.relname AS table_name,
    d.description 
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_description d ON d.objoid = c.oid
WHERE n.nspname = 'public'
  AND c.relkind = 'r'
  AND d.description LIKE '%Заказ%';

Дополнительные материалы