Nordlet

← Блог

Автоматизация расчета НДС по странам и проверка VIES

Практическое руководство для разработчиков по встраиванию механизмов соблюдения требований к НДС в ЕС в маркетплейсы и платформы с использованием облачного API бухгалтерского учета.

Nordlet Team · · 12 мин. чтения

Большинство ошибок в расчете НДС в коде платформ сводятся к одному предположению: если проверка VIES прошла успешно, продажу можно облагать по нулевой ставке. Это не так. Создание логики на основе такого упрощения приводит к отчетам, которые выглядят безупречно ровно до тех пор, пока аудитор не спросит, почему внутриевропейская льгота была применена без доказательств транспортировки или стабильного подтверждения места реализации. Пропасть между „номера НДС прошли проверку“ и „эта поставка обработана корректно“ — это то место, где большинство интеграций незаметно дают сбой.

В этом руководстве мы рассмотрим, как автоматизировать отчетность по НДС в разрезе стран и проверку через VIES с помощью облачного API бухгалтерского учета, используя в качестве примера API бухгалтерского учета Nordlet. Цель состоит в создании системы, которая собирает нужные доказательства в момент продажи, формирует неизменяемые проводки по бухгалтерскому регистру и подготавливает данные для отчетности, сгруппированные по схемам и государствам-членам ЕС, без необходимости повторно сводить итоговые суммы в электронных таблицах.

Что на самом деле показывает VIES (и чего он не показывает)

VIES — это информационная система НДС ЕС (EU VAT Information Exchange System). При отправке кода страны и номера НДС она в реальном времени запрашивает соответствующую национальную базу данных и возвращает статус: действителен номер или нет. В этом заключается вся ее задача. Она подтверждает, что номер зарегистрирован и, если это поддерживается государством-членом, активирован для внутрисоюзной торговли (intra-EU trade).

Система не устанавливает право на освобождение от налога внутри сообщества (intra-Community supply). Европейская комиссия заявляет об этом прямо. Успешный ответ VIES — это лишь одно доказательство из нескольких. Вам по-прежнему необходимо подтвердить, что покупатель является фактическим получателем, что поставка квалифицируется как внутриевропейская, что имеются документы, подтверждающие транспортировку или отгрузку, и что в счете-фактуре указана обязательная формулировка о перенесении налогового обязательства на получателя (reverse-charge).

Поэтому первое архитектурное решение является структурным: храните статус VIES и режим обложения НДС в разных полях. Никогда не связывайте viesStatus: valid напрямую с zeroRated: true. Как только вы объединяете эти два понятия, вы лишаетесь возможности отстоять примененный налоговый режим при проверке доказательств.

Предварительные требования перед написанием кода интеграции

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

  • В каких странах бизнес ведет деятельность или имеет постоянные представительства (fixed establishments).
  • В каких странах у компании есть регистрация по НДС.
  • Что именно продается: товары, услуги, цифровые услуги или их комбинация.
  • Являются ли сделки B2B, B2C или смешанными.
  • Используются ли местные регистрации, схемы OSS, IOSS, обратное начисление (reverse charge) или правила для маркетплейсов как условных поставщиков (deemed-supplier rules).
  • Какие отчеты должен формировать API: данные местной декларации, отчеты OSS/IOSS, регистры счетов-фактур (например, литовский i.SAF), только проводки в регистре или полезные данные для стороннего провайдера сдачи отчетности.

Это важно, поскольку схема OSS охгрызывает далеко не все операции. Услуги, оказанные в стране, где у бизнеса есть постоянное представительство, как правило, должны отражаться в местной декларации этой страны, а не в декларации OSS. Моделируйте постоянные представительства отдельно с самого начала, иначе при агрегации вы направите эти поставки не по тому маршруту.

