Дискложес  ☰  

декларации о доходах
Автоматизированный сбор деклараций о доходах

Спецификация выходного JSON СмартПарсера, версия 3.0

Вводная информация

Каждый год российские чиновники публикуют декларации о доходах и имуществе. Форматы документов могут быть разными - Excel, Word, PDF, HTML. Для качественного использования публикуемых данных требуется их приведение в единый машиночитаемый формат и дальнейшая обработка (связывание отдельных записей в цепочку, относящуюся к одному должностному лицу). Для краткости мы будем называть декларантами или персонами всех должностных лиц, которые публикуют сведения о своих доходах.

Первая часть этого процесса - парсинг исходных файлов. Из входных формата Excel, Word, PDF, HTML данные переводятся в формат json. Разработка парсера ведется, в том числе в открытом режиме в репозитории на Гитхабе .

В сведениях о доходах и имуществе, публикуемых в соответствии с действующим антикоррупционным законодательством, указывается следующая информация:

Пример входной таблицы [1]:

Описание JSON формата

Один json-файл имеет следующую структуру: {
“persons”: [массив всех декларантов, найденных в документе ],
“document”: {описание документа, который был распарсен}
}

В поле document идёт описание документа, который был обработан парсером в процессе парсинга. В нём могут быть следующие поля:

В поле persons находится массив всех персон (декларантов, найденных в документе).

Основные поля каждого элемента этого массива:
{
“person”: {
‘name_raw’: “string”,
‘department’: “string”,
‘role’: “string”, },
“document_position”: “string”,
“person_index”: “number” “incomes”: [array],
“real_estates”: [array],
“vehicles”: [array],
}

Отдельно, требования по данным указаны ниже, вместе с описанием методов парсинга.

Поле ФИО декларанта person/name_raw

Встречается два основных способа написания в декларациях:

Обычно эта информация записана в одной ячейке таблицы. Если ФИО содержит больше трех слов, так его и оставлять - это разрешено.

Парсинг ФИО осложняется тем, что иногда в этой же ячейке идет информация о должности декларанта (поле role).

Поле person/department (отдел или подведомственная организация, где работает декларант)

Отдел, в котором работает декларант, может находиться в отдельном столбце, а может стоять выше по таблице, когда декларанты идут группами, где каждая группа декларантов работает в одном отделе:

“Пример

В последнем случае у всех декларантов одной группы будет одинаково заполнено поле person/department. Поле person/department может отсутствовать, тогда считается, что все декларанты работают в головной организации, которая опубликовала этот документ.

Поле person/role (должность декларанта)

В поле person/role записывается должность, на которой работает декларант. Обычно эта должность идет в отдельном столбце (см. примеры выше).

Поле адреса внутри документа (document_position)

Для будущего анализа результатов парсинга нужно указать место в документе, где именно была обнаружена данная секция:

Порядковый номер персоны (person_index)

Иногда в документе перед каждой персоной в отдельном столбце указан её порядковый номер в данном документе. В таких случаях этот номер надо указать в данном поле. Пример (первый столбец): “Пример

Иногда порядковый номер указывается для департамента и объединяет несколько персон. В таких случаях это поле не нужно заполнять.

Родственники (тип relative_type)

Все объекты владения (доход, транспортное средство или недвижимость) содержат поля relative с допустимыми значениями: "Супруг(а)", "Ребенок" или null. Это поле обозначает, к кому относится данная запись, например, что машина супруги Значение null означает, что эта запись относится к основному декларанту.

Сумма годового дохода (incomes)

Сумма годового дохода обычно указывается в отдельной ячейке. Почти всегда есть доход основного декларанта. Кроме этого, в декларациях записана информация о доходах супруг(ов). Для каждого дохода вносится следующая запись: {
“size”: number
“size_raw”: string
“relative”: relative_type
}

Поле size - это доход чиновника в рублях, иногда они пишут с точностью до копейки, тогда возникает не целочисленное, а число с плавающей точкой - это разрешено.

Поле size_raw - исходное сырое строковое значение ячейки с суммой дохода.

Во входных таблицах доход чаще всего встречается в виде числа с плавающей точкой, иногда с “руб.” или “р.” на конце, что нужно отбросить, так как по JSON схеме поле size должно быть number.

