# Распознавание товарной накладной ТОРГ-12

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

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

| Поле | Описание | Тип | Проверка |
| --- | --- | --- | --- |
| `number` | Номер документа | string |  |
| `date` | Дата составления | string (date) |  |
| `supplier` | Поставщик | object |  |
| `supplier.name` | Наименование | string |  |
| `supplier.inn` | ИНН | string | ИНН |
| `supplier.kpp` | КПП (у ИП нет) | string | КПП |
| `consignee` | Грузополучатель | object |  |
| `consignee.name` | Наименование | string |  |
| `consignee.inn` | ИНН | string | ИНН |
| `consignee.kpp` | КПП (у ИП нет) | string | КПП |
| `payer` | Плательщик | object |  |
| `payer.name` | Наименование | string |  |
| `payer.inn` | ИНН | string | ИНН |
| `payer.kpp` | КПП (у ИП нет) | string | КПП |
| `basis` | Основание (договор, заказ) | string |  |
| `items[]` | Товары | array |  |
| `items[].name` | Наименование | string |  |
| `items[].unit` | Единица измерения | string |  |
| `items[].quantity` | Количество (масса нетто) | number |  |
| `items[].price` | Цена | number |  |
| `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": "Дата составления"
    },
    "supplier": {
      "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"
      ]
    },
    "consignee": {
      "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"
      ]
    },
    "payer": {
      "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"
      ]
    },
    "basis": {
      "type": "string",
      "description": "Основание (договор, заказ)"
    },
    "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_amount": {
            "type": "number",
            "description": "Сумма НДС"
          },
          "amount_with_vat": {
            "type": "number",
            "description": "Сумма с учётом НДС"
          }
        },
        "required": [
          "name",
          "unit",
          "quantity",
          "price",
          "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",
    "supplier",
    "consignee",
    "payer",
    "basis",
    "items",
    "total_with_vat"
  ]
}
```

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

```json
{
  "number": "1873",
  "date": "2026-08-21",
  "supplier": {
    "name": "ООО «Опт-Пример»",
    "inn": "0013579240",
    "kpp": "001301001"
  },
  "consignee": {
    "name": "ООО «Склад на Неве»",
    "inn": "0024681359",
    "kpp": "002401001"
  },
  "payer": {
    "name": "ООО «Склад на Неве»",
    "inn": "0024681359",
    "kpp": "002401001"
  },
  "basis": "Договор поставки № 44 от 10.01.2026",
  "items": [
    {
      "name": "Цемент М500, мешок 50 кг",
      "unit": "шт",
      "quantity": 80,
      "price": 520,
      "vat_amount": 6933.33,
      "amount_with_vat": 41600
    }
  ],
  "total_with_vat": 41600
}
```

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

- ТОРГ-12 — унифицированная форма (ОКУД 0330212), но на практике её печатают из разных учётных систем: колонки сдвигаются, строки переносятся. Typizer читает таблицу по заголовкам, а не по координатам.
- В накладной четыре участника: поставщик, грузоотправитель, грузополучатель и плательщик. Часто это одни и те же организации — но не всегда, поэтому в схеме они разделены.
- Многостраничные накладные с итогами «по странице» и «всего по накладной»: извлекайте общий итог отдельно от промежуточных.

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

- ИНН участников — контрольные цифры; КПП — формат из 9 знаков.
- Итог по накладной — сумма строк против строки «Всего по накладной».

## Вызов API

Инструкция: Номер и дата ТОРГ-12, поставщик, грузополучатель и плательщик с ИНН и КПП, основание, товары с единицей, количеством, ценой, суммой НДС и суммой с НДС, итого

```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":"Дата составления"},"supplier":{"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"]},"consignee":{"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"]},"payer":{"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"]},"basis":{"type":"string","description":"Основание (договор, заказ)"},"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_amount":{"type":"number","description":"Сумма НДС"},"amount_with_vat":{"type":"number","description":"Сумма с учётом НДС"}},"required":["name","unit","quantity","price","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","supplier","consignee","payer","basis","items","total_with_vat"]}' \
  --form-string 'instructions=Номер и дата ТОРГ-12, поставщик, грузополучатель и плательщик с ИНН и КПП, основание, товары с единицей, количеством, ценой, суммой НДС и суммой с НДС, итого'
```

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

### Распознаётся ли рукописная правка в накладной?

Печатный текст распознаётся надёжно; рукописные пометки — по возможности. Поле, значение которого прочитано неуверенно или не прошло проверку, получает статус warn с причиной.

### Как быть с накладными на несколько страниц?

Отправляйте документ целиком — до 200 страниц за прогон. Позиции со всех страниц собираются в один массив, у каждой строки — источник с номером страницы.

### Можно ли получить XML для загрузки в учётную систему?

Да: результат можно запросить в XML, а XSD вашего типизатора получить через API — по нему настраивается загрузка.
