Модуль обмена с банком ВТБ




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

23 Comments

  1. Grey123

    На версии 3.1.8.155 при добавлении при выборе сотрудника вручную для реестра в банк выдает ошибку {(5, 2)}: Таблица не найдена «РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СрезПоследних»

    <<?>>РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СрезПоследних КАК ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СрезПоследних

    Reply
  2. Roin2512

    (1)Исправлю в течении дня. Я на этой версии её не тестировал. обновлюсь и поправлю

    Reply
  3. Roin2512

    (1)Исправлено

    Reply
  4. BARBAROSSA88

    Добрый день.

    На ЗУП 3.1.8.155.

    Вылезла ошибка при добавлении сотрудника вручную на закладке «Реестр на выпуск банковских карт».

    Ошибки:

    ———————————————————————————

    16.11.2018 12:15:26

    {ВнешняяОбработка.МодульОбменаСБанком_ЗУП318.Форма.Форма.Форма(4735)}: Метод объекта не обнаружен (СведенияОбАдресеВВидеСтруктуры)

    АдресРФРасширенный = Обработки.РасширенныйВводКонтактнойИнформации.СведенияОбАдресеВВидеСтруктуры(КонтактныеДанные.ЗначенияПолей,); // Роман +

    Reply
  5. Roin2512

    (4)

    {ВнешняяОбработка.МодульОбменаСБанком_ЗУП318.Форма.Форма.Форма(4735)}: Метод объекта не обнаружен (СведенияОбАдресеВВидеСтруктуры)

    Исправлено

    Reply
  6. Roin2512

    (4) Напишите емайл, скину исправленную

    Reply
  7. lys1990@mail.ru

    Добрый День ЗКГУ 3.1 (3.1.8.155)

    ошибка при добавлении сотрудника на выпуск банковских карт

    {ОбщийМодуль.УправлениеКонтактнойИнформациейСлужебный.Модуль(1297)}: Ошибка при вызове метода контекста (ЗначениеЗаполнено)

    Если НЕ ЗначениеЗаполнено(Адрес) Тогда

    по причине:

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

    Reply
  8. Roin2512

    (7)завтра посмотрю. Но на этой конфигурации не пробовал работу.

    Reply
  9. Roin2512

    (7) У меня не получилось повторить этой ошибки. В каком формате вы вводите адрес у физ.лица?

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

    Reply
  10. lys1990@mail.ru

    (9)lys1990@mail.ru

    Reply
  11. user1153896

    (7)

    Если НЕ ЗначениеЗаполнено(Адрес) Тогда

    по причине:

    Адрес_по_документу нужно использовать, а вот с ошибкой {(5, 2)}: Таблица не найдена «РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СрезПоследних»

    <<?>>РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СрезПоследних КАК срезПоследних

    я так и не справился, почему нет доступа к регистру сведений не пойму????

    Reply
  12. user1035244

    Добрый день! выдает ошибку {ОбщийМодуль.УправлениеКонтактнойИнформациейСлужебный.Модуль(1297)}: Ошибка при вызове метода контекста (ЗначениеЗаполнено)

    Если НЕ ЗначениеЗаполнено(Адрес) Тогда

    по причине:

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

    текущий релиз зуп 3.1 (3.1.8.155), внешняя обработка ExchangeModule_HRM313_20171009

    Reply
  13. Roin2512

    (13) Возможно у вас старая версия обработки.

    Reply
  14. Roin2512

    (12) У вас также старая версия обработки. В одном из релизов 1С убрали признак периодический у регистра сведений «ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам» таким образом СрезПоследних не применимо к данному регистру.

    Reply
  15. ses2019

    Добрый день!

    ЗКГУ 3.1 (3.1.9.159),

    ошибка при добавлении сотрудника на выпуск банковских карт:

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

    Reply
  16. ses2019

    Добрый день!

    ЗКГУ 3.1 (3.1.9.159),

    ошибка при добавлении сотрудника на выпуск банковских карт:

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

    Reply
  17. Roin2512

    (17) Обработка под данный релиз пока не переделывалась.

    Reply
  18. Yura77

    Под камин 5 наш ВТБ дает обработку где адрес XDTO, а проверка стоит на значениезаполнено. Вы переделывали ее? Я немного перестрагал ее, чтобы реестр на выпуск карт сдулать.

    Reply
  19. sergey@sys-acc.ru

    Добрый день коллеги подскажите банк ВТБ совсем не поддерживает обработку обмена с банком?

    Reply
  20. Roin2512

    (20)Бывают выходят версии обработки, но редко. И не всех устраивает как они работают. Лучше в банк обратиться и спросить о наличии новых обработок

    Reply
  21. htv

    ЗКГУ 3.1.11.106

    Ошибка при добавлении сотрудника на выпуск банковских карт

    Метод объекта не обнаружен (СтрокаJSONВСтруктуру)

    Reply
  22. Roin2512

    (23)

    ЗКГУ 3.1.11.106

    Я не гарантировал работу на ЗКГУ. Там другое расположение экспортных процедур.

    Reply
  23. user1158285

    ЗУП 3.1.11.106

    Та же ошибка при добавлении сотрудника на выпуск карт. Возникает сразу после введения адреса. То есть при вводе нового сотрудника он добавляется, но только до тех пор, пока не заполнен адрес в личных данных.

    Метод объекта не обнаружен (СтрокаJSONВСтруктуру)

    Reply

Leave a Comment

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