Интеграция: 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 |
Мониторинг¶
- Debezium lag - отставание от WAL
- Connector status - проверка работоспособности
- 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 '%Заказ%';