УТ 10.3: как сделать периодическими налоговые реквизиты организации (ИНН, КПП, Юридический адрес).




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

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

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

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

19 Comments

  1. Пацталоцци

    Я в шоке…

    83 просмотра и всего один плюс…

    В чём дело, коллеги?

    Если есть какие-то замечания/нарекания, прошу поделиться.

    Reply
  2. Одинец

    Добрый день! Если уж начал делать такую доработку, то логичнее дописать добавление записи в регистр сведений «История налоговых реквизитов организаций», а иначе как сам пишешь: «налоговые реквизиты меняются весьма нечасто (раз в несколько лет), поэтому автоматизировать этот процесс не вижу смысла»(С)Панталоцци. Так что или закончи доработку и получи «+» или «автоматизировать этот процесс не вижу смысла.»(С)Панталоцци

    Reply
  3. Пацталоцци

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

    И доработка полностью выполняет свою цель.

    Следить за актуальностью регистра — это второй вопрос. На мой взгляд, тут удобнее «ручное управление» содержимым регистра.

    Как я уже сказал, налоговые реквизиты меняются очень редко. У меня база возрастом 9 лет, 11 организаций.

    И за все 9 лет только две записи в этом регистре. За каким лядом автоматизировать это?

    Reply
  4. TMV

    А в каких случаях меняется ИНН? Не нужно ли заводить нового контрагента?

    Reply
  5. Пацталоцци

    ИНН юридического лица меняется при реорганизации (например, было ЗАО, стало ООО)

    Юридический адрес и КПП могут меняться чаще — например, при переезде

    Reply
  6. gull22

    Подощли к такой же проблеме. Плюсую за ее решение.

    Reply
  7. anchovy

    (1) делюсь.

    Использовать периодический РС для хранения периодически изменяющихся данных это хорошо. Что нового в вашем решении? Ничего. Тогда за что много плюсов должно быть поставлено?

    Reply
  8. Пацталоцци

    (7) anchovy,

    Тогда за что много плюсов должно быть поставлено?

    Где я написал, что много плюсов ДОЛЖНО быть поставлено? Покажи мне, где у меня есть такие слова, будь добр.

    Мне нафиг твой плюс не нужен, оставь его себе и береги как зеницу око!

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

    В статье перечислены детально все правки, которые нужно внести в конфигурацию. Тот, кто столкнулся с похожей проблемой, может воспользоваться статьёй и решить проблему за 10 минут. Если я смог кому-то сэкономить время, думаю он плюсанёт. Ты не относишься к этой категории, поэтому всего хорошего, иди дальше со своим драгоценным плюсом.

    Reply
  9. anchovy

    Тренироваться.

    Медитировать.

    Учить Русский язык.

    Удачи.

    Reply
  10. Пацталоцци

    Я тебя тоже люблю.

    Давай, покеда.

    Reply
  11. nick_krsk

    Спасибо за наводку, буду прикручивать к БП 3.

    Reply
  12. yurik32

    Спасибо, не успел купить юр адрес, и уже такую нужную статью нашел

    Reply
  13. ildarovich

    Спасибо.

    Попробовал на одной базе реализовать этот подход.

    Но с небольшими изменениями.

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

    Которые были «до» даты их изменения. Это значит, что нужно использовать не срез последних, который определяет действующие реквизиты, а срез первых. Иначе непонятно, с какого периода ставить действие старых реквизитов.

    Reply
  14. sinTambov

    спасибо!

    Reply
  15. okrd

    Премного благодарен.

    Reply
  16. FarFar

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

    А периодический регистр универсальный у меня уже свой был ))

    Reply
  17. script

    Сделал копию регистра сведений КонтактнаяИнформация — назвал ИстоиряКонтактнойИнформации.

    Сделал подписку на события ПриЗаписи для РС.КонтактнаяИнформация

    Общиймодуль.ИсторияКонтактнойИнформации, где храниться процедура из подписки на событие.

    Там описал процедуру, которая при любых изменениях в контактной информации проверяет отличие от последней записи в истории (РС.ИстоиряКонтактнойИнформации). Если отличия есть в полях: «Представление» и «Комментарий», в РС.ИстоиряКонтактнойИнформации добавляется новая запись с актуальными данными. (Можно конечно проверить все поля)

    Таким образом история собирается автоматически. А дальше — как у автора.

    Reply
  18. romuales

    Спасибо За подсказку. Дописал себе еще и ФактическийАдрес. По аналогии с Юридическим.

    Reply
  19. asport

    Здравствуйте, для меня все это большая загадка, но может быть вы подскажите):

    После импорта из 7.7 для всех старых контрагентов адрес печатается в документах, а для новых нет

    Т.е. в карточке адрес есть, но его код не 00…01 или 00…02, а другой и в документах пусто, только инн и кпп

    Смотрю в демо версию, там если добавить новую запись для юрадрес или фактичесий, появляется новое значение, с новым кодом и тогда тоже не печатает адрес в документах, а со значением 00…01 печатает

    Я бы рад выбрать какое то другое значение для юр адреса, но могу только плодить новые)

    подскажите пожалуйста, как это сделать?

    Мне показалось, что в этой статье описана похожая задача, но не может же быть все так страшно в реализации!)

    Reply

Leave a Comment

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