Быстрый ввод контрагентов и организаций по данным ФНС




Принцип обмена данными из 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='\

71 Comments

  1. qwinter

    Делал для себя получение с сайта: http://www.fedresurs.ru/ , там по сути все то же, что и на egrul.nalog.ru, но без капчи. Добавляйте в вашу обработку.

    скачать

    Reply
  2. iov

    (0) а где остальные комментарии?

    Reply
  3. Sirruf

    (9) qwinter, спасибо, добавлю!

    (10) iov, потерты администрацией)

    Reply
  4. qwinter

    (11) что же здесь было, что потерли?

    Reply
  5. Sirruf

    (12) qwinter, Небольшая дискуссия по поводу использования «авторских прав» на эту гениальную идею)

    Reply
  6. gull22

    (10) iov,

    За халяву всегда +. Осталось на УТ11 перейти.

    Reply
  7. Sirruf

    (9) qwinter, добавил в обработку http://www.fedresurs.ru/

    Reply
  8. yelena-ppm

    Эххх… жалко, что у меня ни одной УТ нету…А так бы с удовольствием и потестила, и отплюсовала, и коммент предметный написала 🙂 В любом разе — спасибо. ПОдписалась на Ваши новости. Как подцепите Бухгалтерию 8.2 — отпишите, это моя темочка 🙂

    Reply
  9. Sirruf

    (16) yelena-ppm, Бухгалтерию 3.0 подцепил, можете скачивать обработку и проверять 🙂

    Reply
  10. tadem

    а в комплесной пойдет?

    Reply
  11. olesechka

    В бухгалтерии 8.2 не идет ((( жалко (((

    Reply
  12. Sirruf

    (19) olesechka, что конкретно не идет? У вас редакция 3.0?

    Reply
  13. olesechka

    Нет, 2.0

    Или я что-то не так делаю?

    Прицепила к внешним обработкам…

    Reply
  14. Sirruf

    (21) olesechka, Да, на данный момент обработка есть только для управляемых форм.

    Reply
  15. olesechka

    (22)

    Жаль (((

    Буду ждать )))

    Reply
  16. Sirruf

    (18) tadem,

    В комплексной тоже не пойдет, так как она не на управляемых формах.

    В ближайшее время сделаю обработку для обычных форм.

    Reply
  17. Sirruf

    (23) olesechka,

    Сделал обработку для обычных форм 🙂

    Reply
  18. Sirruf

    (18) tadem,

    В комплексной теперь тоже должна работать (версия для обычных форм)

    Reply
  19. bnw

    Для обычных форм с сайта ФНС не загружается…

    Reply
  20. Sirruf

    (27) bnw,

    Что пишет? Цифры с картинки правильно ввели?

    Reply
  21. Saengmyung

    Действительно полезная обработка!

    Оптимизирует затраты времени!

    Reply
  22. Cybersant

    Будет работать в конфигурации УНФ?

    Reply
  23. Sirruf

    (30) Cybersant, Должна работать

    Reply
  24. Bacemo

    А к ДОКУМЕНТООБОРОТУ КОРП ПОДКЛЮЧИТЬСЯ через доп обработки?

    Reply
  25. wolwip

    Прекрасно работала, сейчас {Форма.Форма.Форма(1944)}: Ошибка при вызове метода контекста (Send): Произошла исключительная ситуация (WinHttp.WinHttpRequest): Время ожидания операции истекло

    Куда смотреть ?

    Reply
  26. Sirruf

    (33) wolwip, у Вас какие-то проблемы с интернетом, возможно появился прокси сервер?

    Reply
  27. bnw

    При попытки получить с сайта ФНС пишет:

    {

    «namul»: [

    «Не указано наименование юридического лица»

    ]

    }

    С сайта Контур-Фокус вообще ничего

    Reply
  28. Sirruf

    (35) bnw, Обновил обработки. Скачайте свежую версию.

    Reply
  29. ligan

    (36) Контур-Фокус так и не работает!

    Reply
  30. Sirruf

    (37) ligan, да, пока не работает

    Reply
  31. wolwip

    Прокси нету. Работает только с сайта ФНС, с контура не берет и с федреестра. Фнс не очень удобен, по ИНН в отдельности не ищет

    Reply
  32. maksa2005

    Ошибка

    Reply
  33. maksa2005



    ОШИБКА!!!

    Reply
  34. Bacemo

    Как ни хотим ФНС, в Бухгалтерии 3 используют именно её

    Reply
  35. victory1985

    Скачала, стоит 8.3.5.1146 КА 1.1.51.2

    При нажатии на кнопку зарегистрировать выдает: «{Форма.ФормаКонтрагента.Форма(24)}: Значение не является значением объектного типа (ПолучитьОбъект)

    ОбъектКонтрагент = СсылкаКонтрагент.ПолучитьОбъект();

    »

    Почему и как исправить?

    Reply
  36. bashirov.rs

    (25) Очень актуальная тема. При возможности обязательно скачаю — протестирую. На данный момент пользуюсь только ресурсом fedresurs.ru. Вопрос откуда актуальнее брать данные? Неужели необходимо перебирать столько ресурсов?

    Reply
  37. gull22

    Конфигурация КА.Заводил для поиска только ИНН своей организации

    По ФНС нашло.

    По Контуру не нашло

    По сайту Федреестра по ИНН -выдало ошибку

    {Форма.ФормаКонтрагента.Форма(231)}: Поле объекта не обнаружено (ADRESTEXT)

    Адрес = ВыбранныйКонтрагент.ADRESTEXT;

    .

    Reply
  38. _qqq

    (43) victory1985,

    реквизит обработки СсылкаКонтрагент имеет тип Строка, надо изменить на СправочникСсылка.Контрагенты.

    И Реквизит СсылкаОрганизация тоже имеет тип Строка, его тоже можно поменять на соответствующий.

    Reply
  39. _qqq

    При поиске по Контуру результат ResponseText:

    <html><head><title>Object moved</title></head><body>
    <h2>Object moved to here.</h2>
    </body></html>
    Reply
  40. myzza2006

    Через веб интерфейс обработка не запускается.

    Reply
  41. IsiKosta

    ИП не ищет, пришлось доделывать. Спасибо!

    Reply
  42. mnemchinov

    гыг.. в 8.3.6:

    Ошибка инициализации модуля: Форма.Форма.Форма

    по причине:

    Процедура или функция с указанным именем уже определена (ЗаписатьJSON)

    Reply
  43. myzza2006

    А можно ли данную обработку открыть в web версии 1с 3.0?

    Reply
  44. ako

    УТ 11, платформа 8.3.6.2041. При запуске выдает {Форма.Форма.Форма(258,9)}Процедура или функция с указанным именем уже определена .ПрочитатьJSON) .Не работает, а жаль (

    Reply
  45. korvin76

    (52) ako,

    Переименуйте процедуру, например в «ПрочитатьJSON1» и ссылки на нее..у меня заработало

    Reply
  46. saint07

    Появилась ошибка:

    {Форма.Форма.Форма(575)}: JSON: Некорректный формат числа «<» в позиции 6.

    ВызватьИсключение ИсключениеНекорректныйФорматЧисла(Начало, Сред(Значение, Начало, Индекс — Начало));

    Кто подскажет куда копать ?

    Reply
  47. feel_deep

    (54) saint07, присоединяюсь…

    Reply
  48. java66

    (54) — Присоединяюсь!

    Reply
  49. saint07

    тишина …

    Reply
  50. amiralnar

    (54) saint07,

    (55) feel_deep,

    (56) java66,

    Надо в адресе запроса поменять http на https

    ГетЗапрос.Open(«POST», «https://egrul.nalog.ru/», 0);

    Так работает.

    Reply
  51. saint07

    (58) amiralnar, спасибо !

    Reply
  52. tatiannna

    в бухгалтерии базовой будет работать?

    Reply
  53. Muhin555

    (45) В модуле «Форма» найти Процедуру НайтиФедРесурс() и в ней за комментировать второе объявление «ВыбранноеЗначение». Должно выглядеть так:

    Отказ = Ложь;

    //ВыбранноеЗначение = Новый Структура;

    ПолучитьДанныеФедРеестр(ВыбранноеЗначение, url, Отказ);

    Reply
  54. v3n7

    (9) qwinter, не поделитесь описанием API для получения данных?

    Reply
  55. pvlunegov

    Спасибо за обработку. После исправлений в коде работает как надо

    Reply
  56. pvlunegov

    (9) qwinter,

    Не вводите в заблуждение людей.

    В вашей обработке идет запрос на сайт http://www.fedresurs.ru. Этот ресурс хоть и государственный, НО! В нем публикуются только некоторые сведений о юр. лицах.

    Многие ИП-шники на этом ресурсе не значатся.

    Таким образом, значительная часть организаций, действующих МНОГО ЛЕТ в виде ИП (всякие мелкие конторы, заводики и т.п. ИП хозяйства в глубинке и в городах области)

    на этом ресурсе не значатся и не видятся вашей обработкой.

    НАпример ИП Аристов Юрий Алексеевич 661100051911

    Этот косяк очень значительный, именно поэтому НЕОБХОДИМО ИСПОЛЬЗОВАТЬ ГОС. ресурс http://www.egrul.nalog.ru

    Reply
  57. shur52

    (9) qwinter, А не подскажите, как по федресурсу ИП искать? IsiKosta тут написал в (49), что доработал. Скачал я его код. ИП он так же не ищет.

    Get-параметр ?filter= не работает для страницы http://www.fedresurs.ru/IndividualEntrepreneurs. Подобрать правильный GET-параметр я не смог. Может, вы его подскажете?

    Reply
  58. shur52

    (64) pvlunegov, Скорее всего, вы ошибаетесь. Ваш пример ИП Аристов Юрий Алексеевич 661100051911 находится по федресурсу: http://www.fedresurs.ru/individualEntrepreneurs/64F648BB5392C78A5184A2CA5098173A . Попробуйте воспользоваться поиском на странице http://www.fedresurs.ru/individualEntrepreneurs/IsSearching. Проблема тут в другом. Обработка (9) может распарсить только ветку http://www.fedresurs.ru/Companies, но не ветку http://www.fedresurs.ru/individualEntrepreneurs. Это связано с тем, что разработчики сайта заложили Get-параметр ?filter= для страницы http://www.fedresurs.ru/Companies, но этот параметр не работает для страницы с реестром ИП. А вот подобрать Get-параметр для ИП пока не удается никому, насколько я понимаю. Возможно, его разработчики сайта не заложили в своем коде.

    Reply
  59. shur52

    Я разобрался с http://www.fedresurs.ru. Ветку http://www.fedresurs.ru/individualEntrepreneurs/ я распарсил. Посмотрел через браузер содержимое post-запроса для поиска ИП — и использовал такой же post-запрос в своем коде 1с. Get-запрос так и не подобрал, но это уже мне и не нужно. Всем спасибо. Если кому-то будет надо распарсить ИП на федресурсе — пишите, помогу.

    Reply
  60. serpent

    (67) shur52,

    пиши сюда, интересно

    Reply
  61. capitan

    С ЕГРЮЛ не загружает.

    А задумка очень хорошая.

    Reply
  62. capitan

    (58) amiralnar, спасибо !

    Автор, поправь обработку, тогда можно будет смело плюсовать

    Reply
  63. madonov

    Версия на обычных формах с ЕГРЮЛ не работает!

    Reply
  64. frolovmiham

    При запуске в УТ10,3 (10.3.41.1)

    1С:Предприятие 8.3 (8.3.8.2197)

    выдает ошибку:

    {ВнешняяОбработка.ВводКонтрагентовПоДаннымФНС_ОФ.Форма.Форма.Форма(260,9)}: Процедура или функция с указанным именем уже определена (ПрочитатьJSON)

    Функция <<?>>ПрочитатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь)

    {ВнешняяОбработка.ВводКонтрагентовПоДаннымФНС_ОФ.Форма.Форма.Форма(282,9)}: Процедура или функция с указанным именем уже определена (ЗаписатьJSON)

    Функция <<?>>ЗаписатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь)

    {ВнешняяОбработка.ВводКонтрагентовПоДаннымФНС_ОФ.Форма.Форма.Форма(2408,14)}: Обращение к процедуре как к функции (ЗаписатьJSON)

    Сообщить(<<?>>ЗаписатьJSON(Значение));

    {ВнешняяОбработка.ВводКонтрагентовПоДаннымФНС_ОФ.Форма.Форма.Форма(2408,14)}: Недостаточно фактических параметров (ЗаписатьJSON)

    Сообщить(<<?>>ЗаписатьJSON(Значение));

    Reply
  65. frolovmiham

    Разобрался, как указано выше, надо внести два изменения:

    1. Поменять ЗаписатьJSON на ЗаписатьJSON1 и ПрочитатьJSON на ПрочитатьJSON1

    2. Надо в адресе запроса поменять http на https

    ГетЗапрос.Open(«POST», «https://egrul.nalog.ru/», 0);

    Так работает!

    Reply
  66. 27272

    (73)

    ГетЗапрос.Open

    В Бухгалтерия государственного учреждения, редакция 1.0 (1.0.48.6), после исправления Максим 2 раза, запускается, но после ввода капчи ошибка:

    {ВнешняяОбработка.ВводКонтрагентовПоДаннымФНС_ОФ.Форма.ФормаКонтрагента.Форма(241)}: Поле объекта не обнаружено (ЮрФизЛицо)

    ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;

    Reply
  67. saint07

    {«ERRORS»:{«query»:[«Не заполнено обязательное поле «Поисковый запрос»»]}}

    у кого такие же проблемы ?

    Reply
  68. dynamicsystems

    (76) подтверждаю проблему. Придется раскуривать этот вопрос на днях… иначе коллеги сожрут за нерабочий ергюл

    Reply
  69. chkurs

    (76)

    {«ERRORS»:{«query»:[«Не заполнено обязательное поле «Поисковый запрос»»]}}

    Надо изменить на:

    ПоисковыйЗапрос = «query=»+СокрП(ИНН); Ошибка исчезает, но ответ какой-то не тот, короткий и не удается его распарсить.

    Reply
  70. dynamicsystems
    Reply
  71. chkurs

    (80)

    писалось на коленке

    : В тестовом примере обработки замени, пожалуйста, «ADRESTEXT» на «ADR_TEXT», а то адрес не подтягивается. Спасибо за решение проблемы! Доброте твоей нет предела!

    Reply

Leave a Comment

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