Внимание! Иногда сумма обозначается в тысячах рублей, что может быть указано как после цифры, так и в заголовке столбца. В таком случае приведенное в исходном файле число надо умножить на 1000. Существует еще формат “11 рублей 50 копеек", который надо преобразовать к флоату (11.50).

Также иногда в декларациях встречается комментарий к источнику дохода, обычно указываемый рядом с суммой дохода в скобках, например, “часть дохода получена от продажи дома”. Эти строки надо внести в поле "/persons/incomes/comment".

В случае, когда доходы не указаны совсем, следует оставить пустым список в JSON “/persons/incomes”.

Транспортные средства (поле vehicles)

Транспортные средства обычно указываются в отдельных столбцах, и могут быть преобразованы в следующие поля: {
“relative”: relative_type
“text” : string,
“type_raw”: string,
“manufacture_year”: number,
“own_type_raw”:string
}

В большинстве случаев в транспортных средствах заполняется только поле text и поле relative. Разделение информации о машинах на отдельных элементы оставлен на последующие этапы. Пример записи о транспортном средстве:

"vehicles": [
{
"text": "а/м легковой Тойота Ланд Крузер Прадо",
"relative": null
. }
Может быть и несколько транспортных средств в одной ячейке:
"vehicles": [
{ "text": "а/м легковой Ауди; Квадроцикл Ямаха",
"relative": "Супруг(а)"
}
/

Если описание транспортных средств разделено на разные колонки, тогда их обязательно надо конкатинировать через пробел в поле text (и дополнительно оставить в отдельных полях):

Недвижимость (поле real_estates)

В сведениях о доходах обычно отдельно указываются объекты недвижимости в собственности и находящиеся в пользовании. Как правило, в исходной таблицы они располагаются в отдельных группах столбцов: левее группа из 4 столбцов, касающаяся недвижимости в собственности, правее 3 столбца о недвижимости в пользовании.

В некоторых случаях оба типа недвижимости объединены в один столбец, а режим использования уточняется в скобках. Один объект недвижимости описывается следующими полями:

{
“own_type_by_column”: “В собственности” | “В пользовании”
“own_type_raw”: string,
“relative”: relative_type
“type_raw”: string,
“square”: float,
“square_raw” : string,
“country_raw”: string
“text”: string
}
Например:
{
“own_type_by_column”: “В собственности”,
"own_type_raw": "Индивидуальная",
"type_raw": "Земельный участок",
"text": "Земельный участок",
"square_raw": "1500.00",
"square": 1500.00,
"country_raw": "Россия",
"relative": null
}

Для того, чтобы отделить эти два типа используется поле own_type_by_column (личной собственности соответствует значение “В собственности”, и для пользования - "В пользовании").

Поле own_type_raw заполняется, когда присутствуют отдельный столбец с уточнением типа владения. Столбец обычно называется “вид собственности”, примеры значений такие:

Поле type_raw содержит тип недвижимости (квартира, земельный участок, дача и пр). В этом же поле содержится иногда указание доли владения. Поле square_raw содержит площадь недвижимости в метрах квадратных. Поле square содержит преобразованное во float значение поля square_raw. Поле country_raw содержит страну, в которой находится данный объект недвижимости. Иногда type_raw и own_type_raw записаны во входной таблице в одной ячейке, в таких случаях, содержимое этой ячейки пишется в поле text, а поля type_raw и own_type_raw не заполняются.

Если же type_raw и own_type_raw разделены, тогда в поле text пишется (дублируется) значение поля type_raw. Поле text является обязательным.

Недвижимость без разделения на колонки

Встречаются документы, где недвижимость указана в одной колонке, в одной строке включены сразу все данные - площадь, вид и тип владения. В таких случаях эту строку надо заносить в поле text.

Бывает, что в одной колонке вместе указывается вид недвижимости и тип собственности, которые также надо заносить в поле text, а площадь и страну заносить в соответствующие поля - square_raw и country_raw.

Пример:

Иногда даже отсутствуют площадь и тип владения, есть только описание объекта. Пример:

В таких случаях содержимое этой одной колонки целиком должно быть записано в поле text, но если колонки две (как в примере выше), то по ним должен быть определено и записано поле own_type_by_column.

Предыдущая версия этого документа