Перейти к основному содержимому

Отслеживание субсидий

Назначение и аудитория

Для аналитиков и контролёров, которым нужно связать юридически оформленное соглашение о предоставлении средств из федерального бюджета с отчётностью получателя и понять, где обрывается цепочка (план → соглашение → выплата → отчёт).

Входные данные

  • Каталог открытых наборов ГИИСhttps://budget.gov.ru/epbs/opendata/list.json; набор 7710568760-REGISTAGREEMENT — реестр соглашений (см. Работа с API budget.gov.ru и карточку реестра соглашений).
  • Паспорт набораmeta.json по полю link из каталога (нормализация префикса null/ — в how-to по API портала).
  • Открытые данные получателейbus.gov.ru (сведения об учреждениях и отчётность в объёме витрины).
  • Иные контуры — президентские гранты, НКО: отдельные порталы; в общий регистр не подмешивайте без явного признака источника.
  • Правовые типысубсидии, трансферты; в одном реестре на портале могут соседствовать разные виды документов.

Инструменты

  • Python 3 со csv для склейки выгрузок по ИНН (и при необходимости КПП, году, КБК); pandas удобен на больших файлах, но не обязателен.
  • requests + json — для list.json и meta.json на budget.gov.ru (см. how-to по API).
  • Браузер — для выборочной проверки карточек соглашений на портале.

Шаги

  1. Согласуйте объект — одно соглашение / один получатель / одна программа; зафиксируйте отчётный год.
  2. Загрузите реестр из открытого набора ГИИС: каталог → паспорт → CSV (или REST, если раскрыт для вашего среза) по инструкции budget.gov.ru.
  3. Нормализуйте ключиИНН как строка из 10/12 символов без «форматирующих» пробелов; КБК — единая длина и разделители.
  4. Подтяните отчётность получателя с bus.gov.ru (или иного канала по отчётности получателей субсидий).
  5. Соедините merge по ИНН (+ год, + КБК при необходимости); пустые соединения анализируйте отдельно (филиал vs головной контрагент, смена ИНН).
  6. Документируйте дату выгрузки каждого файла — витрины обновляются независимо.

Воспроизводимый пример

Учебные CSV в памяти имитируют фрагмент реестра соглашений и фрагмент отчётности получателя. В бою замените строки на чтение файлов, скачанных с budget.gov.ru и bus.gov.ru после прохождения шагов из Работа с API budget.gov.ru и bus.gov.ru.

import csv
import io

AGREEMENTS_CSV = """agreement_id,customer_inn,customer_kbk,amount_rub,period_year
AGR-2024-001,7700000000,00000000000000000000,1500000,2024
AGR-2024-002,7700000001,00000000000000000000,2000000,2024
"""

REPORTS_CSV = """inn,report_year,subsidy_reported_rub
7700000000,2024,1400000
9999999999,2024,1
"""

reports_idx = {}
for row in csv.DictReader(io.StringIO(REPORTS_CSV)):
reports_idx[(row["inn"], row["report_year"])] = row["subsidy_reported_rub"]

for row in csv.DictReader(io.StringIO(AGREEMENTS_CSV)):
key = (row["customer_inn"], row["period_year"])
reported = reports_idx.get(key)
status = "both" if reported is not None else "agreement_only"
print(
row["agreement_id"],
row["amount_rub"],
reported or "",
status,
)

Ожидаемо: у AGR-2024-001 статус both и сумма отчётности 1400000, у AGR-2024-002agreement_only и пустое поле отчётности; ИНН 9999999999 остаётся только в файле отчётности («сирота» относительно этого фрагмента реестра).

Проверка результата

  • Число строк со статусом both совпадает с ожидаемым числом сопоставлений по ключу (ИНН, год).
  • Для учебного примера у AGR-2024-001 в последней колонке суммы отчётности выводится 1400000.
  • На реальных данных — выборочная сверка 2–3 соглашений с HTML-карточками на budget.gov.ru и профилем на bus.gov.ru.

Ограничения и типовые ошибки

  • Разные юрлица — головной получатель и филиал: ошибочный merge только по ИНН без КПП/филиальной логики.
  • Суммы — соглашение в плановых лимитах, отчётность — в фактическом исполнении; не сравнивайте без уточнения поля.
  • Каталог list.json крупный — задавайте таймаут 60–120 с и User-Agent (см. how-to по API).
  • Не всё в открытых наборах — часть атрибутов только в интерфейсе ГИИС; выводы о полноте — по паспорту набора.

Связанные страницы