Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов
Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.
Статью уже править не буду, но у себя добавил, советую и вам всем кто заинтересовался добавить ;)
Зачем это? Комментарии к публикации можете почитать и поймёте что почти три дня сервис лежал.
Сервис не стабильный - по этому лучше держать актуальные данные или что бы он отключался и пользователь понимал - что данной проверке нельзя доверять.
1. Константу - тип булево - включить/выключить функционал проверки контрагентов в ФНС
2. Константу - тип дата - содержит дату актуальной проверки
В формы которые я использую в справочнике Контрагентов я добавил в модуль формы переменную:
Перем ВыводитьСтатусФНС;
Затем я подвязал на открытие форм, процедуре ПриОткрытие
//Котов Д.В. +++ 31.01.2018
//Так же можно выделять цветом всю строку целиком, тут ваш полёт фантазии не ограничен
Если НЕ ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьТекст = ЛОЖЬ;
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьФлажок = ЛОЖЬ;
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьКартинку = ИСТИНА;
Если ВыводитьСтатусФНС Тогда //Котов Д.В. +++ 09.02.2018
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| котКонтрагентыСтатусФНС.Статус
|ИЗ
| РегистрСведений.котКонтрагентыСтатусФНС КАК котКонтрагентыСтатусФНС
|ГДЕ
| котКонтрагентыСтатусФНС.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", ОформлениеСтроки.ДанныеСтроки.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
ОформлениеСтроки.Ячейки.котСтатусФНС.ИндексКартинки = 0;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
ОформлениеСтроки.Ячейки.котСтатусФНС.ИндексКартинки = котПроверкаКонтрагентов.НомерКартинкиСтатуса(Выборка.Статус);
КонецЕсли;
Иначе
ОформлениеСтроки.Ячейки.бгбСтатусФНС.ИндексКартинки = 0; //Котов Д.В. +++ 09.02.2018
КонецЕсли;
КонецЕсли;
//Котов Д.В. --- 31.01.2018
Показать
Результат данных действий простой:
1. Мы можем отключить алгоритм проверки статусов контрагентов в режиме предприятия онлайн!
2. Мы будем иметь только актуальные статусы, если каким-то образом проверка не прошла - тогда все иконки статусов будут "серыми".
Доработки общего модуля:
Ещё я добавил в общий модуль проверки - регламентной процедуры следующий код в самом начале:
Процедура котЕжедневнаяПроверкаКонтрагентов() Экспорт
//Котов Д.В. +++ 09.02.2018
//Если механизм проверки не включен, тогда и проверять не нужно. Чтобы регламетной задание не отключать ;)
Если НЕ Константы.котПроверкаКонтрагентовВключен.Получить() Тогда Возврат; КонецЕсли;
//Решено актуализировать один раз на текущую дату, смотрите как вам удобнее.
Если НачалоДня(Константы.котПроверкаКонтрагентовФНСДатаПроверки.Получить()) = НачалоДня(ТекущаяДата()) Тогда Возврат; КонецЕсли;
//Котов Д.В. --- 09.02.2018
ПроверкаКонтрагентов();
КонецПроцедуры
Показать
А процедуре по проверке контрагентов "ПроверкаКонтрагентов()" добавил строчки по записи даты в константу:
Процедура ПроверкаКонтрагентов() Экспорт
ДанныеПолучены = ЛОЖЬ;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СтатусыФНС.Контрагент
|ИЗ
| РегистрСведений.котКонтрагентыСтатусФНС КАК СтатусыФНС
|ГДЕ
| СтатусыФНС.Статус = ""1""";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
УстановитьФильтр = ЛОЖЬ;
Иначе
УстановитьФильтр = ИСТИНА;
КонтрагентыКоторыеНеДействуют = Результат.Выгрузить();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ИНН,
| Контрагенты.КПП,
| ВЫРАЗИТЬ("""" КАК СТРОКА(100)) КАК Состояние,
| &ТекущайДата КАК Дата
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН <> """"" +
?(УстановитьФильтр,"И НЕ Контрагенты.Ссылка В(&ГруппаКонтрагентов)","");
Запрос.УстановитьПараметр("ТекущайДата",ТекущаяДата());
Запрос.УстановитьПараметр("ГруппаКонтрагентов",КонтрагентыКоторыеНеДействуют);
ДанныеКонтрагента = Запрос.Выполнить().Выгрузить();
ПолучитьРезультатПроверкиВебСервисом(ДанныеКонтрагента,ДанныеПолучены);
Если ДанныеПолучены Тогда
Для Каждого Строка Из ДанныеКонтрагента Цикл
НаборЗаписей = РегистрыСведений.котКонтрагентыСтатусФНС.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Строка.Контрагент);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
ЗаписьТекущая = НаборЗаписей.Получить(0);
Пропускать = ЗаписьТекущая.Статус = "1";
Иначе
Пропускать = ЛОЖЬ;
КонецЕсли;
Если НЕ Пропускать Тогда
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Контрагент = Строка.Контрагент;
НоваяЗапись.Статус = Строка.Состояние;
НаборЗаписей.Записать(ИСТИНА);
КонецЕслИ;
КонецЦикла;
//Котов Д.В. +++ 09.02.2018
ДатаПроверки = Константы.схпПроверкаКонтрагентовФНСДатаПроверки;
ДатаПроверки.Установить(ТекущаяДата());
//Котов Д.В. --- 09.02.2018
КонецЕсли;
КонецПроцедуры
Странно, ведь было какое-то ограничение на количество запросов или ещё что, поэтому сервис вскоре стал платным (как и заполнение по ИНН). Далее 1с его в подписку запихало, что не удивительно. А теперь опять что ли бесплатно будет?:)
(6) Извиняюсь, проверка на ЮрЛицо у меня не проходила, т.к. метаданные разные. Исправил.
Но заметил ещё кое-что - возвращаемый статус отличается от того, что сам сайт возвращает.
(9) Да я на ночь глядя не разобрался. Сейчас вижу, что все корректно, просто вы перефразировали статусы.
К примеру, статус 3 на сайте возвращает "Налогоплательщик с указанным ИНН зарегистрирован в ЕГРН", а у вас "КПП не соответствует данным базы ФНС".
Хотя в файле описании вообще "Налогоплательщик с указанным ИНН зарегистрирован в ЕГРН, КПП не соответствует ИНН или не указан*.
Вот я и запутался :)
Статья симпатичная, но сам сервис плоховат. Иногда не отвечает, возвращает только статус. Пробовал использовать платный сервис, встроенный в бухгалтерию 3.0 - он еще хуже. Юридический адрес нашей фирмы возвращает с ошибкой. Заплаченные 4 тр сервис съел за неделю, хотя должно было хватить на 6 месяцев. Нет бочки меда без ложки дегтя.
(13) сервис плоховат, но он пока обрабатывает пакетами контрагентов и более менее правдивый. Остальные все платные... А так согласен, в статье то же писал, что может с 10-ого раза ответить))
(14) Это уж точно. что более менее. Не все данные правдивы. У нас реализована проверка через этот сервис, но пока тоже в тестовом режиме. Хотим в автоматическом режиме отказывать в отгрузках клиентам, не прошедшим данную проверку. Но пока не можем, потому как попадаются такие, которые эту проверку не проходят, а сервис той-же ФНС https://egrul.nalog.ru/ говорит что с ними всё ок. Смотрим в сторону Контура с это API.
(22) сейчас не ясная ситуация, сервис не мой, сервис принадлежит самим ФНС... может работы ведутся.
Сам пока жду и наблюдаю за ситуацией. Так как уже много, что на этом завязано.
Статью уже править не буду, но у себя добавил, советую и вам всем кто заинтересовался добавить ;)
Зачем это? Комментарии к публикации можете почитать и поймёте что почти три дня сервис лежал.
Сервис не стабильный - по этому лучше держать актуальные данные или что бы он отключался и пользователь понимал - что данной проверке нельзя доверять.
1. Константу - тип булево - включить/выключить функционал проверки контрагентов в ФНС
2. Константу - тип дата - содержит дату актуальной проверки
В формы которые я использую в справочнике Контрагентов я добавил в модуль формы переменную:
Перем ВыводитьСтатусФНС;
Затем я подвязал на открытие форм, процедуре ПриОткрытие
//Котов Д.В. +++ 31.01.2018
//Так же можно выделять цветом всю строку целиком, тут ваш полёт фантазии не ограничен
Если НЕ ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьТекст = ЛОЖЬ;
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьФлажок = ЛОЖЬ;
оформлениеСтроки.Ячейки.котСтатусФНС.ОтображатьКартинку = ИСТИНА;
Если ВыводитьСтатусФНС Тогда //Котов Д.В. +++ 09.02.2018
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| котКонтрагентыСтатусФНС.Статус
|ИЗ
| РегистрСведений.котКонтрагентыСтатусФНС КАК котКонтрагентыСтатусФНС
|ГДЕ
| котКонтрагентыСтатусФНС.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", ОформлениеСтроки.ДанныеСтроки.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
ОформлениеСтроки.Ячейки.котСтатусФНС.ИндексКартинки = 0;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
ОформлениеСтроки.Ячейки.котСтатусФНС.ИндексКартинки = котПроверкаКонтрагентов.НомерКартинкиСтатуса(Выборка.Статус);
КонецЕсли;
Иначе
ОформлениеСтроки.Ячейки.бгбСтатусФНС.ИндексКартинки = 0; //Котов Д.В. +++ 09.02.2018
КонецЕсли;
КонецЕсли;
//Котов Д.В. --- 31.01.2018
Показать
Результат данных действий простой:
1. Мы можем отключить алгоритм проверки статусов контрагентов в режиме предприятия онлайн!
2. Мы будем иметь только актуальные статусы, если каким-то образом проверка не прошла - тогда все иконки статусов будут "серыми".
Доработки общего модуля:
Ещё я добавил в общий модуль проверки - регламентной процедуры следующий код в самом начале:
Процедура котЕжедневнаяПроверкаКонтрагентов() Экспорт
//Котов Д.В. +++ 09.02.2018
//Если механизм проверки не включен, тогда и проверять не нужно. Чтобы регламетной задание не отключать ;)
Если НЕ Константы.котПроверкаКонтрагентовВключен.Получить() Тогда Возврат; КонецЕсли;
//Решено актуализировать один раз на текущую дату, смотрите как вам удобнее.
Если НачалоДня(Константы.котПроверкаКонтрагентовФНСДатаПроверки.Получить()) = НачалоДня(ТекущаяДата()) Тогда Возврат; КонецЕсли;
//Котов Д.В. --- 09.02.2018
ПроверкаКонтрагентов();
КонецПроцедуры
Показать
А процедуре по проверке контрагентов "ПроверкаКонтрагентов()" добавил строчки по записи даты в константу:
Процедура ПроверкаКонтрагентов() Экспорт
ДанныеПолучены = ЛОЖЬ;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СтатусыФНС.Контрагент
|ИЗ
| РегистрСведений.котКонтрагентыСтатусФНС КАК СтатусыФНС
|ГДЕ
| СтатусыФНС.Статус = ""1""";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
УстановитьФильтр = ЛОЖЬ;
Иначе
УстановитьФильтр = ИСТИНА;
КонтрагентыКоторыеНеДействуют = Результат.Выгрузить();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ИНН,
| Контрагенты.КПП,
| ВЫРАЗИТЬ("""" КАК СТРОКА(100)) КАК Состояние,
| &ТекущайДата КАК Дата
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН <> """"" +
?(УстановитьФильтр,"И НЕ Контрагенты.Ссылка В(&ГруппаКонтрагентов)","");
Запрос.УстановитьПараметр("ТекущайДата",ТекущаяДата());
Запрос.УстановитьПараметр("ГруппаКонтрагентов",КонтрагентыКоторыеНеДействуют);
ДанныеКонтрагента = Запрос.Выполнить().Выгрузить();
ПолучитьРезультатПроверкиВебСервисом(ДанныеКонтрагента,ДанныеПолучены);
Если ДанныеПолучены Тогда
Для Каждого Строка Из ДанныеКонтрагента Цикл
НаборЗаписей = РегистрыСведений.котКонтрагентыСтатусФНС.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Строка.Контрагент);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
ЗаписьТекущая = НаборЗаписей.Получить(0);
Пропускать = ЗаписьТекущая.Статус = "1";
Иначе
Пропускать = ЛОЖЬ;
КонецЕсли;
Если НЕ Пропускать Тогда
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Контрагент = Строка.Контрагент;
НоваяЗапись.Статус = Строка.Состояние;
НаборЗаписей.Записать(ИСТИНА);
КонецЕслИ;
КонецЦикла;
//Котов Д.В. +++ 09.02.2018
ДатаПроверки = Константы.схпПроверкаКонтрагентовФНСДатаПроверки;
ДатаПроверки.Установить(ТекущаяДата());
//Котов Д.В. --- 09.02.2018
КонецЕсли;
КонецПроцедуры
Здравствуйте. Вы сняли cf с возможности скачивания? Почему-то не удается скачать его. В техподдержке сказали, что вы закрыли возможность скачивания. Но странно, ведь здесь все еще есть возможность отправить себе на почту. Да и поддержку вы ведете
(39) Здравствуйте. Ни чего не закрывал и не чего не снимал, очень странно.
Судя по логу то после вас и до вас успешно скачали пользователи (скриншот ниже).
Вы первый раз скачиваете с инфостарта? Вам на почту должна придти ссылка, а через неё уже скачать.
Прямого скачивания (не через почту) здесь просто нет на инфостарте.
(40) нет, не в первый. В том-то и дело, что приходит ссылка, по которой невозможно скачать. В техподдержке, видимо, решили не разбираться и свалили всё на автора публикации. Спасибо, буду разбираться дальше
(42) Добрый день!
Можете попробовать очистить регистр сведений со статусами и прогрузить их все по новой. Если регистр заполниться - значит функционал работает.
Вдвоем с программистом подняли у себя данный сервис. Все работало, но с октября 2018 перестало. У нас клиент-сервер. Версия сервера и клиента 8.2 (130). Я - Админ. Программист проверила процедуру несколько раз - она типовая, как у топикстартера.
Опытным путем нашли, что запрос вроде отсылается, а вот ответ то ли не приходит, то ли приходит неверный. В одной из похожих тем видел совет про кодировку файла-ответа, но как проверить не знаю. Я провел несколько экспериментов. На том же сервере, но на другом порту работает Трешечный сервер. Прикрутил к нему базу и загрузил в нее DT-шник базы 8.2 (где не работает запрос). Оно там работает!
Сформулировал несколько вопросов, на которые не могу найти ответа:
1. если бы было дело в файерволе, то не работало бы и в трешке. Сервер то один. Да?
2. пробовал стандартные и классические "почистить кэши", "проверить настройки Интернет на сервере" - все чистил и проверял. Инет есть, сервак 8.2 вообще переинсталлил с удалением записей из реестра и каталогов. Инет работает без прокси, если что. Все ли я попробовал?
3. При открытии URL-запроса инфы из ФНС, у меня немного разный ответ, если открывать на клиенте и сервере. Могу приложить, но суть такова: запрос на серваке идет на 443 порт, а если обращаюсь со своей машины, то там 80 порт. Причем автоматом. Не понимаю в чем разница. Вероятно на стороне сервиса. По-моему, это все хня, но на всякий случай пишу.
4. Вообще, все сотрудники работают на терминальном серваке. Он в одной сетке с сервером 1С. Это разные хосты. Я подключился к сетке Сервера 1С через VPN и подключился к базе с другого клиента. Тоже самое - не работает. Но создаю файловую копию базы на этом же клиенте, и вуаля - работает запрос в ФНС. Это все, в течении 30 минут, чтобы не было соблазна сказать, что мол сервис был недоступен.
Дословно, ошибку из журнала после отработки процедуры, можно посмотреть под катом
{ОбщийМодуль.ОбщегоНазначения.Модуль(5634)}: Ошибка при вызове конструктора (WSОпределения)
Возврат Новый(Тип("WSОпределения";), Параметры);
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Extra content at the end of the document
SystemId: https://npchk.nalog.ru:443/FNSNDSCAWS_2?xsd=1
Спасибо огромное автору статьи, за отличное освещение темы. Успешно создал на основании его рекомендации проверку в ФНС. Искренне благодарен. Прошу обратить внимание на особенности настройки портов антивирусов и файрволов. Очень обидно будет, если не заработает, так было у меня, но я успешно справился с этим. Желаю всем удачи.
(47) Сама публикация это подробное описание как это сделать самостоятельно, да в качестве примера указана Комплексная автоматизация 1.1 и обычные формы, но в конце публикации привожу пример как данный модуль использовать и для управляемого интерфейса. Посмотрите "Посткриптум".
Перенос данных КА 1.1 => КА 2 / УТ 11 (перенос документов, начальных остатков и справочной информации из "1С:Комплексная автоматизация", ред.1.1 в "1С:Комплексная автоматизация", ред. 2.х)
Перенос данных КА 1.1 => КА 2 / УТ 11 (перенос документов, начальных остатков и справочной информации из "1С:Комплексная автоматизация", ред.1.1 в "1С:Комплексная автоматизация", ред. 2.х)
Программист 1С
Новосибирск зарплата от 80 000 руб.до 150 000 руб. Полный день
Программист 1С
Красноярск зарплата от 50 000 руб. По совместительству
Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0")