Сравнение и сопоставление справочников через COM-соединение по реквизитам и/или GUID




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

29 Comments

  1. makas

    (0) Ваша корректно сопоставит справочники между базами УТ 10.3 и БП 2.0 ?

    Reply
  2. amurimpulse

    Изменил название и описание! Теперь должно быть понятно, что она делает!

    Reply
  3. OBEH

    «ранее никогда не обменивающихся!!»

    А что будет, если они ранее когда-то обменивались?

    Вообще, как определяется, что они «обменивались»?

    Reply
  4. amurimpulse

    (3) OBEH,

    если обмен уже происходил (стандартным механизмом), то поиск объектов производится по GUID!

    т.е.

    смысла в этой обработке в этом случае нет(ну почти нет)!

    Просто мне пришлось настраивать обмен с базами «»ранее никогда не обменивающихся!!»», а справочники как-бы одинаковые должны быть(потому-что одна контора), а при обмене, если не править правила обмена справочники задвоятся!

    РЕШЕНИЕ:

    Сопоставил вручную коды справочников с помощью этой обработки

    +

    подкорректировал правила обмена!

    вот

    Reply
  5. jonybanchicov

    А если по GUID?

    Reply
  6. jonybanchicov

    Собственно о чём:

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

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

    Хотелось бы сначала посмотреть что сопоставлено по вн.индентификатору?

    Reply
  7. amurimpulse

    (6) jonybanchicov,

    не нашёл возможности получить GUID из другой базы по средству COM-соединения!

    рассматривал вариант через XML, но запускать обработку пришлось бы из обеех баз!

    +

    критической надобности в этом не было!

    Если есть соображения по этому поводу могу дописать …

    Reply
  8. amurimpulse

    (7) amurimpulse,

    попробую чего-нибудь придумать …

    Reply
  9. jonybanchicov

    Если получится сделайте . Очень нужно. Самому некогда.

    Reply
  10. amurimpulse

    (9) jonybanchicov,

    добавил функционал сравнения по GUID …

    Reply
  11. V.Nikonov

    Есть Вопросики:

    1) А подключение только к Файловым БД? Если понадобится Клиент-Сервер, то допиливать самому?

    2) Если Базы обменивались двунаправлено и штатно, то должны быть заполнены регистры «СоответствиеОбъектов…» Эти регистры можно задействовать для Сопоставления?

    Reply
  12. amurimpulse

    (11) V.Nikonov,

    1) Да. Да (у меня нет возможности отладить на системе «клиент-сервер»).

    2) Нет.

    Reply
  13. kiberiq

    Вот обработка, которая позволяет сравнивать справочники в разных конфигурациях, и даже в случае отличающихся наименований реквизитов http://infostart.ru/public/257211/

    Reply
  14. amurimpulse

    (13) kiberiq,

    у меня много идей дописать всякое(в том числе и «даже в случае отличающихся наименований реквизитов»)!

    просто нет времени :((

    а на тот момент мне имеющегося функционала хватало …

    PS

    не активна публикация! хочу посмотреть!

    Reply
  15. kiberiq

    Такая возможность уже есть. Публикация снова активна ) Адрес тот же http://infostart.ru/public/257211/

    Reply
  16. amurimpulse

    (15) kiberiq,

    Не пробовал, но выглядит прилично! Зачет!

    Но я так понял исходя из свежести твоей обработки, что идею ты заплогиатил!!

    +

    Настроек у тебя куча! Не опытный пользователь запутается!



    Да и вообщем решать не мне, что лучше!

    Дерзайте!

    Reply
  17. kiberiq

    Думаю вряд ли кто-то обладает авторским правом на сравнение двух вещей.

    А создание обусловлено необходимостью.

    Да и все сравнение можно провести в несколько кликов.

    Reply
  18. amurimpulse

    (17) kiberiq,

    я на авторское право не претендую!

    Reply
  19. kiberiq

    (16) amurimpulse, тем не менее спасибо за оценку. )

    Reply
  20. amurimpulse

    убедительная просьба плагиаторам:

    — не выкладывайте здесь ссылки на свои публикации

    Reply
  21. amurimpulse

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

    Reply
  22. apostal86

    Прочитал, что обработка может делать записи в регистр сведений «СоответствиеОбъектовДляОбмена» А Ваша обработка может проверить правильность соответствия элементов справочников используя этот регистр?

    Reply
  23. amurimpulse

    (22) apostal86, в описании про это написано!

    пока нет! скоро отпуск, так что скоро сделаю ))

    Reply
  24. amurimpulse

    (24) apostal86, да у меня привычка ставить «!» вместо точки

    отучиваюсь потихоньку

    про описание вы правы

    надо сделать

    Reply
  25. apostal86

    (23) amurimpulse, а что за «!» — они что выражают? Возмущение или удивление? Здесь на инфостарте полно разработок и описания к ним порой просто оставляют желать лучшего. Потому и задаю такой вопрос. То что ничего не написано — ничего не говорит, я же не могу знать, насколько полно Вы изложили описание к разработке.

    Reply
  26. kiberiq

    Преимущества моей разработки:

    • 1. Работа как с файловой, так и с клиент-серверной архитектурой;
    • 2. Удобный интерфейс для выбора базы;
    • 3. Возможность Windows-аутентификации;
    • 4. Вывод результата сравнения в СКД. А это значит полностью настраиваемый вариант, с любыми группировками, отборами и сортировкой!!!



    подробнее смотрите тут http://infostart.ru/public/257211/

    Reply
  27. amurimpulse

    (27) pvb2003, на УФ не взлетит. Сначала разберусь с известными проблемами, а потом на УФ сбацаю.

    Reply
  28. pvb2003

    На Управляемых Формах вариант будет ? Или поставлю вопрос по другому как запустить под УТ 11.1.7….

    Reply
  29. Светлый ум

    Солидный инструмент +1

    — Разобрался не сразу, необходимо выставить все галки чтобы всё в отчет вывелось.

    Конструктор автоматически формирующий запрос очень вкусно сделан.

    Reply

Leave a Comment

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