Заполнение реквизитов всех контрагентов по ИНН




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

35 Comments

  1. ded00786

    Это уже которая версия на сайте? 🙂 Все прям помешались на заполнении реквизитов контрагентов по ИНН 🙂

    Впрочем! Чем больше — тем лучше!

    Reply
  2. ZOMI

    Идеологически неверно давать такой инструмент бухгалтеру:

    1) Изменение реквизитов по контрагентам, у которых уже есть документы, может привести к большим недоразумениям

    а) Многие юрлица меняют наименования и юр. адрес, а перепечатки-переделки документов за старые периоды — распространенное явление. Девочка, которая сидит на «реализации» — запросто перепечатает все доки за квартал — и отправит клиенту… Инфу, что с середины квартала у клиента другой юр. адрес или наименование — она где узнает?

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

    в) Во многих базах есть специально заведенные дубли с одинаковыми ИНН, кроме ситуации с обособленными подразделениями и т.д.

    г) За правильное введение реквизитов должен отвечать конкретный человек так как эти реквизиты используются в юридически значимых документах… Пример — вы отгрузили в кредит клиенту — в отгрузочных документах -неверные реквизиты. Клиент не платит — вы подаете в арбитраж — есть примеры в судебной практике — что суд вообще не принимал к рассмотрению иски по докам с ошибками или ответчик оспаривал иск только на основании ошибочных реквизитов…

    Есть и другие причины, но этого уже достаточно///

    (1) ded00786, первая (с 2012г) и лучшая «заполнялка/обновлялка» это Contragent+ // Некоторые авторы дублей даже мое описание из публикации копировали…

    Reply
  3. Amelk

    Заполнение реквизитов всех контрагентов по ИНН, а было б неплохо подтягивать информацию из других информационных систем автоматически, например по soap. Например, по защищенным каналам с налоговой.

    Reply
  4. Amelk

    а еще интересно какие вы уникальные реквизиты используете в кости идентификаторов кроме ИНН

    Reply
  5. dour-dead

    (2) ZOMI,

     лучшая «заполнялка/обновлялка» это Contragent+

    А это чем то обосновывается? или это просто так я написал, и она лучшая)

    Reply
  6. GROOVY

    Довольно странный подход для публикации обработки, берем типовой механизм и выборкой запускаем его для произвольного количества элементов. Ну как-то мелко это.

    В новых БП, кстати, и благонадежность контрагента проверяется.

    Reply
  7. CheBurator

    как ты проверишь благонадежность-то? тащат инфу из кучи открытых источников и пытаются скомпилировать для выдачи НА ЧТЕНИЕ ЮЗЕРУ

    Reply
  8. ZOMI

    (5) dour-dead, здесь некорректно расхваливать — в http://infostart.ru/public/166049/ все изложено)

    Reply
  9. Amelk

    Спасибо за ссылку(8) ZOMI, полезная инфа

    Reply
  10. zainaz

    Просто клиент требовал такую обработку. Им было объяснено, что если ИНН кривой, то и все реквизиты запишутся вовсе не те. Применять обработку конечно нужно с огромной осторожностью.

    Reply
  11. zainaz

    (2) ZOMI,

    1). Это бесплатно, в отличии от вашей обработки…..

    Есть и другие причины, но этого уже достаточно 🙂

    Спасибо за замечания, если не будет лень, напишу обработку со всеми исправлениями и она будет в точь как ваша. Вам это надо?

    Reply
  12. ded00786

    (2) ZOMI,

    первая (с 2012г) и лучшая «заполнялка/обновлялка» это Contragent+ // Некоторые авторы дублей даже мое описание из публикации копировали…

    У Вас есть эксклюзивные права на сервис 1С или сервис ФНС для получения данных о контрагентах по ИНН? Если нет, то мне непонятна Ваша претензия автору и бессмысленное утверждение что Ваша обработка лучшая (хотя, вру, про бесстыжую саморекламу все понятно).

    Infostart — это конференция разработчиков где каждый обменивается знаниями и опытом. Если автор пожелал поделиться своей разработкой, то спасибо ему. Указать на конкретные его ошибки и оставить замечания о функциональности Вы можете. Но говорить что он не имел права это выкладывать или что «а я мог бы лучше» ни Вам, ни кому либо другому не позволено! Пусть это и еще одно колесо, но возможно с другими спицами и кому-то пригодится, а не пригодится и ладно.

    Reply
  13. FetisovAN

    Норм обработка, сохранил час своего времени 🙂 Очень востребована бухгалтерами.

    Предложение автору — добавь сразу в модуль код для подключения в базу в качестве дополнительной обюработки. Все же обработка для пользователей, а доступ для запуска внешних обработок обычно у пользователей закрыт.

    Reply
  14. FetisovAN

    И в сообщении о том что ИНН введен некорректно, не хватает информации что за контрагент

    ИначеЕсли НЕ ЗначениеЗаполнено(Объект2.ИНН) Тогда

    Сообщить(«Поле ИНН не заполнено «+ Объект2.Наименование);

    Продолжить;

    ИначеЕсли НЕ Объект2.ИННВведенКорректно Тогда

    Сообщить(«ИНН введен некорректно»); ———————> добавить вывод объекта

    Продолжить;

    КонецЕсли;

    Reply
  15. nacsa

    каждый раз при использовании обработки добавляются новые строки контактной информации..

    Контакт=Объект2.КонтактнаяИнформация.Добавить();

    думаю это ошибка.

    ну и само оформление кода, конечно..

    Reply
  16. soda

    Скажите, а есть ограничения по количеству запросов к сервису в какое-то время? А то он данные по 100 ИНН выдает, а дальше пустота…

    Reply
  17. V_M_V

    После повторного Заполнения реквизитов перестали открываться контрагенты с выводом на экран сообщения «Поле объекта не обнаружено (ЗаголовокКонтактнаяИнформацияПоле2)

    БП 3.0.40.33.

    Reply
  18. zyama

    (17) V_M_V, столкнулись с такой же проблемой. В итоге ошибка заключается в том, что в ТЧ Контактная информация несколько одинаковых строк с телефоном/адресом и т.д.. В модуле формы такие строки выпадают на исключение в общем модуле УправлениеКонтактнойИнформацией (стр 184-190). С помощью обработки нашла «лишние» строки с повторяющимися видами контактной информации (колонка Вид) и удалила их. В итоге все теперь открывается.

    Reply
  19. SLord

    (18) zyama,

    Такая же проблема, но что делать обычным, но хотя бы продвинутым пользователям? Куда копать? Что за обработка (С помощью обработки нашла «лишние» строки с повторяющимися видами контактной информации (колонка Вид) и удалила их. В итоге все теперь открывается.)?

    Заранее спасибо.

    Reply
  20. voofka2

    Результат выполнения данной обработки — в контрагента не войти, выдает ошибку.

    Reply
  21. kbiryukov

    Скачали сегодня Вашу обработку, Платформа 8.3.6.2390, релиз БП — 3.0.42.73. При выполнении выдает ошибку Метод объекта не обнаружен (ПроверитьКорректностьИННКПП)? Можете исправить?

    Reply
  22. Archi050505

    подскажите а в 1с 8.3 нет возможности автозаполнения по инн? 400 р в месяц -это саботаж и кидалово…

    может есть какие плагины или дополнительные программы?

    Reply
  23. NCCSOFT

    Вылетает ошибка! Исправьте, пожалуйста, ошибку.

    {ВнешняяОбработка.ЗаполнениеРеквизитовПоИНН.Форма.Форма.Форма(180)}: Метод объекта не обнаружен (ПроверитьКорректностьИННКПП)

    ВозвращеннаяСтруктура = ОбщегоНазначенияБПКлиентСервер.ПроверитьКорректностьИННКПП(СтруктураПараметров);

    ————

    Бухгалтерия предприятия, редакция 3.0 (3.0.51.21) / Ядро (8.3.10.2505)

    Reply
  24. Paul_Miky

    УДАЛИТЕ ИЛИ ОБНОВИТЕ, ОНА С ОШИБКАМИ, скачал а там вообще не актуальный код!!!

    Reply
  25. NCCSOFT

    (24) я исправил ошибку, взяв код из новой конфигурации! Работает 🙂

    Reply
  26. Paul_Miky

    При открытии пишет по-прежнему Бухгалтерия предприятия, редакция 3.0 (3.0.58.20) :

    {ВнешняяОбработка.ЗаполнениеРеквизитовПоИНН.Форма.Форма.Форма(106,26)}: Переменная не определена (СервисДанныхЕдиныхГосРеестров)

    РеквизитыКонтрагента = <<?>>СервисДанныхЕдиныхГосРеестров.РеквизитыЮрЛицаПоИНН(Объект2.ИНН); (Проверка: Сервер)

    {ВнешняяОбработка.ЗаполнениеРеквизитовПоИНН.Форма.Форма.Форма(108,26)}: Переменная не определена (СервисДанныхЕдиныхГосРеестров)

    РеквизитыКонтрагента = <<?>>СервисДанныхЕдиныхГосРеестров.РеквизитыПредпринимателяПоИНН(Объект2.ИНН); (Проверка: Сервер)

    Reply
  27. NCCSOFT

    (26) я исправил у себя на компьютере, но я не автор этой обработки 🙂

    Моя обработка переносит контрагентов из 1С 77 «Платежные документы» (очень древняя база) в 1С 83 БП 3.0

    (и по ИНН заполняет реквизиты перенесённых контрагентов)

    Отработала отлично!

    Reply
  28. triera2000

    Прошу автора исправить ошибку — в актуальной версии БП 3.0 обработка не работает.

    Reply
  29. sergik444

    НЕ РАБОТАЕТ обработка в актуальной версии 1С!!!

    Reply
  30. asdfr16

    НЕ РАБОТАЕТ обработка в актуальной версии 1С!!! 1С:Предприятие 8.3 (8.3.13.1513), Бухгалтерия предприятия, редакция 3.0 (3.0.66.53)

    Reply
  31. tdkintel

    НЕ РАБОТАЕТ!!!!!

    Reply
  32. ruffer

    (26)

    В коде нужно поменять

    ЭтоЮрЛицо = Объект2.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
    Если ЭтоЮрЛицо Тогда
    РеквизитыКонтрагента = РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН(Объект2.ИНН);
    Иначе
    РеквизитыКонтрагента = РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН(Объект2.ИНН);
    КонецЕсли;
    Если ЗначениеЗаполнено(РеквизитыКонтрагента.ОписаниеОшибки) Тогда
    ОписаниеОшибки = РеквизитыКонтрагента.ОписаниеОшибки;
    Возврат;
    КонецЕсли;
    

    Показать

    Reply
  33. ruffer

    Помимо первой ошибки что описал вышел, есть еще ошибки внутри не рекомендуется к скачиванию.

    Reply
  34. ruffer

    Полностью пришлось переписать по причине того что БСП уже поменялось. Кто все таки хочет чтобы обработка отработала, воспользуйтесь загрузка выгрузка xml в более старую версию программы.

    Reply
  35. FetisovAN

    (34) обработка написана в 2015 году 🙂

    Reply

Leave a Comment

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