Также не стоит хардкодить единую ставку НДС для каждой страны. В ЕС существуют стандартные, сниженные, сверхнизкие, промежуточные, нулевые ставки и специфические для отдельных товаров режимы, которые к тому же меняются. Надежным источником информации о ставке для конкретного товара в конкретном государстве-члене является налоговый орган этой страны, а общая картина по ЕС представлена в базе данных TEDB Европейской комиссии. Сохраняйте источник и версию ставки для каждого решения, чтобы последующее обновление таблицы ставок не перезаписало задним числом отображение старой транзакции.

Моделирование налогового решения, а не просто ставки

Основой надежной интеграции является уровень налоговых категорий (tax-category layer), располагающийся между номенклатурой и ставками. Сопоставьте товары с категориями, категории с налоговыми кодами конкретной страны, а затем со ставками, действующими в определенный период:

product/service
    → tax category
    → country-specific tax code
    → effective-dated rate and treatment

Небезопасный подход, приводящий к искажению отчетности — это связка артикул товара (SKU) → НДС 21%. Один и тот же товар облагается разными ставками в разных странах, к тому же ставка может измениться посреди отчетного периода. Собственные рекомендации Nordlet по соблюдению требований к НДС прямо советуют использовать такое сопоставление на основе категорий, а не привязывать товары напрямую к процентам.

Ваша таксономия налоговых категорий должна быть стабильной и внутренней: товары со стандартной ставкой, товары со сниженной ставкой, услуги в электронной форме, обычные услуги, освобожденные от НДС поставки, поставки по нулевой ставке, внутриевропейский B2B reverse charge, внутриевропейская дистанционная продажа, импорт через IOSS, операции с участием условного поставщика (deemed-supplier). Все последующие процессы опираются именно на эту таксономию.

Проверка VIES как асинхронный процесс сбора доказательств

Официальный сервис VIES предоставляет SOAP/WSDL-интерфейс, принимающий двухбуквенный код страны и номер НДС. Описанные в документации сбои сервиса важны для обработки ошибок: неверный ввод данных, глобальные лимиты и лимиты одновременных запросов для конкретных государств-членов, недоступность сервиса, недоступность национальных баз данных и тайм-ауты. Рассматривайте их как разные результаты, а не как единую корзину неудачных запросов.

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

  1. Нормализуйте идентификатор НДС: переведите префикс в верхний регистр, удалите допустимые пробелы или знаки препинания, но сохраните исходное значение, введенное пользователем, отдельно.
  2. Локально проверьте код страны и формат номера перед тем, как выполнять сетевой вызов.
  3. Отправьте нормализованный номер в VIES.
  4. Сохраните нормализованный ID, временные метки запроса и ответа, статус (действителен, недействителен или не обработан), исходный ответ сервиса, любые ошибки сервиса, ID клиента и счета-фактуры, а также решение системы.
  5. Кешируйте успешные результаты на определенный и задокументированный период.
  6. Повторяйте временные технические сбои с экспоненциальной задержкой (backoff).
  7. Направляйте неразрешенные или противоречивые случаи на ручную проверку.
  8. Проводите повторную проверку, если закешированный результат устарел или перед сделкой, когда наличие доказательств критически важно.

Nordlet проверяет номер НДС ЕС при добавлении клиента и повторно проверяет его перед выставлением счета, если предыдущий результат устарел. Именно такое поведение вам нужно воспроизвести независимо от того, где выполняется проверка — на платформе или в вашем собственном коде.

Критические правило: не делайте оформление заказа (checkout) синхронно зависящим от VIES. Сбой в работе сервиса не означает, что номер недействителен. Если во время продажи VIES выдает тайм-аут, отложите транзакцию на рассмотрение или присвойте ей промежуточный статус. Блокирование оформления заказа из-за доступности сервиса Еврокомиссии станет источником заявок в службу поддержки, а ошибочное признание хорошего клиента недействительным — еще хуже.

Отделение статуса проверки от налогового режима

Получив результат от VIES, ваш механизм принятия решений должен выполнить дополнительную работу. Сохраняйте эти данные в виде отдельных полей:

{
  "viesStatus": "valid",
  "vatTreatment": "intra_eu_b2b_reverse_charge",
  "evidenceStatus": "reviewed",
  "placeOfSupply": "DE"
}

