# Распознавание УПД

Статус, продавец и покупатель с ИНН и КПП, товарные позиции с НДС и итог — из скана или PDF универсального передаточного документа.

## Что извлекается

| Поле | Описание | Тип | Проверка |
| --- | --- | --- | --- |
| `number` | Номер УПД | string |  |
| `date` | Дата | string (date) |  |
| `status` | Статус: 1 — счёт-фактура и передаточный документ, 2 — передаточный документ | 1 \| 2 |  |
| `seller` | Продавец | object |  |
| `seller.name` | Наименование | string |  |
| `seller.inn` | ИНН | string | ИНН |
| `seller.kpp` | КПП (у ИП нет) | string | КПП |
| `buyer` | Покупатель | object |  |
| `buyer.name` | Наименование | string |  |
| `buyer.inn` | ИНН | string | ИНН |
| `buyer.kpp` | КПП (у ИП нет) | string | КПП |
| `items[]` | Товары, работы, услуги | array |  |
| `items[].name` | Наименование | string |  |
| `items[].unit` | Единица измерения | string |  |
| `items[].quantity` | Количество | number |  |
| `items[].price` | Цена за единицу | number |  |
| `items[].vat_rate` | Ставка НДС | string |  |
| `items[].vat_amount` | Сумма НДС | number |  |
| `items[].amount_with_vat` | Стоимость с налогом | number |  |
| `total_with_vat` | Всего к оплате | number | сумма строк |

Если значения нет в документе, поле возвращается как null со статусом missing.

## JSON Schema

```json
{
  "type": "object",
  "properties": {
    "number": {
      "type": "string",
      "description": "Номер УПД"
    },
    "date": {
      "type": "string",
      "format": "date",
      "description": "Дата"
    },
    "status": {
      "type": "integer",
      "enum": [
        1,
        2
      ],
      "description": "Статус: 1 — счёт-фактура и передаточный документ, 2 — передаточный документ"
    },
    "seller": {
      "type": "object",
      "description": "Продавец",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование"
        },
        "inn": {
          "type": "string",
          "description": "ИНН",
          "x-typizer-check": "inn"
        },
        "kpp": {
          "type": "string",
          "description": "КПП (у ИП нет)",
          "x-typizer-check": "kpp"
        }
      },
      "required": [
        "name",
        "inn",
        "kpp"
      ]
    },
    "buyer": {
      "type": "object",
      "description": "Покупатель",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование"
        },
        "inn": {
          "type": "string",
          "description": "ИНН",
          "x-typizer-check": "inn"
        },
        "kpp": {
          "type": "string",
          "description": "КПП (у ИП нет)",
          "x-typizer-check": "kpp"
        }
      },
      "required": [
        "name",
        "inn",
        "kpp"
      ]
    },
    "items": {
      "type": "array",
      "description": "Товары, работы, услуги",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Наименование"
          },
          "unit": {
            "type": "string",
            "description": "Единица измерения"
          },
          "quantity": {
            "type": "number",
            "description": "Количество"
          },
          "price": {
            "type": "number",
            "description": "Цена за единицу"
          },
          "vat_rate": {
            "type": "string",
            "description": "Ставка НДС"
          },
          "vat_amount": {
            "type": "number",
            "description": "Сумма НДС"
          },
          "amount_with_vat": {
            "type": "number",
            "description": "Стоимость с налогом"
          }
        },
        "required": [
          "name",
          "unit",
          "quantity",
          "price",
          "vat_rate",
          "vat_amount",
          "amount_with_vat"
        ]
      }
    },
    "total_with_vat": {
      "type": "number",
      "description": "Всего к оплате",
      "x-typizer-check": "sum_of",
      "x-typizer-sum-of": "items[].amount_with_vat"
    }
  },
  "required": [
    "number",
    "date",
    "status",
    "seller",
    "buyer",
    "items",
    "total_with_vat"
  ]
}
```

## Пример результата (данные вымышлены)

```json
{
  "number": "УТ-2291",
  "date": "2026-10-02",
  "status": 1,
  "seller": {
    "name": "АО «Пример Снаб»",
    "inn": "0098765437",
    "kpp": "009801001"
  },
  "buyer": {
    "name": "ООО «Тестовая логистика»",
    "inn": "0011223344",
    "kpp": "001101001"
  },
  "items": [
    {
      "name": "Плитка керамическая 30×30",
      "unit": "м²",
      "quantity": 120,
      "price": 950,
      "vat_rate": "20%",
      "vat_amount": 22800,
      "amount_with_vat": 136800
    }
  ],
  "total_with_vat": 136800
}
```

