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




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

26 Comments

  1. delta

    Добрый день! Подскажите, вы сравнивали для себя заполнение реквизитов контрагентов с помощью вашей обработки и с помощью сервиса 1С:Контрагент? Они идентичны или есть различия?

    Reply
  2. renmy

    (1) delta, В При заполнении контрагента не заполняется номер телефона организации. При заполнении организации не заполняется телефон, платежные реквизиты ПФР, ФСС. В остальном вроде идентичны.

    Reply
  3. centrs

    Не работает. Ошибка отображения типов. Отсутствует отображение типа «Файл»

    Reply
  4. renmy

    (3) centrs, Версия платформы? Конфигурация? Тип Клиента Веб,тонкий клиент? ИНН?

    Reply
  5. bambr1975

    (4) в версии расширения для УТ11 Вы ошиблись в функции ФайлыPDFTOTXTСуществуют.

    В 3600 строке, где у Вас:

    РезультатПроверки.Вставить(«pdftotext», ФайлПроверки)

    надо было написать

    РезультатПроверки.Вставить(«pdftotext», ФайлПроверкиСуществует)

    Получается, что Вы с клиента на сервер сам Файл отправляете, а не булево. После исправления — работает нормально.

    Reply
  6. renmy

    (5) bambr1975, Спасибо. В следующем релизе поправлю. Сейчас готовлю обработку для онлайн обновления расширения. Для тех кто уже скачал расширения вышлю обработку обновления.

    Reply
  7. catfood

    (6) такая же проблема, отсутствует отображение типа файл. версия платформы 8.3.7.2008, БП КОРП 3.0.43.187

    Reply
  8. catfood

    (6) {Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(2285)}: Поле объекта не обнаружено (ЮридическоеФизическоеЛицо)

    Если Объект.ЮридическоеФизическоеЛицо <> РеквизитыКонтрагента.ЮридическоеФизическоеЛицо Тогда

    Теперь выдает это. А если искать ИП по наименованию.не высвечивается картинка с цифрами для проверки

    Reply
  9. renmy

    Кто уже скачал расширение я выслал ссылку на обработку обновление, кому не пришла, пишите в личку.

    Reply
  10. capitan

    Автор просто красавчик, хотя бы тем, что остальные просто барыжат свои обработки.

    А на мой взгляд решение расширениями конфигурации на порядок технологичнее.

    Плюс однозначно.

    Некоторые замечания:

    1. Подключайте расширение с отключенным безопасным режимом, иначе не выйдете в интернеты.

    2. Я бы не делал троекратное дублирование в форме контрагента, вполне достаточно одного раза, но на вкус и цвет.

    3. Расширение работает на клиенте. Не проверял досконально, но пока клиенту не открыть доступ к сайту егрюл капча не отображается.

    Что в общем то логично. Хорошо сделанную капчу так просто с сервера на клиент не перекинуть.

    Если будет желание — могу предложить решение как прикрутить сервис ру-капча к 1С. У них цены 20 руб за 1000 капч.

    Reply
  11. xmorex

    Да , прикрутить сервис типо рукаптчи или антикаптчи было бы неплохо…

    Reply
  12. teflon

    (10) capitan,

    Если будет желание — могу предложить решение как прикрутить сервис ру-капча к 1С

    Очень интересно, если можно, пжлста, подробнее об этом.

    Reply
  13. teflon

    (9) в расширении в обработке «ЗаполнениеКонтрагентаДаннымиФНС» в 117-й строке макета «ОКОПФ» в 3-й колонке пропущен пробел в наименовании типов организации «Государственное бюджетноеучреждение», поэтому на таком типе организации вываливается ошибка, нужно указать «Государственное бюджетное учреждение», чтобы ошибки не возникало. Или поправить функцию «ЗаполнитьОбъектXDTOРеквизитыЮрЛица» в строке «Если Не ПустаяСтрока(ДанныеОКОПФ.КодОПФ) Тогда» проверять не на пустую строку, а на отсутствие значения (Неопределено).

    Reply
  14. teflon

    (9) еще заметил, что адреса не всегда корректно заполняются, т.е. адрес как бы заполняется, но при нажатии кнопки «Проверить заполнение» непосредственно в карточке этого адреса, проверка выдает ошибки, например, у меня в строку «Город, нас. пункт» попали только наименование района и край, а сам населенный пункт (в моем случае это было село) не попал, остальные реквизиты адреса — индекс, улица, номер дома заполняются нормально.

    Разобрался в проблеме: чтобы правильно заполнялось поле «Город, нас. пункт» нужно в функции «ДанныеЮрЛицаИзTXT» изменить строку:

    СписокПоказателейАдрес.Добавить(«Населенный пункт (село и т.д.)»,»АдресСело»);

    на

    СписокПоказателейАдрес.Добавить(«Населенный пункт (село и т.п.)»,»АдресСело»);
    Reply
  15. teflon

    (9) c заполнением ЮрЛиц вроде неплохо, а вот с ФизЛицами не очень хорошо, в том смысле, что кроме ФИО и ОГРНИП больше ничего не заполняется, ни адрес, ни данных о регистрации (св-ва)… 🙁 посмотрел, действительно в выписке ЕГРЮЛ нет адреса ФЛ. но «Серия, номер и дата выдачи свидетельства» есть и они не заполняются…

    Заполнение «Серия, номер и дата выдачи свидетельства» решил добавлением следующих строк в функцию «ПолучитьРеквизитыОрганизации»:

      Если ОбъектXDTO.СвРегИП <> Неопределено Тогда
    РеквизитыПредпринимателя.ДатаРегистрации = ОбъектXDTO.СвРегИП.ДатаРег;
    РеквизитыПредпринимателя.Вставить(«СвидетельствоДатаВыдачи», ОбъектXDTO.СвРегИП.ДатаРег);
    ИначеЕсли ОбъектXDTO.СвФЛ <> Неопределено Тогда
    РеквизитыПредпринимателя.ДатаРегистрации = ОбъектXDTO.СвФЛ.ДатаНачДейств;
    РеквизитыПредпринимателя.Вставить(«СвидетельствоДатаВыдачи», ОбъектXDTO.СвФЛ.ДатаНачДейств);
    КонецЕсли;
    
    ПозицияДаты = СтрНайти(СтруктураДанныхИзФайла.СерияНомерСвВа,» «,,,2);
    //ДатаСвВа = Сред(СерияНомерСвВаСДатой, ПозицияДаты);
    СерияНомерСвВа = Лев(СтруктураДанныхИзФайла.СерияНомерСвВа, ПозицияДаты-1);
    
    РеквизитыПредпринимателя.Вставить(«СвидетельствоСерияНомер», СерияНомерСвВа);
    

    Показать

    Reply
  16. renmy
    teflon

    Спасибо. Добавил ваши доработки в новый релиз.

    Reply
  17. TrinitronOTV

    Большое спасибо за расширение, очень помогло

    Reply
  18. capitan

    Не работает в конфигурации 3.0.43.247

    там поменялись типы присоединенных файлов справочника Организации

    сюда выкладывать не буду, надеюсь автор сам поправит

    Reply
  19. TrinitronOTV

    Жаль, что автор не поддерживает это расширение

    Reply
  20. capitan

    (19) TrinitronOTV, тут ресурс для технически подкованных людей.

    А если хотите чтобы автор не забрасывал свой проект, его надо поддерживать (автора)

    Reply
  21. webresurs

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

    Бухгалтерия предприятия, редакция 3.0 (3.0.44.177)

    Ошибка подключения расширения: ЗаполнениеДаннымиФНС (0.4) — Ошибка свойства РежимСовместимостиИнтерфейса у объекта

    Reply
  22. zhenya17

    Раньше не имела дела с расширением, подскажите, в чём может быть проблема: добавила в режиме предприятия расширение, но оно помечено красным кружком и в контрагентах ничего не появляется. После добавление расширения программу перезапускала. Ошибок вроде никаких не выдаётся.

    БП 3.0.48.22, платформа 8.3.9.1818

    Reply
  23. renmy

    Евгения. [22] Данная разработка предназначена для программистов как ознакомительная. Последний раз проверял на версии 3.0.42. Красный кружок означает расширении не прошло проверку совместимости с текущей версией.Скорее всего изменилась структура справочников используемых в расширении. Необходима доработка под текущую версию конфигурации.

    Reply
  24. evgefremov

    поставил вашу обработку клиенту для ознакомления.

    недавно у него нашелся вирус, говорит что ругается на эту обработку. у меня антивирус говорит что все чисто. в чем дело не пойму(

    Reply
  25. renmy

    (24) Первый раз такое вижу. Вероятно цель вируса файлы 1С. Почистите от вирусов и закиньте заново.

    Reply
  26. scream

    а как по ОбъектXDTO

    определить что контрагент прекратил деятельность?

    Reply

Leave a Comment

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