Перед применением режима обратного начисления (reverse-charge) или освобождения от налога система должна проверить, действительно ли покупатель является получателем, совпадают ли страна покупателя и префикс НДС, подпадает ли поставка под критерии внутриевропейской, применяются ли особые правила определения места реализации, имеются ли доказательства транспортировки, выступает ли продавец в роли условного поставщика (deemed supplier) и содержит ли счет-фактура необходимую формулировку. Успешный статус VIES, не прошедший ни одну из этих проверок, еще не зеленый свет.

Создание неизменяемого налогового решения в момент выставления счета

При создании счета-фактуры сохраняйте полное обоснование решения вместе с ним, а не только итоговую ставку:

invoice
  ├─ line tax category
  ├─ place of supply
  ├─ VAT scheme
  ├─ country-specific rate
  ├─ rate-table version
  ├─ VIES evidence reference
  ├─ location-evidence references
  ├─ legal-basis reference
  └─ marketplace-role flags

Правила ЕС для счетов-фактур требуют указания реквизитов поставщика и покупателя, номера счета-фактуры, описания, налогооблагаемой суммы, ставки НДС, суммы НДС, а также любой информации об обратном начислении или освобождении от налога. Кредитовые ноты и исправления должны содержать недвусмысленную ссылку на исходный счет-фактуру.

Бухгалтерский регистр Nordlet является неизменяемым, поэтому исправления выполняются через новые записи, такие как кредитовые ноты или сторнирующие проводки, а не через редактирование закрытых документов. Стройте логику вашей системы вокруг этой модели, даже если ваше хранилище данных технически позволяет перезапись. Редактирование закрытого счета-фактуры разрушает связь между первоначальной отчетностью и исправлением, а именно эту цепочку происхождения проверяет аудитор.

Проводки, вебхуки и идемпотентность

Продажа создает двойную бухгалтерскую запись, которая сохраняет как коммерческую транзакцию, так и обязательство по НДС, разделенное по странам и схемам. Обычная внутренняя продажа может формировать проводку:

Dr Accounts receivable / payment clearing
    Cr Revenue
    Cr VAT payable - DE - domestic

Внутриевропейская B2B-продажа с обратным начислением формирует выручку без исходящего НДС и со ссылкой на доказательства применения reverse-charge. Точный план счетов остается на ваше усмотрение; важно то, что измерения для отчетности прикрепляются к каждой проводке: государство-член, схема, налоговая категория, ставка, период, исходный счет-фактура и цепочка исправлений.

Управляйте изменениями статусов с помощью вебхуков, а не опросов (polling). Nordlet отправляет такие события, как sale_invoice.paid, подписывает доставляемые сообщения и повторяет попытки при сбоях с задержкой. Присваивайте каждой операции записи детерминированный ключ идемпотентности:

