Замена 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. dsdred

    Если новый GUID совпадет с GUID имеющегося объекта, тогда что произойдет?

    Ваша обработка его превратит в копию выбранного объекта?

    Reply
  2. 1segen1

    1. Для сопоставления объектов с разными ГУИД, в КД существует спец. механизм — поля поиска.

    2. Используйте РС Соответствие объектов инф. баз.

    Reply
  3. manuel

    (1)А как могут GUID совпасть? Смысл GUID как раз а том что он всегда уникальный.

    Reply
  4. 17808849

    (1)

    ый GUI

    Предупредит о не уникальном GUID и остановит выполнение

    Reply
  5. dsdred

    (3)

    А как могут GUID совпасть? Смысл GUID как раз а том что он всегда уникальный.

    Вы смысл обработки прочитали?

    Есть элемент А с GUID=1

    Есть элемент Б с GUID=2

    у элемента А в другой базе GUID=2

    С помощью этой обработки создается копия с указанным вручную GUID. Значит можно указать что новый GUID = 2.

    Ниже Автор ответил, что все будет нормально в этом случае

    Предупредит о не уникальном GUID и остановит выполнение
    Reply
  6. sssomov@mail.ru

    Необходимо сменить ГУИД организации. При попытке сделать это через данную обработку, программа выдаёт ошибку:

    «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»

    Как быть?

    Reply
  7. 17808849

    (6)

    димо сменить ГУИД организации. При попытке сделать это через данную обработку, программа выдаёт ошибку:

    «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данны

    Выполнять когда в базе никого нет.

    Программа выдала ошибку о том, что в процессе замены ссылок, кто то изменил документ или справочник в котором эта ссылка участвует

    Reply
  8. sssomov@mail.ru

    (7)

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

    Забыл написать версию платформы и конфигурацию БД, исправляюсь:

    Бухгалтерия предприятия 3.0.64.42, Платформа 8.3.10.2639

    Reply
  9. lefthander

    (8)Попробуйте на 8.3.12

    Reply
  10. lefthander

    (6)Прочитайте что делает обработка!!! Она не меняет ГУИД, она создает копию объекта с новым гуид и заменяет старые ссылки на новыев объектах. Поменять ГУИД объекта в принципе не возможно из 1С.

    Reply
  11. sssomov@mail.ru

    (9) Хм… Ок. Необходимо создать копию объекта (организация) с новым ГУИДом и заменить старые ссылки на новые в объектах. При попытке сделать это с помощью данной обработки, программа выдает ошибку:

    «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»

    Попробовал на нескольких платформах 8.3.12. Ошибка повторяется из раза в раз.

    Reply
  12. 17808849

    (11)

    бходимо создать копию объекта (организация) с новым ГУИДом и заменить старые ссылки на новые в объектах. При попытке сделать это с помощью данной обработки, программа выдает ошибку:

    «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»

    Попробовал на нескольких платформах 8.3.12. Ошибка повтор

    Ошибки быть не должно, так как используется типовой механизм поиска ссылок на объект.

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

    Там будет наглядно видно какой именно объект не удалось записать.

    Еще есть предположение:

    Так как вы меняете ГУИД у организации, а там есть реквизит головная организация, который равен этой же ссылке, возникнет такая ошибка.

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

    Reply
  13. sssomov@mail.ru

    (12)

    (12)

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

    Там будет наглядно видно какой именно объект не удалось записать.

    Первым делом это и попробовал. Ссылок очень много, в основном на договора.

    (12)

    Еще есть предположение:

    Так как вы меняете ГУИД у организации, а там есть реквизит головная организация, который равен этой же ссылке, возникнет такая ошибка.

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

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

    Reply
  14. V.Nikonov

    (13) Поле есть, но оно не отображается, т.к. совпадает со ссылкой на сам Объект.

    Вероятно в обработке надо предусмотреть подобные «Исключения»: т.е. один из реквизитов ссылается на самого себя…

    Reply
  15. sssomov@mail.ru

    (14)

    (14)

    Поле есть, но оно не отображается, т.к. совпадает со ссылкой на сам Объект.

    И как его тогда очистить? Подскажите, коль не трудно.

    Reply
  16. 17808849

    (15) Обновил обработку. Скачайте заново

    Reply
  17. user786415

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

    Reply
  18. 17808849

    (17)

    рктный заголовок публикации, вернее бы назвать создание копии объекта с нужным гуидом. А то складывется мнение что можно перезаписать гуид у сущест

    Так проще найти. В описании есть информация о том, как происходит замена.

    Reply
  19. SolarGard

    Менял ГУИД-ы в справочнике Банковские счета организаций в ERP. У справочника нет реквизита КОД, зато есть уникальный НомерСчета. Обработка не умеет отрабатывать такое автоматически. Подправлял для конкретного случая.

    .

    Reply

Leave a Comment

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