Сдача декларации по налогу на добавленную стоимость (НДС) — один из самых ответственных периодов в работе любого бухгалтера и ИТ-отдела предприятия. Одним из ключевых этапов подготовки отчета является автоматическая проверка контрагентов на предмет их существования и активности в ЕГРН (Едином государственном реестре налогоплательщиков). Эта проверка выполняется непосредственно из программы 1С с использованием бесплатного веб-сервиса ФНС России (npchk.nalog.ru). Однако очень часто пользователи сталкиваются с крайне неприятной ошибкой: «Сервис ФНС временно недоступен» или «Не удалось произвести проверку контрагентов».
Давайте подробно разберем, почему возникает эта ошибка, какие скрытые причины на стороне данных и платформы 1С могут приводить к сбоям, и рассмотрим пошаговые технические решения этой проблемы.
В типовых конфигурациях 1С (например, 1С:Управление производственным предприятием, 1С:Бухгалтерия и других) механизм проверки устроен так, что данные контрагентов упаковываются в один массив и отправляются на сервер ФНС. По умолчанию размер одной порции (пакета) может составлять до 10 000 записей контрагентов в одном SOAP-запросе NdsRequest2. Несмотря на то, что официально сервис ФНС заявляет о поддержке таких объемов, на практике серверы налоговой службы часто не справляются с обработкой огромных массивов информации за один таймаут соединения. Происходит обрыв связи, и 1С выдает сообщение о недоступности веб-сервиса.
Выясним причину экспериментальным путем. Как показывает практика практикующих специалистов, если уменьшить объем порции отправки контрагентов в коде конфигурации, стабильность работы сервиса резко возрастает. Давайте рассмотрим, как это реализовать.
В типовом механизме проверки найдем процедуру, отвечающую за пакетную отправку данных. Нам необходимо принудительно уменьшить размер порции отправляемых данных с 10 000 до 1 000 (или даже до 100-500 для особо перегруженных баз). Проанализируем пример изменения кода:
// Вместо отправки порции в 10 000 записей, принудительно ограничим её размер
РазмерПорции = 1000; // Было 10000
После уменьшения размера порции система будет отправлять данные более мелкими пакетами. Да, количество запросов к серверу увеличится, но каждый отдельный запрос гарантированно уложится в стандартный таймаут ответа веб-сервиса ФНС, и ошибка недоступности исчезнет.
Одной из самых неожиданных и неочевидных причин сбоя сервиса проверки являются банальные опечатки пользователей при вводе дат входящих документов (например, счетов-фактур). Рассмотрим реальную ситуацию: при вводе даты входящего документа бухгалтер вместо корректного года случайно указывает ошибочный (например, вместо 02.06.2015 вводится дата 02.06.0015).
При формировании XML-пакета запроса к ФНС эта некорректная дата сериализуется и отправляется на сервер. Веб-сервис ФНС при разборе XML-пакета наталкивается на дату из первого века нашей эры и падает с внутренней ошибкой СУБД, не возвращая адекватного ответа. В результате 1С получает пустой ответ или ошибку разбора схемы и сообщает пользователю: «Сервис ФНС временно не доступен».
Чтобы решить эту проблему раз и навсегда, необходимо добавить в конфигурацию валидацию дат перед их отправкой в ФНС. Давайте посмотрим на примере конфигурации 1С:УПП 1.3, как модифицировать код процедуры ПодготовитьДанныеКПроверкеПоКаждомуКонтрагенту в модуле декларации:
// Находим блок проверки даты в типовой процедуре
// Было:
// Дата
Если Не ЗначениеЗаполнено(ДанныеКонтрагента.Дата) Тогда
ДанныеКонтрагента.Дата = НачалоДня(ТекущаяДатаСеанса);
КонецЕсли;
// Стало (добавляем проверку на адекватность года):
Если Не ЗначениеЗаполнено(ДанныеКонтрагента.Дата) Тогда
ДанныеКонтрагента.Дата = НачалоДня(ТекущаяДатаСеанса);
ИначеЕсли ТипЗнч(ДанныеКонтрагента.Дата) = Тип("Дата")
И (ДанныеКонтрагента.Дата < '19910101' Или ДанныеКонтрагента.Дата > КонецДня(ТекущаяДатаСеанса)) Тогда
// Помечаем контрагента как ошибочного локально, не отправляя на сервер ФНС
ДанныеКонтрагента.Состояние = "Контрагент содержит ошибки в данных (некорректная дата)";
Возврат;
КонецЕсли;
Этот простой блок кода предотвратит отправку заведомо некорректных дат (ранее основания современной налоговой системы России — 01.01.1991, или даты из будущего) на сервер ФНС, уберегая веб-сервис от зависания, а пользователя — от ложных сообщений о недоступности сервиса.
Современные конфигурации 1С активно используют Библиотеку стандартных подсистем (БСП). Для оптимизации работы БСП кэширует WS-определения удаленных веб-сервисов, чтобы не скачивать тяжелые WSDL-схемы при каждом обращении. Данные кэша хранятся в специальном регистре сведений КэшПрограммныхИнтерфейсов.
Проанализируем ситуацию: если в момент первого обращения к сервису проверки контрагентов на стороне ФНС действительно велись технические работы или произошел кратковременный сбой сети, 1С не сможет загрузить схему и запишет в кэш признак ошибки или пустую структуру. В дальнейшем, даже когда сервер ФНС полностью восстановит работу, 1С будет обращаться к локальному кэшу, считывать оттуда ошибку таймаута и выдавать сообщение: «Не удалось получить WS-определения из кэша».
Для устранения этой проблемы выполним следующие шаги:
КэшПрограммныхИнтерфейсов.npchk.nalog.ru).Дополнительно можно увеличить время ожидания ответа (таймаут) в коде, где происходит инициализация соединения с веб-сервисом. По умолчанию в БСП таймаут может быть равен 15 секундам, чего явно недостаточно при пиковых нагрузках на серверы ФНС в отчетные периоды. Увеличим это значение до 300–360 секунд в коде модуля менеджера регистра КэшПрограммныхИнтерфейсов или в процедурах подключения к ФНС.
Если типовой механизм проверки в вашей конфигурации работает нестабильно или вы используете сильно кастомизированную (измененную) базу, где стандартные обновления задерживаются, отличным решением станет создание собственной обработки для поштучной проверки контрагентов. ФНС уже давно перевела сервис на версию API 2.0 (веб-сервис FNSNDSCAWS2, точка подключения FNSNDSCAWS2_Port, типы запросов NdsRequest2 и NdsRequest2_NP).
Рассмотрим пример программной реализации поштучной проверки контрагентов. Данный алгоритм последовательно перебирает контрагентов и отправляет индивидуальные запросы, что исключает падение сервиса из-за перегрузки большими пакетами. Также мы учтем важные исправления: исправим сопоставление типов ЮрЛицо/ФизЛицо и обработаем коды возврата сервера ФНС.
// Создадим таблицы соответствия кодов ответов ФНС для Юридических и Физических лиц
ОтветыФЛ = Новый Соответствие;
ОтветыФЛ.Вставить("0", "Налогоплательщик зарегистрирован в ЕГРН и имел статус действующего в указанную дату");
ОтветыФЛ.Вставить("1", "Налогоплательщик зарегистрирован в ЕГРН, но не имел статус действующего в указанную дату");
ОтветыФЛ.Вставить("2", "Налогоплательщик зарегистрирован в ЕГРН");
ОтветыФЛ.Вставить("4", "Налогоплательщик с указанным ИНН не зарегистрирован в ЕГРН");
ОтветыФЛ.Вставить("5", "Некорректный ИНН");
ОтветыФЛ.Вставить("6", "Недопустимое количество символов ИНН");
ОтветыФЛ.Вставить("8", "Недопустимые символы в ИНН");
ОтветыФЛ.Вставить("10", "КПП не должен использоваться при проверке ИП");
ОтветыФЛ.Вставить("11", "Некорректный формат даты");
ОтветыФЛ.Вставить("12", "Некорректная дата (ранее 01.01.1991 или позднее текущей даты)");
ОтветыЮЛ = Новый Соответствие;
ОтветыЮЛ.Вставить("0", "Налогоплательщик зарегистрирован в ЕГРН и имел статус действующего в указанную дату");
ОтветыЮЛ.Вставить("1", "Налогоплательщик зарегистрирован в ЕГРН, но не имел статус действующего в указанную дату");
ОтветыЮЛ.Вставить("2", "Налогоплательщик зарегистрирован в ЕГРН");
ОтветыЮЛ.Вставить("3", "Налогоплательщик с указанным ИНН зарегистрирован в ЕГРН, КПП не соответствует ИНН или не указан");
ОтветыЮЛ.Вставить("4", "Налогоплательщик с указанным ИНН не зарегистрирован в ЕГРН");
ОтветыЮЛ.Вставить("5", "Некорректный ИНН");
ОтветыЮЛ.Вставить("6", "Недопустимое количество символов ИНН");
ОтветыЮЛ.Вставить("7", "Недопустимое количество символов КПП");
ОтветыЮЛ.Вставить("8", "Недопустимые символы в ИНН");
ОтветыЮЛ.Вставить("9", "Недопустимые символы в КПП");
ОтветыЮЛ.Вставить("11", "Некорректный формат даты");
ОтветыЮЛ.Вставить("12", "Некорректная дата (ранее 01.01.1991 или позднее текущей даты)");
// Инициализируем WS-определения по актуальному адресу сервиса ФНС (версия 2)
АдресWSDL = "https://npchk.nalog.ru/fns-ndscaws2-fstyle.wsdl";
Попытка
WSОпределение = Новый WSОпределения(АдресWSDL);
WSСервис = WSОпределение.Сервисы.Получить(0);
Прокси = Новый WSПрокси(WSОпределение, WSСервис.URIПространстваИмен, WSСервис.Имя, WSСервис.ТочкиПодключения[0].Имя);
Фабрика = WSОпределение.ФабрикаXDTO;
ПакетЗапрос = Фабрика.Пакеты.Получить("http://fns.gov.ru/nds-fns-ndscaws2-2.0");
ТипНП = ПакетЗапрос.Получить("NdsRequest2");
ТипДанныеНП = ПакетЗапрос.Получить("NdsRequest2_NP");
Исключение
Сообщить("Не удалось подключиться к веб-сервису ФНС: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// Выбираем контрагентов для проверки
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Если ПустаяСтрока(Выборка.ИНН) Тогда
Сообщить("У контрагента " + Выборка.Наименование + " отсутствует ИНН!", СтатусСообщения.Внимание);
Продолжить;
КонецЕсли;
// Создаем структуру запроса XDTO
Налогоплательщики = Фабрика.Создать(ТипНП);
Налогоплательщик = Фабрика.Создать(ТипДанныеНП);
Налогоплательщик.INN = СократитьЛП(Выборка.ИНН);
Налогоплательщик.KPP = СократитьЛП(Выборка.КПП);
Налогоплательщик.DT = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Налогоплательщики.NP.Добавить(Налогоплательщик);
Попытка
// Отправляем одиночный запрос
Результат = Прокси.NdsRequest2(Налогоплательщики);
Элемент = Результат.NP[0];
КодОтвета = Строка(Элемент.State); // Сервер может вернуть число или строку, приводим к строке
Если КодОтвета = "0" Тогда
// Код "0" означает успешное прохождение проверки действующего контрагента
Продолжить;
КонецЕсли;
// Корректно определяем тип контрагента (ЮрЛицо или ФизЛицо) для сопоставления описания
// Важно: в ИНН Юрлиц 10 символов, у Физлиц (ИП) — 12 символов
ЭтоФизЛицо = (СтрДлина(Налогоплательщик.INN) = 12);
Если ЭтоФизЛицо Тогда
ОписаниеОтвета = ОтветыФЛ.Получить(КодОтвета);
Иначе
ОписаниеОтвета = ОтветыЮЛ.Получить(КодОтвета);
КонецЕсли;
Если ОписаниеОтвета = Неопределено Тогда
ОписаниеОтвета = "Неизвестный код ответа: " + КодОтвета;
КонецЕсли;
Сообщить("Контрагент: " + Выборка.Наименование + " (ИНН: " + Выборка.ИНН + ") - Проблема: " + ОписаниеОтвета);
Исключение
Сообщить("Ошибка проверки контрагента " + Выборка.Наименование + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Разберем важные нюансы представленного алгоритма. Во-первых, обратите внимание на приведение переменной КодОтвета к типу Строка. Сервер ФНС часто возвращает состояние в разных форматах, и прямое сравнение с числом может давать сбои. Во-вторых, мы исправили частую логическую ошибку сопоставления типов контрагентов: теперь длина ИНН (10 или 12 символов) четко разделяет проверку индивидуальных предпринимателей (физлиц) и организаций (юрлиц), подставляя верное текстовое описание ошибки из соответствующей таблицы соответствий.
Для того чтобы минимизировать возникновение подобных ошибок в будущем, рекомендуем придерживаться следующих правил:
КэшПрограммныхИнтерфейсов.Мы подробно проанализировали причины сбоев при проверке контрагентов по НДС, разобрали тонкости настройки веб-сервисов ФНС, а также рассмотрели практические примеры программного кода, которые помогут вам оперативно решить проблему своими силами и вовремя сдать отчетность без лишней нервотрепки.