## Особенности документа

- УПД бывает со статусом 1 (счёт-фактура и передаточный документ) или 2 (только передаточный документ). Статус стоит извлекать отдельным полем: от него зависит, примет ли бухгалтерия документ к вычету НДС.
- Таблица товаров в УПД широкая: код товара, единица измерения с кодом, количество, цена, стоимость без налога, ставка и сумма НДС, стоимость с налогом. Каждое значение получает свой источник на странице.
- Продавец и грузоотправитель, покупатель и грузополучатель могут различаться — опишите их в схеме отдельными объектами, если они вам нужны.

## Что проверяет Typizer

- ИНН продавца и покупателя — контрольные цифры; КПП — формат из 9 знаков.
- Итого с НДС — сумма строк против итоговой строки.
- Даты — правдоподобный год (1900–2100), иначе статус warn.

## Вызов API

Инструкция: Номер, дата и статус УПД, продавец и покупатель с ИНН и КПП, товары с единицей, количеством, ценой, ставкой и суммой НДС, итого

```bash
curl -X POST 'https://api.typizer.ru/v1/extract?wait=60' \
  -H 'Authorization: Bearer tz_live_YOUR_API_KEY' \
  -H "Idempotency-Key: $(uuidgen)" \
  -F 'file=@document.pdf' \
  --form-string 'schema={"type":"object","properties":{"number":{"type":"string","description":"Номер УПД"},"date":{"type":"string","format":"date","description":"Дата"},"status":{"type":"integer","enum":[1,2],"description":"Статус: 1 — счёт-фактура и передаточный документ, 2 — передаточный документ"},"seller":{"type":"object","description":"Продавец","properties":{"name":{"type":"string","description":"Наименование"},"inn":{"type":"string","description":"ИНН","x-typizer-check":"inn"},"kpp":{"type":"string","description":"КПП (у ИП нет)","x-typizer-check":"kpp"}},"required":["name","inn","kpp"]},"buyer":{"type":"object","description":"Покупатель","properties":{"name":{"type":"string","description":"Наименование"},"inn":{"type":"string","description":"ИНН","x-typizer-check":"inn"},"kpp":{"type":"string","description":"КПП (у ИП нет)","x-typizer-check":"kpp"}},"required":["name","inn","kpp"]},"items":{"type":"array","description":"Товары, работы, услуги","items":{"type":"object","properties":{"name":{"type":"string","description":"Наименование"},"unit":{"type":"string","description":"Единица измерения"},"quantity":{"type":"number","description":"Количество"},"price":{"type":"number","description":"Цена за единицу"},"vat_rate":{"type":"string","description":"Ставка НДС"},"vat_amount":{"type":"number","description":"Сумма НДС"},"amount_with_vat":{"type":"number","description":"Стоимость с налогом"}},"required":["name","unit","quantity","price","vat_rate","vat_amount","amount_with_vat"]}},"total_with_vat":{"type":"number","description":"Всего к оплате","x-typizer-check":"sum_of","x-typizer-sum-of":"items[].amount_with_vat"}},"required":["number","date","status","seller","buyer","items","total_with_vat"]}' \
  --form-string 'instructions=Номер, дата и статус УПД, продавец и покупатель с ИНН и КПП, товары с единицей, количеством, ценой, ставкой и суммой НДС, итого'
```

## Вопросы и ответы

### Отличает ли Typizer УПД со статусом 1 от статуса 2?

Да, если статус есть в схеме: значение берётся из поля «Статус» документа и связывается с местом на странице. Если статус не проставлен, поле получит missing.

### Подойдёт ли УПД, полученный по ЭДО?

Если у вас есть его печатная форма в PDF — да. Для XML-файлов ЭДО данные уже структурированы, и распознавание обычно не нужно.

### Как загрузить результат в 1С?

Запросите результат в XML с XSD-схемой или в XLSX: эти форматы подходят для загрузки в учётные системы. Готового коннектора к 1С нет — напишите нам, обсудим вашу конфигурацию.