sale:{platform_order_id}:invoice:{invoice_version}
5```

Ваш обработчик также должен быть идемпотентным. Вебхук может прийти дважды, прийти с задержкой или сработать после того, как исходный запрос уже успешно завершился. Проверяйте подписи, записывайте ID событий, помещайте поврежденные события в карантин, обрабатывайте их через надежную очередь и сверяйте состояние вебхуков с API по расписанию. Если вы раньше не работали с [подписанными вебхуками и ключами идемпотентности](/ru/blog/cloud-accounting-api-saas-integration/), именно здесь кроются самые незаметные ошибки с дублированием проводок.

## Группировка для OSS и формирование готовых к отчетности данных

Для соответствующих требованиям транзакций OSS сгруппируйте данные регистра по схеме, государству-члену потребления, типу поставки, категории ставки, ставке, налогооблагаемой сумме, сумме НДС, государству-члену отгрузки или регистрации, валюте и периоду исправления.

Декларация по Союзной схеме (Union scheme) разделяет поставки по государствам-членам потребления и разграничивает услуги из государства-члена идентификации, услуги из других постоянных представительств и товары, отправленные из разных государств-членов. В ней раздельно указываются налогооблагаемые суммы и суммы НДС для стандартных и сниженных ставок. Освобожденные от налога и нулевые поставки вообще не включаются в декларацию OSS.

Несколько операционных деталей, на которых часто спотыкаются:

- Отчетные периоды для Союза и стран вне ЕС по схеме OSS являются квартальными, для IOSS — ежемесячными. Декларации и платежи должны быть поданы до конца месяца, следующего за отчетным.
- Нулевая декларация требуется за каждый период, даже если никаких соответствующих поставок не было. Сформируйте контрольный список периодов и автоматически создавайте декларации с нулевыми значениями.
- Декларации OSS составляются в евро с использованием справочного курса ЕЦБ на последний день налогового периода, если требуется конвертация. Сохраняйте исходную валюту, обменный курс, дату курса, конвертированную сумму и метод.

Экспорт должен осуществляться из заблокированного регистра, а не из вспомогательной электронной таблицы. Итоги в таблицах теряют исправления, страны отправления, ставки и доказательства. Экспорт содержит отчетный период, схему, государство-член потребления, страну отгрузки, категорию поставки, ставку, налогооблагаемую сумму и сумму НДС, валюту и примененный обменный курс, суммы исправлений за текущий и прошлые периоды, ID исходных счетов-фактур, ссылки на кредитовые ноты и итоговые данные сверки.

Четко понимайте, что именно предоставляет API. Nordlet рассчитывает декларации OSS и IOSS на основе счетов-фактур и бухгалтерского регистра с учетом исправлений за прошлые периоды, формирует пакеты местных деклараций для Литвы (`FR0600`), Германии (`UStVA`) и Польши (`JPK_V7M`), а также генерирует готовые для VMI регистры i.SAF для Литвы. Это данные, готовые к отчетности. Один вызов API не подает декларацию по НДС каждой страны через каждый национальный шлюз, и ни одна декларация не отправляется в налоговый орган от вашего имени. Разделяйте бухгалтерский учет, формирование отчетности, экспорт, отправку через шлюз и подтверждение платежа на отдельные состояния в вашей системе. В [руководстве по движку НДС ЕС](/ru/docs/guides/eu-vat/) описано, какие случаи разрешает движок и где срабатывают его предупреждения.

## Блокировка периода

После проверки и утверждения выполните сверку счетов-фактур с проводками в регистре, сверьте сальдо НДС по регистру с набором данных для декларации, экспортируйте декларацию, запишите реквизиты подачи и оплаты, после чего заблокируйте период. Nordlet блокирует создание проводок за заблокированный месяц, в том числе через API. Исправления после блокировки попадают в более поздний период с явными ссылками на исходный документ и затрагиваемый отчетный период.

## Распространенные ошибки и способы их избежать

| Ошибка | Причина возникновения | Способ устранения |
| --- | --- | --- |
| Рассмотрение успешного результата VIES как достаточного для применения нулевой ставки | VIES не подтверждает право на освобождение от налога | Храните данные о клиенте, поставке, транспортировке и счете-фактуре вместе с результатом проверки |
| Рассмотрение недействительного результата как доказательства отсутствия регистрации | Номер может быть не активирован для внутрисоюзной торговли или база данных может отставать | Различайте недействительные статусы, необработанные запросы и технические сбои; направляйте спорные случаи на рассмотрение |
| Синхронная зависимость оформления заказа от VIES | Лимиты одновременных запросов, тайм-ауты, сбои | Асинхронная проверка, кратковременное кеширование, экспоненциальная задержка, временные статусы |
| Бессрочное кеширование результатов | Статусы регистрации и активации меняются | Сохраняйте временные метки и срок действия; проводите повторную проверку перед выставлением счета при устаревании данных |
| Прямое сопоставление товаров с процентами НДС | Ставки и льготы зависят от страны и даты | Связка товара с категорией, категории с кодом страны и ставки с учетом срока действия |
| Восстановление OSS из электронных таблиц | Итоговые суммы не учитывают исправления, страны отгрузки и доказательства | Расчет на основе неизменяемого регистра с аналитикой по каждой проводке |
| Включение услуг постоянных представительств в OSS | Определенные услуги должны включаться в местную декларацию | Моделируйте представительства отдельно, разделяйте потоки по схемам до агрегации |
| Пропуск нулевых деклараций | Схема OSS требует сдачи декларации за каждый период | Сформируйте чек-лист и автоматически создавайте нулевые декларации |
| Редактирование закрытых счетов-фактур для исправления | Разрушает связь между отчетностью и исправлениями | Используйте кредитовые ноты и сторнирующие проводки в последующих периодах |

## С чего мы начали бы в первую очередь

Если бы мы запускали эту интеграцию завтра, мы бы сначала создали уровень налоговых категорий и запись налогового решения, прежде чем прикасаться хоть к одному эндпоинту отчетности. Добейтесь стабильности таксономии, сопоставьте товары с категориями и настройте запись решения так, чтобы она фиксировала исходные сигналы страны и причину выбора места реализации. Все остальное — VIES, проводки, группировка OSS, экспорт — зависит от правильности этой модели.

Затем мы бы настроили VIES как асинхронный этап проверки с четырьмя раздельными статусами и протестировали его на [тестовой компании (sandbox company)](/ru/get-started/) с использованием фикстур для нестандартных случаев (тайм-ауты, необработанные результаты, несовпадающие префиксы), прежде чем подпускать систему к продакшену. Описанных выше сбоев можно практически полностью избежать, если модель данных переносит доказательства и аналитические признаки отчетности с момента первой проводки.

## FAQ

### Означает ли успешный ответ VIES, что я могу применить нулевую ставку к внутриевропейской B2B-продаже?

Нет. VIES подтверждает, что номер НДС зарегистрирован и, при поддержке со стороны государства, активирован для внутрисоюзной торговли. Право на применение освобождения от налога внутри сообщества зависит от дополнительных доказательств: того, что покупатель является фактическим получателем, подтверждения транспортировки или отгрузки, правильного определения места реализации и наличия обязательных формулировок в счете-фактуре. Сохраняйте результат VIES как один из входящих параметров, а не как готовое решение.

### Должна ли проверка VIES блокировать оформление заказа?

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

### Может ли облачный API бухгалтерского учета автоматически подавать мои декларации по НДС?

Он может формировать готовые к отчетности данные, сгруппированные по схемам и государствам-членам, рассчитанные на основе неизменяемого регистра с учетом внесенных исправлений. Будет ли он также отправлять их через каждый национальный шлюз подачи отчетности, зависит от продукта и страны. Nordlet рассчитывает декларации OSS и IOSS, формирует пакеты местных деклараций для Литвы, Германии и Польши, а также создает готовые для VMI регистры i.SAF для Литвы, но он не отправляет ничего в налоговый орган от вашего имени. Рассматривайте бухгалтерский учет, формирование отчетности, экспорт, отправку через шлюз и оплату как отдельные состояния, а не предполагайте, что один вызов решает все задачи везде.

### Как обрабатывать исправления после блокировки периода?

Отражайте их в последующем периоде с явными ссылками на исходный документ и затрагиваемый отчетный период. Nordlet блокирует создание новых проводок за заблокированный месяц, в том числе через API, поэтому исправления проводятся через кредитовые ноты или сторнирующие проводки, а не через прямое редактирование. Это сохраняет преемственность между первоначальной отчетностью и корректировкой.

## Рекомендуемая литература

- [Автоматизация соблюдения требований по НДС в ЕС с помощью облачного API бухгалтерского учета](/ru/blog/eu-vat-compliance-cloud-accounting-api/)
- [Интеграция облачного API бухгалтерского учета в SaaS-платформу](/ru/blog/cloud-accounting-api-saas-integration/)
- [Проверить номер НДС (VIES), Европейская комиссия](https://europa.eu/youreurope/business/finance-and-tax/vat/check-vat-number-vies/index_en.htm)