Сверка платежей 1С ↔ legacy без потерь: транзакционный HTTP-мост вместо ODBC

Оператор речных круизов (анонимно) Клиент по соглашению не раскрывается; цифры и архитектура приведены в обезличенном виде. Туризм / речные круизы (B2B + B2C) 2026-06
0
потерь данных на боевой записи
идемпотентно
повторный прогон = 0 изменений
3 источника
безопасно в общей таблице
HMAC-SHA256
подпись вместо открытого пароля

Услуги

  • complex-systems
  • cybersecurity

Стек

  • 1С 8.3
  • PHP
  • MariaDB
  • HMAC-SHA256
  • HTTP/JSON

Задача

У оператора речных круизов учётная система обменивалась платежами с легаси веб-системой бронирования через прямой ODBC-доступ к базе сайта. Механизм «выгрузка за дату» удалял все строки за дату и заливал их заново.

Проблема не в «медленно», а в тихих потерях и задвоениях: грубый ключ сверки (по году), накопление мусора при повторных прогонах и — главное — несколько юрлиц и касс, пишущих в одну таблицу платежей. Любое «удалить всё за дату» могло задеть чужие строки. Бухгалтерия годами правила расхождения вручную.

Что сделали

Заменили прямой ODBC на транзакционную сверку (reconcile) по HTTP с подписью HMAC.

  • Эндпоинты на легаси-сервере. Серверную часть построили на боевом коде самого сайта: переиспользовали подключение к БД, процедуру пересчёта итогов и существующую инфраструктуру. шлёт набор платежей за дату — сервер сводит его с базой.
  • Точный бизнес-ключ. Сверка по «номер счёта + номер документа + тип кассы + день» вместо грубого «тип + год». Результат: совпало → ничего, изменилось → замена, новое → вставка, пропало → пометка удаления.
  • Append-only и тег провенанса. Ничего не затирается физически: старые версии помечаются удалёнными, наши вставки несут тег «пришло из ». Полный аудит-след.
  • Идемпотентность. Повторный прогон без изменений в не меняет в базе ничего — задвоения исчезают как класс.

Три предохранителя

Удаление — самая опасная операция, поэтому защит три:

  1. dry-run — сервер возвращает план (вставлю/заменю/удалю) без записи. Первый прогон на дате — всегда так.
  2. Гард пустого набора — при пустой выгрузке массовое удаление блокируется (сбой формы не снесёт партицию). Уже сработал в бою: вместо «удалить 101 строку» — ноль.
  3. Скоуп по серии документа — у каждого источника свой префикс номера. Сверка трогает только присланные серии; чужие в общей таблице защищены.

Результат

Проверка на копии боевой базы, поэлементно до и после:

  • noop — идемпотентный прогон, нулевая запись;
  • replace — изменение двух документов: старые версии в архив, новые с тегом моста;
  • insert — новый документ добавлен;
  • protected — строки чужих источников (другое юрлицо, касса) не тронуты ни в одном прогоне;
  • краевой случай с «не той датой» обработан корректно, фантомных строк нет.

Потерь данных — ноль. Партиция до и после боевой записи совпала по всем чужим строкам; наши изменения помечены тегом; аудит-след полон.

Технологии

Серверная часть — PHP на легаси-стеке, БД — MariaDB (сверка без оконных функций и CTE, всё на подготовленных запросах). Подпись — HMAC-SHA256 от тела запроса. Сторона — штатные средства платформы 8.3 (HTTP-соединение, JSON, хеширование).

Что дальше

Ядро обмена доказано на боевой записи на тест-контуре. До продакшена: вернуть полную схему подписи для прода, приёмка бухгалтерией и разведение имён баз для нескольких источников.

Технический разбор подхода в блоге →

Часто задаваемые вопросы

Почему не оставили прямой ODBC-обмен?
Прямой ODBC «удалить всё за дату и вставить заново» работал по грубому ключу (по году), накапливал задвоения и при общей таблице нескольких юрлиц рисковал снести данные соседа. Транзакционная сверка по точному ключу убирает эти классы ошибок и делает обмен идемпотентным.
Меняли ли вы конфигурацию 1С?
Минимально. Логику сбора платежей оставили прежней, заменили только «точку выхода»: вместо прямого ODBC к БД сайта — вызов HTTP-эндпоинта с подписью. Серверную часть построили на боевом коде легаси-системы, переиспользуя подключение к БД и пересчёт итогов.
Как проверяли, что ничего не потеряется?
Прогоном на копии боевой базы с поэлементной сверкой до и после: идемпотентный прогон (noop), изменение документа (replace), создание (insert), и контроль, что строки других источников помечены protected и не удаляются. Партиция до и после совпала по всем чужим строкам.
Что осталось до продакшена?
Вернуть полную схему HMAC для прода, пройти приёмку бухгалтерией и развести имена баз для нескольких источников. Ядро обмена проверено на боевой записи на тест-контуре.

Похожая задача?

Расскажите контекст — подскажем, что и как делать.