Автоматизация расчета НДС по странам и проверка VIES
Практическое руководство для разработчиков по встраиванию механизмов соблюдения требований к НДС в ЕС в маркетплейсы и платформы с использованием облачного API бухгалтерского учета.
Большинство ошибок в расчете НДС в коде платформ сводятся к одному предположению: если проверка 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-интерфейс, принимающий двухбуквенный код страны и номер НДС. Описанные в документации сбои сервиса важны для обработки ошибок: неверный ввод данных, глобальные лимиты и лимиты одновременных запросов для конкретных государств-членов, недоступность сервиса, недоступность национальных баз данных и тайм-ауты. Рассматривайте их как разные результаты, а не как единую корзину неудачных запросов.
Рабочий процесс, способный выдержать высокую нагрузку и аудит, выглядит следующим образом:
- Нормализуйте идентификатор НДС: переведите префикс в верхний регистр, удалите допустимые пробелы или знаки препинания, но сохраните исходное значение, введенное пользователем, отдельно.
- Локально проверьте код страны и формат номера перед тем, как выполнять сетевой вызов.
- Отправьте нормализованный номер в VIES.
- Сохраните нормализованный ID, временные метки запроса и ответа, статус (действителен, недействителен или не обработан), исходный ответ сервиса, любые ошибки сервиса, ID клиента и счета-фактуры, а также решение системы.
- Кешируйте успешные результаты на определенный и задокументированный период.
- Повторяйте временные технические сбои с экспоненциальной задержкой (backoff).
- Направляйте неразрешенные или противоречивые случаи на ручную проверку.
- Проводите повторную проверку, если закешированный результат устарел или перед сделкой, когда наличие доказательств критически важно.
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)