Skip to content

Биллинг

Биллинг — это не отдельная база, а способ использовать зеркало транзакций в Postgres (см. Где живут данные) для сверки денег между нами и мерчантом. Раз в сутки данные забирает 1С, режет их на периоды, и эти периоды дальше живут своей жизнью: по ним финансисты выставляют счета и платят, по ним мерчанту приходит выгрузка в личном кабинете, по ним у мерчанта работает бухгалтерия.

Как это выглядит целиком

Кто забирает данные и когда

Каждый день в 5:00 по Москве 1С обращается в aggregation-service по GET /billing/excel и забирает успешные операции за прошлые сутки: с 00:00:00 по 23:59:59 по часовому поясу +3, независимо от того, в каком часовом поясе физически стоят наши серверы — таймзону 1С передаёт явно параметром timezone в запросе.

Выборка идёт по endDate — дате, когда операция получила финальный результат, а не по дате создания. Это важно: платёж, созданный вечером 12 марта, но завершённый банком уже 13 марта, попадёт в период 13 марта, а не 12-го.

Что 1С делает с ответом

1С не хранит наши транзакции — он строит из ответа периоды и фиксирует их у себя в реестре. Одна строка реестра выглядит так:

ДатаМерчантСчётБанкСуммаID первой операцииID последней операции
12.03.2026testtestGreatBank1200 EUR......

То есть период — это агрегат «мерчант + счёт + банк + дата» с суммой и границами по операциям, которые в этот агрегат попали. Дальше с этими периодами работают три разных потребителя:

  • финансисты по периоду решают, запросить ли деньги с мерчанта или выплатить мерчанту;
  • личный кабинет мерчанта строит те же выгрузки за те же периоды тем же запросом /billing/excel;
  • бухгалтерия мерчанта сверяется по этим же отчётам — то есть мерчант видит ровно те цифры, что легли в реестр 1С.

Почему нельзя менять статус операции, которая уже ушла в биллинг

Реестр 1С — это не отчёт, который можно перестроить: он уже стал основанием для реального движения денег или для документов у мерчанта. Отсюда два жёстких правила для любого кода, трогающего статус транзакции после финализации:

Нельзя менять статус операции, которая уже ушла с терминальным статусом в биллинг. Если успешную операцию, которую 1С уже учла в периоде за одну дату, задним числом передвинуть на другую дату (поменять endDate), она задвоится: старый период её не потеряет, потому что 1С к нему уже не возвращается, а новый период получит её повторно. Суммы в реестре и в выгрузке мерчанта разойдутся, и без ручной сверки это не заметить.

Единственное безопасное направление — из неуспеха в успех, и только если операция ещё никогда не была успешной. Такая операция ещё не попадала в /billing/excel ни в каком периоде, поэтому её появление в следующей выборке ничего не задвоит.

Любое другое изменение статуса — это не просто правка поля, а сторно. Если успешную операцию нужно аннулировать или пересчитать, старое значение нельзя просто перезаписать — по нему уже стоит период в реестре 1С и, возможно, уже прошла выплата или списание. Изменение фиксируется отдельной операцией (сторнирующей записью), которая попадёт в свой собственный будущий период, а не тихо поправит прошлый.

Внутренняя база знаний. Нашли неточность — поправьте страницу или заведите вопрос в разделе «Открытые вопросы».