Сведения о специальных налоговых режимах, применяемых налогоплательщиками
| Признак | Значение |
|---|---|
| Уровень и охват | Федеральный срез юридических лиц, для которых опубликован хотя бы один из признаков применения ЕСХН, УСН, АУСН или режима СРП |
| Тип доступа | Паспорт открытых данных ФНС со ссылкой на текущий ZIP; стабильный API и каталог предыдущих выпусков для этого набора не заявлены |
| Основные форматы | ZIP с XML в UTF-8; отдельные официальные XSD и описание формата в DOC |
| Оператор | ФНС России |
| Режим доступа | Открытое скачивание по типовым условиям использования открытых данных |
Коротко: набор 7707329152-snr — это снимок статуса специальных налоговых режимов юридических лиц, а не журнал переходов между режимами и не реестр всех налогоплательщиков. Для каждого ИНН ЮЛ в текущем срезе передаются наименование и четыре независимых бинарных признака: ЕСХН, УСН, АУСН и режим при выполнении соглашения о разделе продукции (СРП). Это удобный источник обогащения организации по ИНН, если анализ привязан к дате снимка.
Качество и верификация
Проверка выполнена 2026-07-19 по паспорту ФНС, текущему ZIP, официальной XSD и приложенному описанию формата версии 4.02. Были скачаны и разобраны все XML текущего ZIP; 1 503 из 1 503 файлов валидны по XSD.
| Измерение | Значение для этой карточки |
|---|---|
Дата проверки (last_verified) | 2026-07-19 |
Полнота (data_completeness) | Полный текущий файл был прочитан целиком: 1 353 132 Документ. Охват набора при этом частичный относительно всех налогоплательщиков: паспорт говорит только о юридических лицах; ИП в этот XML не входят. |
Машиночитаемость (machine_readability) | ZIP размером 64 318 574 байта с 1 503 XML UTF-8 (573 668 019 байт после распаковки), официальная XSD и DOC-описание доступны по прямым ссылкам. |
Юридическая значимость (legal_significance) | Официальная публикация ФНС. Паспорт ссылается на приказ ФНС России от 29.12.2016 № ММВ-7-14/729@ и на сведения, раскрываемые по п. 1.1 ст. 102 НК РФ. |
| Дата состояния данных | Во всех 1 353 132 записях Документ/@ДатаСост — 01.06.2026. Это дата среза, а не дата публикации ZIP. |
| Дата формирования / публикации | Во всех записях @ДатаДок — 25.06.2026; паспорт помечен как изменённый 25.06.2026. HTTP-заголовок ZIP и метки членов ZIP имеют дату 26.06.2026 / 25.06.2026 соответственно — это технические даты объекта и архива, не дата состояния данных. |
Задержка обновления (update_lag) | Между состоянием 01.06.2026 и формированием 25.06.2026 — 24 дня. Целевой или гарантированный лаг ФНС в паспорте не заявляет. |
| Заявленная периодичность | В паспорте нет поля с периодичностью. |
| Наблюдаемая периодичность | Недостаточно данных для вывода: паспорт показывает один текущий ZIP, а строка «предыдущие релизы набора» пуста. Не следует считать выпуск ежемесячным или регулярным. |
Глубина архива (archive_depth) | На 2026-07-19 официальный паспорт не даёт URL предыдущих релизов или прежних XSD. Подтверждён только текущий выпуск; наличие файлов по предсказуемым адресам ТРЕБУЕТ ПРОВЕРКИ при каждом обновлении. |
| Версия формата и схема | Файл/@ВерсФорм="4.02" во всех XML; XSD structure-20230425.xsd; DOC прямо называет формат 4.02, часть 213_13. |
Лицензия (license_or_terms) | Типовые условия использования общедоступной информации в форме открытых данных: указывайте источник и не создавайте ложного впечатления об актуальности или изменении данных. |
Описание
Паспорт идентифицирует набор как «Сведения о специальных налоговых режимах, применяемых налогоплательщиками» с идентификатором 7707329152-snr. В нём содержатся сведения о юридических лицах, применяющих специальные налоговые режимы. Текущая структура публикует ровно четыре режима: единый сельскохозяйственный налог (ЕСХН), упрощённую систему налогообложения (УСН), автоматизированную УСН (АУСН) и систему налогообложения при выполнении соглашения о разделе продукции (СРП).
Ключевые слова паспорта также упоминают ЕНВД, но в текущей XSD и во всех проверенных XML нет ни поля ПризнЕНВД, ни другого поля ЕНВД. Не добавляйте такой столбец при загрузке и не пытайтесь вывести его из других признаков.
Один выпуск — снимок на Документ/@ДатаСост. В нём нет даты начала или прекращения режима, причины изменения, суммы налога либо события перехода. Поэтому изменение между двумя выпусками — только наблюдаемая разница между снимками, а не документально подтверждённое событие смены режима.
В объём карточки не входят сведения об ИП: для них ФНС публикует отдельный набор 7707329152-snrip. Не подменяйте этот набор агрегированной налоговой статистикой ФНС или выпиской из ЕГРЮЛ.
Оператор
Федеральная налоговая служба — каталог открытых данных.
- Карточка ИС: Сайт ФНС России — статистика и данные — общий контур публикации открытых данных ФНС.
URL и точки доступа
| Тип доступа | URL | Формат / состояние проверки |
|---|---|---|
| Паспорт: метаданные и актуальная ссылка | https://www.nalog.gov.ru/opendata/7707329152-snr | HTML; проверен 2026-07-19 |
| Актуальный проверенный выпуск | https://file.nalog.ru/opendata/7707329152-snr/data-20260625-structure-20230425.zip | ZIP, 64 318 574 байта; 1 503 XML |
| Официальная схема текущей структуры | https://file.nalog.ru/opendata/7707329152-snr/structure-20230425.xsd | XSD, 13 116 байт, UTF-8 |
| Описание формата | https://file.nalog.ru/opendata/7707329152-snr/VO_OTKRDAN1_2_213_13_04_02.doc | DOC, 7 страниц; формат 4.02 |
| Предыдущие релизы / XSD | — | В соответствующих строках паспорта нет ссылок на 2026-07-19; архивный URL не публикуется. |
Не встраивайте URL ZIP из второй строки в постоянный планировщик: ФНС может сменить имя файла и дату в нём. Перед новой загрузкой получите ссылку из строки паспорта «Гиперссылка (URL) на набор», затем сохраните сам URL и время получения в журнале загрузки.
Объекты данных и показатели
- Одна запись —
Файл/Документ: один юридический налогоплательщик на датуДокумент/@ДатаСост. В проверенном срезе каждому ИНН соответствует одна запись. - Идентификатор организации —
СведНП/@ИННЮЛ: только 10-значный ИНН ЮЛ. Храните его строкой; это основной ключ для внешней склейки. - Статусы — четыре обязательных флага в
СведСНР. Значение1означает «да»,0— «нет» только для соответствующего режима. - Технические метаданные — идентификатор файла, идентификатор документа, версии и даты. Они нужны для воспроизводимости загрузки, но
ИдДокне следует считать постоянным внешним ключом организации. - Не публикуются: КПП, ОГРН, ОКВЭД, ОКТМО, адрес, регистрационный статус, даты начала/окончания любого режима, сведения об ИП, налоговая база, начисления и уплаты. Их отсутствие подтверждено текущими XSD и XML, а не выведено из названия набора.
Структура файлов (XML-схема)
Формат, упаковка и версионирование
- Паспорт называет форматом
xml, но фактическая ссылка ведёт на ZIP. Внутри текущего выпуска 1 503 XML без каталогов; один XML содержит 900 или 901Документ. - XML-декларация каждого проверенного файла:
<?xml version="1.0" encoding="UTF-8"?>. Пространство имён в фактических XML не используется. - Корневой элемент —
Файл; XML-порядок фиксирован XSD: сначалаИдОтпр, затемДокумент1..N. - Актуальные файлы используют
@ВерсФорм="4.02",@ВерсПрог="1.0",@ТипИнф="ОТКРДАННЫЕ1". Формат 4.02 ограничен этими константами в официальной XSD. - Описание формата задаёт имя схемы по старому шаблону
VO_OTKRDAN1_2_213_13_04_02_xx.xsd, но паспорт отдаёт файлstructure-20230425.xsd. Аналогично в тексте DOC префикс XML указан какVO_OTKRDAN1, а реальные имена имеют видVO_OTKRDAN_1_9965_9965_20260625_<GUID>.xml. Поэтому не проверяйте имя регулярным выражением из DOC: проверяйте документированное условие XSD —Файл/@ИдФайлравно имени XML без.xml. - Паспорту не известны предыдущие схемы и не описана совместимость версий. При новом
@ВерсФормскачайте XSD, проведите контрактное сравнение и обрабатывайте неизвестную версию как несовместимую, пока обратная совместимость не подтверждена ФНС. ТРЕБУЕТ ПРОВЕРКИ: утверждать её заранее нельзя.
Дерево и кардинальность
Файл (1)
├── @ИдФайл, @ВерсФорм, @ТипИнф, @КолДок (по 1)
├── @ВерсПрог (0..1)
├── ИдОтпр (1)
│ ├── @ДолжОтв, @Тлф, @E-mail (по 0..1)
│ └── ФИООтв (1)
│ └── @Фамилия, @Имя (по 1); @Отчество (0..1)
└── Документ (1..N)
├── @ИдДок, @ДатаДок, @ДатаСост (по 1)
├── СведНП (1) → @НаимОрг, @ИННЮЛ (по 1)
└── СведСНР (1) → @ПризнЕСХН, @ПризнУСН, @ПризнАУСН, @ПризнСРП (по 1)
В этой версии нет веток choice: СведНП и СведСНР всегда присутствуют, а четыре флага не взаимоисключающие. В текущем выпуске встречаются сочетания УСН=1, АУСН=1 (1 031 запись), ЕСХН=1, УСН=1 (202) и ЕСХН=1, АУСН=1 (1). Не заменяйте четыре колонки единственным enum и не вводите правило «ровно один режим».
Компактный обезличенный скелет реального формата:
<?xml version="1.0" encoding="UTF-8"?>
<Файл ИдФайл="VO_OTKRDAN_1_9965_9965_20260625_<GUID>"
ВерсФорм="4.02" ВерсПрог="1.0" ТипИнф="ОТКРДАННЫЕ1" КолДок="900">
<ИдОтпр>
<ФИООтв Фамилия="<ФАМИЛИЯ>" Имя="<ИМЯ>"/>
</ИдОтпр>
<Документ ИдДок="<GUID>" ДатаДок="25.06.2026" ДатаСост="01.06.2026">
<СведНП НаимОрг="<НАИМЕНОВАНИЕ_ЮЛ>" ИННЮЛ="<ИНН_ИЗ_10_ЦИФР>"/>
<СведСНР ПризнЕСХН="0" ПризнУСН="1" ПризнАУСН="0" ПризнСРП="0"/>
</Документ>
</Файл>
ИдОтпр/ФИООтв содержит имя и фамилию ответственного лица. Это служебные контактные метаданные, не атрибут организации; их значения намеренно обезличены в этой карточке и обычно не нужны в аналитической таблице.
Полный словарь полей
Типы, обязательность и коды ниже взяты из официальной XSD и DOC. Наблюдения в последней колонке относятся к полностью проверенному срезу на 01.06.2026. Обязательность указана относительно родительского элемента.
| XML-путь | Нормализованное имя | Тип и формат | Обязательность | Семантика | Допустимые значения / справочник | Пример | Замечания для обработки |
|---|---|---|---|---|---|---|---|
Файл | source_file | сложный элемент | 1 | Корень обменного XML | — | Файл | Один XML-член ZIP; не путать с ZIP-выпуском. |
Файл/@ИдФайл | source_file_id | строка T(1-255) | 1 | Идентификатор XML-файла | Имя файла без расширения | <ИМЯ_XML_БЕЗ_.xml> | Проверяйте равенство basename XML без .xml; совпало во всех 1 503 файлах. |
Файл/@ВерсФорм | format_version | строка T(1-5) | 1 | Версия логического формата | Только 4.02 в текущей XSD | 4.02 | Сохраняйте с каждой записью или в таблице файла; по ней выбирается схема. |
Файл/@ТипИнф | information_type | строка T(1-50) | 1 | Тип передаваемой информации | Только ОТКРДАННЫЕ1 | ОТКРДАННЫЕ1 | Проверка константы защищает от ошибочно подложенного XML другого набора. |
Файл/@ВерсПрог | producer_version | строка T(1-40) | 0..1 | Версия программы формирования | XSD не задаёт словарь | 1.0 | Поле необязательно по XSD, но присутствовало во всех проверенных XML. Не используйте как версию схемы. |
Файл/@КолДок | declared_record_count | целое N(9), ≥ 1 | 1 | Заявленное число Документ в XML-файле | Положительное целое | 900 | Сверяйте с фактическим счётчиком: в выпуске 900 или 901, расхождений нет. |
Файл/ИдОтпр | sender | сложный элемент | 1 | Сведения об отправителе | — | ИдОтпр | Служебный контейнер; не является организацией из СведНП. |
Файл/ИдОтпр/@ДолжОтв | sender_position | строка T(1-100) | 0..1 | Должность ответственного лица | Свободный текст | <ДОЛЖНОСТЬ> | Во всех проверенных XML отсутствует; не трактуйте отсутствие как код «нет». |
Файл/ИдОтпр/@Тлф | sender_phone | строка T(1-20) | 0..1 | Контактный телефон | Свободный текст | <ТЕЛЕФОН> | Во всех проверенных XML отсутствует; не включайте в витрину организации без необходимости. |
Файл/ИдОтпр/@E-mail | sender_email | строка T(1-45) | 0..1 | Контактный e-mail | Свободный текст | <EMAIL> | Во всех проверенных XML отсутствует. |
Файл/ИдОтпр/ФИООтв | sender_person | сложный элемент | 1 | ФИО ответственного лица | Тип ФИОТип | ФИООтв | Служебные персональные данные; в факт-таблицу не переносить. |
Файл/ИдОтпр/ФИООтв/@Фамилия | sender_last_name | строка T(1-60) | 1 | Фамилия ответственного лица | Свободный текст | <ФАМИЛИЯ> | Присутствует во всех XML; не публикуйте значения в примерах и логах. |
Файл/ИдОтпр/ФИООтв/@Имя | sender_first_name | строка T(1-60) | 1 | Имя ответственного лица | Свободный текст | <ИМЯ> | Присутствует во всех XML; не ключ и не характеристика налогоплательщика. |
Файл/ИдОтпр/ФИООтв/@Отчество | sender_patronymic | строка T(1-60) | 0..1 | Отчество ответственного лица | Свободный текст | <ОТЧЕСТВО> | В проверенном выпуске отсутствует во всех XML. |
Файл/Документ | record | сложный элемент | 1..N | Одна запись налогоплательщика в срезе | — | Документ | Фактическая гранулярность — ЮЛ × дата состояния. |
Файл/Документ/@ИдДок | source_record_id | строка T(1-36) | 1 | Технический идентификатор документа | DOC рекомендует GUID | <GUID> | Уникален в проверенном срезе, но не документирован как постоянный ключ между выпусками. |
Файл/Документ/@ДатаДок | document_formed_at | строка T(=10), ДД.ММ.ГГГГ | 1 | Дата формирования документа | Допустимый календарный день 1900–2099 | 25.06.2026 | Преобразуйте строго в date; это не дата режима и не дата среза. |
Файл/Документ/@ДатаСост | as_of_date | строка T(=10), ДД.ММ.ГГГГ | 1 | Дата, по состоянию на которую подготовлены данные | Допустимый календарный день 1900–2099 | 01.06.2026 | Основная дата снимка; не берите дату из имени ZIP вместо неё. |
Файл/Документ/СведНП | taxpayer | сложный элемент | 1 | Сведения о налогоплательщике | — | СведНП | Текущая модель предназначена для ЮЛ. |
Файл/Документ/СведНП/@НаимОрг | legal_entity_name | строка T(1-1000) | 1 | Полное наименование организации | Свободный текст | <НАИМЕНОВАНИЕ_ЮЛ> | Снимочная подпись; не используйте как ключ и не делайте вывод о переименовании без внешней сверки. |
Файл/Документ/СведНП/@ИННЮЛ | inn | строка из 10 цифр; XSD-pattern для ИНН ЮЛ | 1 | ИНН юридического лица | ИНН ЮЛ | <ИНН_ИЗ_10_ЦИФР> | Всегда храните строкой. В проверенном срезе уникален; не дополняйте нулями и не соединяйте с 12-значным ИНН ИП. |
Файл/Документ/СведСНР | special_regimes | сложный элемент | 1 | Признаки применения специальных налоговых режимов | — | СведСНР | Все четыре атрибута обязательны. |
Файл/Документ/СведСНР/@ПризнЕСХН | eshn_applied | строковый код T(=1) | 1 | Применяется ЕСХН | 0 — нет; 1 — да | 0 | Нормализуйте в boolean только после валидации исходного кода. |
Файл/Документ/СведСНР/@ПризнУСН | usn_applied | строковый код T(=1) | 1 | Применяется УСН | 0 — нет; 1 — да | 1 | Не взаимоисключающий с другими признаками по XSD и фактическим данным. |
Файл/Документ/СведСНР/@ПризнАУСН | ausn_applied | строковый код T(=1) | 1 | Применяется автоматизированная УСН | 0 — нет; 1 — да | 0 | Не заменяйте значением УСН: это отдельное поле и отдельный режим. |
Файл/Документ/СведСНР/@ПризнСРП | srp_applied | строковый код T(=1) | 1 | Применяется режим при выполнении соглашения о разделе продукции | 0 — нет; 1 — да | 0 | Редкий, но фактически присутствует: 1 встретился в 3 строках текущего среза. |
Пустые, отсутствующие и кодовые значения
- Пустая строка для перечисленных строковых атрибутов невалидна: XSD задаёт минимальную длину 1. В валидном XML значение либо непустое, либо (только для полей
0..1) атрибут отсутствует. - Отсутствие допустимо у
@ВерсПрог, трёх контактных атрибутов отправителя и@Отчество. XSD не наделяет отсутствие значением «нет» или «не применяется». - У четырёх
Призн…атрибутов отсутствие невалидно. Здесь и только здесь опубликован специальный код:0= «нет»,1= «да». - В текущем выпуске не встретились пустые обязательные поля;
@ВерсПрогесть в каждом XML, а опциональные контакты отправителя и@Отчествоотсутствуют в каждом. Это наблюдение не отменяет правила XSD для будущих выпусков.
Часто ожидаемые, но отсутствующие поля
Текущая XSD и фактические XML не содержат: КПП, ОГРН, ОКВЭД, ОКТМО, субъект РФ, адрес, ИНН физического лица, ОГРНИП, дату регистрации ЮЛ, дату начала/окончания или основание применения режима, ЕНВД, объект налогообложения, ставку, налоговую базу, начисленный либо уплаченный налог. Поле НаимОрг есть, но само по себе не заменяет сведения ЕГРЮЛ.
Логическая модель и нормализация
Гранулярность, ключи и история
- Гранулярность строки: одна организация (ИНН ЮЛ) × один срез
@ДатаСост; это состояние на дату, не событие. - Естественный ключ текущей модели:
as_of_date + inn. В проверенном выпуске все 1 353 132 ИНН и всеИдДокуникальны; это диагностированный факт, а не обещание схемы для будущих выпусков. - Технические ключи:
source_file_idидентифицирует XML-член;source_record_id(@ИдДок) идентифицирует запись внутри выгрузки. Оба сохраняйте для аудита, но исторический ключ организации стройте наas_of_date + inn. - Ключ исторического хранения:
as_of_date + inn; дополнительно сохраняйтеformat_version, исходный URL ZIP, хеш архива и время загрузки. Если в одном ZIP появятся две строки с одинаковымиas_of_date + inn, не выполняйте склейку: пометьте выпуск как требующий разбора. - Измерения: дата среза, версия формата, идентификаторы исходного файла и документа. Состояния: четыре булевых признака режима.
legal_entity_name— снимочное описательное поле, не факт и не ключ. - Дубликаты: проверяйте три уровня — уникальность
ИдФайлсреди членов ZIP,КолДокпротив реального числаДокумент, уникальность(ДатаСост, ИННЮЛ). В текущем выпуске все три проверки пройдены. - Сравнение во времени: делайте полное внешнее соединение двух уже валидированных снимков по строковому ИНН; отдельно классифицируйте
added,removed,unchanged,regime_flags_changed,name_changed. Исчезновение из следующего файла означает только отсутствие в следующем опубликованном срезе — не ликвидацию ЮЛ и не доказанную дату прекращения режима.
Рекомендуемая нормализованная модель:
entity: legal_entity_special_tax_regime_snapshot
grain: one legal entity (10-digit INN) in one FNS snapshot date
primary_key: [as_of_date, inn]
snapshot_key: [as_of_date]
technical_keys: [source_file_id, source_record_id]
tables:
- name: snr_source_file
columns:
- name: source_file_id
source_path: Файл/@ИдФайл
type: string
nullable: false
description: XML member name without extension; validate against the ZIP member basename.
- name: format_version
source_path: Файл/@ВерсФорм
type: string
nullable: false
description: XML format version; current value is 4.02.
- name: producer_version
source_path: Файл/@ВерсПрог
type: string
nullable: true
description: Version of the producing program, not the schema version.
- name: declared_record_count
source_path: Файл/@КолДок
type: integer
nullable: false
description: Must equal the parsed number of Документ elements.
- name: snr_legal_entity_snapshot
columns:
- name: as_of_date
source_path: Файл/Документ/@ДатаСост
type: date
nullable: false
description: Snapshot state date parsed strictly from DD.MM.YYYY.
- name: inn
source_path: Файл/Документ/СведНП/@ИННЮЛ
type: string
nullable: false
description: Ten-digit legal-entity INN; keep lexical form and validate before joins.
- name: legal_entity_name
source_path: Файл/Документ/СведНП/@НаимОрг
type: string
nullable: false
description: Full organisation name as published in this snapshot.
- name: eshn_applied
source_path: Файл/Документ/СведСНР/@ПризнЕСХН
type: boolean
nullable: false
description: Convert only validated source code 0/1 to false/true.
- name: usn_applied
source_path: Файл/Документ/СведСНР/@ПризнУСН
type: boolean
nullable: false
description: Independent USN status flag.
- name: ausn_applied
source_path: Файл/Документ/СведСНР/@ПризнАУСН
type: boolean
nullable: false
description: Independent automated-USN status flag.
- name: srp_applied
source_path: Файл/Документ/СведСНР/@ПризнСРП
type: boolean
nullable: false
description: Independent production-sharing-agreement status flag.
- name: document_formed_at
source_path: Файл/Документ/@ДатаДок
type: date
nullable: false
description: Document formation date, distinct from the snapshot date.
- name: source_record_id
source_path: Файл/Документ/@ИдДок
type: string
nullable: false
description: Source technical document identifier; retain for audit, not as a historical entity key.
- name: source_file_id
source_path: Файл/@ИдФайл
type: string
nullable: false
description: Foreign key to snr_source_file.
Правила загрузки, валидации и нормализации
- Скачивайте ZIP в неизменяемое хранилище вместе с URL, HTTP-заголовками, хешем и временем загрузки. Проверяйте HTTP-статус, ZIP CRC (
ZipFile.testzip()), отсутствие путей с..и суммарный распакованный размер до обработки. - Не распаковывайте весь архив в рабочий каталог: XML-члены можно читать последовательно через
ZipFile.open(). XML-парсеру отключайте внешние сущности, DTD и сетевой доступ. - Валидируйте каждый XML по XSD, затем отдельно проверяйте Schematron-правило имени файла (
@ИдФайл) и бизнес-инварианты@КолДок, формата дат, ИНН и кодов0/1. Обычная XSD-валидация вlxmlне исполняет вложенное в схему Schematron-условие автоматически. - Сохраняйте ИНН и все технические идентификаторы как строки. Для ИНН допустимы только 10 цифр по шаблону XSD; не переводите в число, не отбрасывайте ведущие нули и не «чините» значение дополнением нулями.
- Преобразуйте
ДатаДокиДатаСосттолько строгим парсингом%d.%m.%Y; сохраняйте исходную строку или ошибочный XML в карантине при сбое. Не подменяйтеДатаСостдатой ZIP. - Преобразуйте каждый валидный
0/1в отдельное boolean-поле. Не суммируйте их в категорию, не исключайте комбинации флагов и не отвергайте строку, где все флаги равны0: последнее не допускается текущими наблюдениями, но не запрещено XSD. - Перед публикацией создайте уникальное ограничение
(as_of_date, inn). Если оно нарушено, остановите загрузку до разбора, а не выбирайте «последнюю» строку поИдДок.
Ниже минимальный проверенный код для валидации архива без извлечения всех XML на диск. Он не выводит названия организаций, ИНН или контактные данные.
from datetime import datetime
from pathlib import PurePosixPath
from zipfile import ZipFile
from lxml import etree
ZIP = "data-20260625-structure-20230425.zip"
XSD = "structure-20230425.xsd"
DATE_FORMAT = "%d.%m.%Y"
FLAGS = ("ПризнЕСХН", "ПризнУСН", "ПризнАУСН", "ПризнСРП")
schema = etree.XMLSchema(etree.parse(XSD))
parser = etree.XMLParser(resolve_entities=False, load_dtd=False, no_network=True)
seen_snapshot_keys = set()
with ZipFile(ZIP) as archive:
bad_crc_member = archive.testzip()
if bad_crc_member:
raise ValueError(f"ZIP CRC failed: {bad_crc_member}")
for member in archive.infolist():
path = PurePosixPath(member.filename)
if path.name != member.filename or path.is_absolute() or ".." in path.parts:
raise ValueError(f"unsafe ZIP member name: {member.filename}")
if path.suffix.lower() != ".xml":
raise ValueError(f"unexpected non-XML member: {member.filename}")
with archive.open(member) as stream:
tree = etree.parse(stream, parser)
if not schema.validate(tree):
raise ValueError(f"XSD failed for {member.filename}: {schema.error_log.last_error}")
root = tree.getroot()
if root.get("ИдФайл") != path.stem:
raise ValueError(f"ИдФайл differs from member name: {member.filename}")
documents = root.findall("Документ")
if int(root.get("КолДок")) != len(documents):
raise ValueError(f"КолДок differs from parsed count: {member.filename}")
for document in documents:
as_of = datetime.strptime(document.get("ДатаСост"), DATE_FORMAT).date()
datetime.strptime(document.get("ДатаДок"), DATE_FORMAT).date()
taxpayer = document.find("СведНП")
regimes = document.find("СведСНР")
inn = taxpayer.get("ИННЮЛ")
if not (inn and len(inn) == 10 and inn.isdecimal()):
raise ValueError(f"invalid legal-entity INN in {member.filename}")
if any(regimes.get(flag) not in {"0", "1"} for flag in FLAGS):
raise ValueError(f"invalid regime code in {member.filename}")
key = (as_of, inn)
if key in seen_snapshot_keys:
raise ValueError(f"duplicate snapshot key in release: {key!r}")
seen_snapshot_keys.add(key)
print(f"validated records: {len(seen_snapshot_keys):,}")
Безопасное соединение с другими наборами
| Правило | Зачем |
|---|---|
Соединяйте по inn только после валидации ровно 10 цифр и сохранения строкового типа. | Этот набор охватывает ЮЛ; 12-значный ИНН ИП не является совпадением. |
Перед join обеспечьте уникальность (as_of_date, inn) в SNR и используйте проверку кардинальности m:1. | Защита от размножения строк при ошибочном или будущем дубликате в снимке. |
Выберите снимок, релевантный дате внешнего факта, и сохраните as_of_date в результате. | У набора нет дат начала/окончания режима; статус на 01.06.2026 нельзя выдавать за статус в произвольную дату договора или платежа. |
| Не подставляйте отсутствующие КПП, ОГРН, ОКВЭД или ОКТМО из «похожей» строки. | Их нет в XML, а ИНН — единственный опубликованный идентификатор организации. Дополнительные атрибуты берите отдельным, явно датированным источником. |
| Разделяйте роль субъекта во внешнем наборе. | В закупках ИНН может принадлежать поставщику или заказчику; в субсидиях — получателю. Значение режима характеризует организацию, а не сам контракт или субсидию. |
| Не объединяйте без проверки с набором ИП. | 7707329152-snrip имеет другой субъектный охват и требует самостоятельного разбора своей схемы. |
Пример безопасной склейки с уже нормализованной внешней таблицей. Имя supplier_inn — локальное нормализованное поле; конкретное имя поля в сырой выгрузке другого набора ТРЕБУЕТ ПРОВЕРКИ до применения кода.
import pandas as pd
snapshot = pd.read_parquet(
"snr_2026-06-01.parquet",
columns=["as_of_date", "inn", "eshn_applied", "usn_applied", "ausn_applied", "srp_applied"],
)
external = pd.read_csv("external_facts.csv", dtype={"supplier_inn": "string"})
snapshot["inn"] = snapshot["inn"].astype("string").str.strip()
external["supplier_inn"] = external["supplier_inn"].astype("string").str.strip()
if not snapshot["inn"].str.fullmatch(r"\d{10}").all():
raise ValueError("SNR contains an invalid INN after normalization")
if snapshot.duplicated(["as_of_date", "inn"]).any():
raise ValueError("SNR snapshot key is not unique")
# Use one explicitly selected snapshot date; do not join an undated current file.
as_of = pd.Timestamp("2026-06-01")
current = snapshot.loc[snapshot["as_of_date"] == as_of]
if current["inn"].duplicated().any():
raise ValueError("selected SNR snapshot has duplicate INN")
enriched = external.merge(
current,
how="left",
left_on="supplier_inn",
right_on="inn",
validate="m:1",
indicator=True,
)
print(enriched["_merge"].value_counts(dropna=False))
Периодичность обновления
ФНС не указывает периодичность этого набора в паспорте, а архивная строка пуста. Единственный верифицированный выпуск сформирован 25.06.2026 для состояния на 01.06.2026; этого недостаточно, чтобы вывести календарное правило. Для регулярной обработки проверяйте паспорт перед каждой загрузкой, сравнивайте URL и @ВерсФорм, а отсутствие нового файла фиксируйте как отсутствие обновления, а не как ошибку парсера.
Ограничения и особенности
- ZIP не является архивом истории: ФНС не публикует ссылки на предыдущие релизы в текущем паспорте. Для анализа динамики архив снимков нужно собирать самостоятельно, сохраняя оригинальные ZIP и метаданные получения.
- В схеме нет КПП и ОГРН, поэтому нельзя повысить точность склейки вторым организационным идентификатором. При конфликте ИНН его нельзя автоматически разрешить по названию.
- Имена организаций и служебное ФИО отправителя могут содержать персональные или идентифицирующие данные. Не выводите их в диагностику, примеры, логи ошибок и публичные тестовые фикстуры.
- Наличие или исчезновение записи не описывает причин: набор не даёт дату начала/окончания режима, ликвидации или перехода. Для юридического статуса используйте отдельную, датированную выписку ЕГРЮЛ.
- XSD ограничивает коды флагов, но не запрещает их сочетания. В текущем файле сочетания действительно есть; ограничение «один режим на организацию» приведёт к потере валидных записей.
Примеры доступа
1. Скачать проверенный выпуск и проверить ZIP
Проверено 2026-07-19: команда скачивает ровно выпуск, исследованный в этой карточке. Перед следующим запуском регулярной задачи замените URL ссылкой, извлечённой из актуального паспорта.
curl --fail --location --remote-name \
'https://file.nalog.ru/opendata/7707329152-snr/data-20260625-structure-20230425.zip'
unzip -t data-20260625-structure-20230425.zip
2. Сверить выпуск со схемой
Скачайте схему по прямой ссылке и запустите код из раздела «Правила загрузки, валидации и нормализации». В проверке 2026-07-19 он дал validated records: 1,353,132; проверка проходит по всем XML в ZIP, не по одному выборочному файлу.
Сводка для машинной обработки
primary_url: "https://www.nalog.gov.ru/opendata/7707329152-snr"
current_release_url: "https://file.nalog.ru/opendata/7707329152-snr/data-20260625-structure-20230425.zip"
formats: ["zip", "xml", "xsd", "doc"]
encoding: "UTF-8"
root_element: "Файл"
record_element: "Документ"
schema_url: "https://file.nalog.ru/opendata/7707329152-snr/structure-20230425.xsd"
format_version: "4.02"
current_snapshot_date: "2026-06-01"
document_formed_date: "2026-06-25"
archive: "not published in the current FNS passport"
update_cadence: "not declared; one verified release is insufficient to infer a schedule"
grain: "legal entity × snapshot date"
primary_key: ["as_of_date", "inn"]
join_keys: ["inn"]
record_count: 1353132
xml_members: 1503
regime_flags: ["eshn_applied", "usn_applied", "ausn_applied", "srp_applied"]
Связанные страницы wiki
- Индекс открытых данных ФНС — навигатор по соседним официальным наборам ФНС; не заменяет техническую схему этого ZIP.
- Сведения о специальных налоговых режимах (ИП) — отдельный набор для другого субъектного охвата; не объединяйте с ЮЛ без верификации его формата.
- ЕГРЮЛ — источник для недостающих в SNR ОГРН, КПП, статуса и иных регистрационных сведений; учитывайте дату выписки.
- XML-выгрузки ЕИС закупок — внешний массив, где статус режима можно присоединять к выбранной роли организации после нормализации ИНН и даты среза.
- Реестр субсидий — внешний массив для обогащения получателя субсидии флагами режима по ИНН, без вывода о причине предоставления субсидии.
- ИНН — основной опубликованный ключ связки для юридического лица.
Не путать с
- Сведения о специальных налоговых режимах (ИП) — соседний набор для индивидуальных предпринимателей, а не дополнительная таблица той же XML-схемы.
- Налоговая статистика ФНС — агрегированные статистические формы, а не построчный снимок организаций по ИНН.
- ЕГРЮЛ — регистрационные сведения о юридическом лице; SNR даёт только наименование, ИНН и статус специальных режимов на дату среза.
Частые вопросы
В: Можно ли определить из набора дату перехода на УСН или дату прекращения режима?
О: Нет. В XML есть только дата формирования документа и дата снимка. Переход можно лишь предполагать как разницу между двумя самостоятельно сохранёнными снимками; дату и основание перехода набор не публикует.
В: Означает ли ПризнУСН="1", что три остальных режима обязательно равны 0?
О: Нет. XSD задаёт четыре независимых флага, а в проверенном выпуске есть валидные сочетания УСН с АУСН и ЕСХН с УСН. Храните каждый флаг отдельной колонкой.
В: Можно ли соединить этот XML с данными об ИП по ИНН?
О: Нет напрямую: СведНП/@ИННЮЛ всегда 10-значный ИНН юридического лица. Для ИП используйте отдельный набор 7707329152-snrip после самостоятельной проверки его структуры и предметного охвата.