АЦРК: Ссылка по 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='\

19 Comments

  1. a-novoselov

    а где обработка? ))

    Reply
  2. php5

    Интересная обработка, не тестировал, но были случая когда необходимо было найти по гуиду…

    Reply
  3. Abadonna

    (2)

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

    Интересно, а как бы ты потестировал картинку? 😉

    (0) Автор, а сам файл-то где?

    Reply
  4. murat_

    Ctrl+Alt+W открываем табло,

    1)пишем выражение, например,

    ЗначениеВСтрокуВнутр(Справочники.Контрагенты.НайтиПоКоду(«000000082»))

    получаем результат

    {«#»,9f6206b2-1ed6-423c-9b08-fd4978930c49,24:8a8f000244430ca311dba6bd4ec16d68}

    2)теперь обратно, пишем выражение

    ЗначениеИзСтрокиВнутр(«{«»#»»,9f6206b2-1ed6-423c-9b08-fd4978930c49,24:8a8f000244430ca311dba6bd4ec16d68}»)

    получаем результат

    Кредит Урал Банк ОАО

    Лично для меня так проще и всегда под рукой 😉

    Reply
  5. acrk

    (1) Не знаю куда файл делся. Добавил.

    Reply
  6. acrk

    (4) А если у вас только строка «9f6206b2-1ed6-423c-9b08-fd4978930c49», как через табло найти ссылку?

    Reply
  7. acrk

    (3) Файл куда-то пропал. Добавил.

    Reply
  8. murat_

    (6) Правда конечно еще тип объекта знать заранее еще нужно, но вроде так получилось:

    Справочники.Контрагенты.НайтиПоКоду(«000000082»).УникальныйИдентификатор()

    =>

    4ec16d68-a6bd-11db-8a8f-000244430ca3
    Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(«4ec16d68-a6bd-11db-8a8f-000244430ca3»))

    =>

    Кредит Урал Банк ОАО
    Reply
  9. acrk

    (8) То-то и оно, что тип надо знать. Да и писать выражение замучаешься.

    А обработка перебирает все возможные сслыочные типы и находит нужную ссылку, если она вообще из этой базы.

    Reply
  10. murat_

    (9) Да мне не вломы выражение настучать! 😀

    Если уж придеться написать микрокод, то скорее всего воспользуюсь «Универсальным подбором и обработкой объектов».

    Reply
  11. Abadonna

    Автор, проверочку на дурака надо таки делать 😉

    Если ссылка никакая не введена, система не поймет, что она рф_Ссылка.Пустая()

    и вывалит тебе то, что на рис.

    Надо:

    Если  ТипЗнч(рф_Ссылка)<>Тип(«Неопределено») Тогда
    
    Reply
  12. acrk

    (11) Вы правы.

    Когда поле составного типа, даже если оно Ссылка, пустой она не бывает, она бывает Неопределено. Поэтому надо использовать ЗначениеЗаполнено().

    Обработку исправил.

    Reply
  13. gaglo

    Вот бы еще поделились знанием: что это за «некоторые специфические случаи», когда у вас есть только некоторых специфических случаях при анализе проблем с базами данных, когда у вас есть только GUID, и ничего более не известно.

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

    «Не найдено качество по ссылке. c2bf13dc-58d3-4871-945c-8bb923a3226c»

    Но здесь тип объекта я знаю.

    Reply
  14. Трактор

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

    http://infostart.ru/profile/10200/blog/960/

    Reply
  15. Sword

    Просто но со вкусом, работать с ней приятно, в той которую для себя наваял есть ещё : ЗначениеИзСтрокиВнутр,ЗначениеВСтрокуВнутр. Тут бы то же пригодилось.

    Reply
  16. acrk

    (13) Случаи на самом деле очень специфические.

    У меня было как раз с обменом примерно то же самое. Когда в базе-приемнике объект с некоторым GUID уже был и совсем не того типа, который программа пыталась записать.

    Из вашего сообщения можно сделать вывод, что программа при переносе не нашла качество со сслыкой … . Если бы такого GUID в базе не было бы, то обработка переноса спокойно создала бы новой качество с таким GUID. А проблема-то в том, что GUID такой уже есть, но он принадлежит совсем не тому типу. Так что вы как раз не знаете тип того объекта, который имеет указанный GUID (Это только мое предположение, конечно). Можно попробовать его найти с помощью обработки.

    Reply
  17. gaglo

    (16) Как раз знаю тип объекта, и это действительно качество ;-] В моем случае просто неадекватно (совсем никак) обработалось удаление элемента справочника.

    а) В базе-источнике создали новое качество для хитрых целей.

    б) В базу-приемник оно перенеслось, с тем же GUID.

    в) В базе-источнике удалили это качество, и оно удалилось.

    г) В базе-приемнике — оно осталось.

    д) И через некоторое время им воспользовались в базе-приемнике.

    е) А вот в базу-источник этот документ загрузиться уже не смог.

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

    Reply
  18. Smoke221180

    Очень пригодилась, когда переходил с бухи 1.6 на 2.0

    Reply
  19. Dmitrii D

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

    спасибо)

    Reply

Leave a Comment

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