Сверка платежей 1С ↔ legacy без потерь: транзакционный HTTP-мост вместо ODBC
Услуги
- complex-systems
- cybersecurity
Стек
- 1С 8.3
- PHP
- MariaDB
- HMAC-SHA256
- HTTP/JSON
Задача
У оператора речных круизов учётная система 1С обменивалась платежами с легаси веб-системой бронирования через прямой ODBC-доступ к базе сайта. Механизм «выгрузка за дату» удалял все строки за дату и заливал их заново.
Проблема не в «медленно», а в тихих потерях и задвоениях: грубый ключ сверки (по году), накопление мусора при повторных прогонах и — главное — несколько юрлиц и касс, пишущих в одну таблицу платежей. Любое «удалить всё за дату» могло задеть чужие строки. Бухгалтерия годами правила расхождения вручную.
Что сделали
Заменили прямой ODBC на транзакционную сверку (reconcile) по HTTP с подписью HMAC.
- Эндпоинты на легаси-сервере. Серверную часть построили на боевом коде самого сайта: переиспользовали подключение к БД, процедуру пересчёта итогов и существующую инфраструктуру. 1С шлёт набор платежей за дату — сервер сводит его с базой.
- Точный бизнес-ключ. Сверка по «номер счёта + номер документа + тип кассы + день» вместо грубого «тип + год». Результат: совпало → ничего, изменилось → замена, новое → вставка, пропало → пометка удаления.
- Append-only и тег провенанса. Ничего не затирается физически: старые версии помечаются удалёнными, наши вставки несут тег «пришло из 1С». Полный аудит-след.
- Идемпотентность. Повторный прогон без изменений в 1С не меняет в базе ничего — задвоения исчезают как класс.
Три предохранителя
Удаление — самая опасная операция, поэтому защит три:
- dry-run — сервер возвращает план (вставлю/заменю/удалю) без записи. Первый прогон на дате — всегда так.
- Гард пустого набора — при пустой выгрузке массовое удаление блокируется (сбой формы не снесёт партицию). Уже сработал в бою: вместо «удалить 101 строку» — ноль.
- Скоуп по серии документа — у каждого источника свой префикс номера. Сверка трогает только присланные серии; чужие в общей таблице защищены.
Результат
Проверка на копии боевой базы, поэлементно до и после:
- noop — идемпотентный прогон, нулевая запись;
- replace — изменение двух документов: старые версии в архив, новые с тегом моста;
- insert — новый документ добавлен;
- protected — строки чужих источников (другое юрлицо, касса) не тронуты ни в одном прогоне;
- краевой случай с «не той датой» обработан корректно, фантомных строк нет.
Потерь данных — ноль. Партиция до и после боевой записи совпала по всем чужим строкам; наши изменения помечены тегом; аудит-след полон.
Технологии
Серверная часть — PHP на легаси-стеке, БД — MariaDB (сверка без оконных функций и CTE, всё на подготовленных запросах). Подпись — HMAC-SHA256 от тела запроса. Сторона 1С — штатные средства платформы 8.3 (HTTP-соединение, JSON, хеширование).
Что дальше
Ядро обмена доказано на боевой записи на тест-контуре. До продакшена: вернуть полную схему подписи для прода, приёмка бухгалтерией и разведение имён баз для нескольких источников.
Часто задаваемые вопросы
Почему не оставили прямой ODBC-обмен?
Меняли ли вы конфигурацию 1С?
Как проверяли, что ничего не потеряется?
Что осталось до продакшена?
Похожая задача?
Расскажите контекст — подскажем, что и как делать.