Проверка контрагентов через сервис ФНС




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

21 Comments

  1. CheBurator

    упомянутый сервис на данный момент тестовый режим имеет.

    отчаянно врет и дает недостоверные данные.

    будьте бдительны

    Reply
  2. ded00786

    (2) ZOMI, Сделал и хорошо) Больше — это не меньше)

    Reply
  3. davdykin

    Есть у этого сервиса такой баг, если передать дату проверки, то некоторые контрагенты выкидывается как недействующий, хотя он действующий, поэтому в своей сделал возможность передавать без даты. Написал на сервис, ребята воспроизвели ситуацию и больше 3-х недель ни слуху, ни духу. 🙂 Госконтора одним словом.

    Reply
  4. Dem1urg

    Спасибо за комментарии.

    Код обработки очень простой. В ближайшее время планирую расширить описание чтобы её можно было использовать не столько для проверки контрагентов, сколько как пример по работе с web-service из среды 1С. Возможно, кому-то кто ранее не сталкивался с подобной задачей будет полезно.

    Reply
  5. Franco

    >>При передаче на проверку нескольких контрагентов, если хоть одна запись содержит ошибку (ИНН или КПП не соответствуют шаблону), будет возвращена ошибка

    Передавать по 1-му контрагенту может быть?

    Reply
  6. Dem1urg

    (6) Franco, Можно передавать по одному. Но сам сервис поддерживает возможность передачи до 10 тыс. контрагентов одновременно.

    Reply
  7. surgeon

    Строку WSКонтрагент.INN = ДанныеКонтрагента.ИНН;

    лучше добавить СокрЛП(), иначе Исключение при наличии пробелов в ИНН.

    Reply
  8. Darina

    по ИП пишет «неправильный КПП»

    Reply
  9. YanTsys

    (2) ZOMI, что бессонница мучает когда проблему за которую ты пытаешься драть 2000р. другие решают за 60р. (кажется такой курс одной старт мани)?

    (5) СПАСИБО! 🙂

    Reply
  10. ZOMI

    (10) YanTsys,

    Моё платное решение за которое я «деру» целую стоимость часа работы программиста расчитано на конечных пользователей с включенной оперативной поддержкой, а не поделка для недозагруженных работой программистов, тешащих свое эго за счет своего работодателя.

    Кроме того, если говорить о самой задаче — то правильное решение — это проверка на дату документа с отработкой случаев ручного указания КПП в счет-фактурах, а не только из карточки контрагента. Также актуально проверять и организации.

    Reply
  11. YanTsys

    (11) ZOMI,

    недозагруженных работой программистов, тешащих свое эго за счет своего работодателя

    Всяк сверчок хвалит свой шесток…

    Как правило самые лучшие зарплаты предлагают в тех местах где «оперативная поддержка» в какой-то момент переоценивает свои возможности и в период отчетности динамит часть своих клиентов. Вы не представляете что такое для организации оказаться вообще без поддержки в последние дни сдачи отчетности 🙂

    (11) ZOMI,

    Кроме того, если говорить о самой задаче — то правильное решение

    правильное решение это как минимум проверка документа при его проведении что уже реализовано штатными средствами в 8.3 🙂

    Reply
  12. lunda

    Выходит ошибка в обработке, при запросе. Что это означает?

    Reply
  13. Dem1urg

    ИФНС поменял версию сервиса. Изменилось и имя сервиса и формат обращения к нему.

    Поэтому обработка и выдавала ошибку.

    Сделал версию обработки для новой версии сервиса http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl

    Reply
  14. polo453

    Привет, а обработка Проверка контрагентов через сервис ФНС сейчас актуальна?работает?

    Reply
  15. polo453

    нужна для УПП 1.3

    Reply
  16. Dem1urg

    (16) Да, все работает. Только что проверил. УПП под рукой нет, но есть УТ 10.3 Сделал версию для неё, но она должна работать и в УПП. Для массового заполнения таблицы Контрагенты используются обороты регистра ВзаиморасчетыСКонтрагентами в выбранном периоде.

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

    Reply
  17. polo453

    ок, спасибо

    Reply
  18. Vogde

    День добрый обработка версии 2 выдает ошибку. Использую на БП 2.0.66.64

    Reply
  19. Dem1urg

    (19) Только что проверил на Бухгалтерия предприятия, редакция 2.0 (2.0.66.64)

    Все работает.

    Судя по тексту ошибки была проблема с сервисом ФНС. Возможно был сбой в его работе, а сейчас уже все восстановили.

    Попробуйте еще раз.

    Reply
  20. Vogde

    Да вы правы, все работает.

    Reply
  21. BalBeer

    Спасибо, большое

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *