<?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='\
Если новый GUID совпадет с GUID имеющегося объекта, тогда что произойдет?
Ваша обработка его превратит в копию выбранного объекта?
1. Для сопоставления объектов с разными ГУИД, в КД существует спец. механизм — поля поиска.
2. Используйте РС Соответствие объектов инф. баз.
(1)А как могут GUID совпасть? Смысл GUID как раз а том что он всегда уникальный.
(1)
Предупредит о не уникальном GUID и остановит выполнение
(3)
Вы смысл обработки прочитали?
Есть элемент А с GUID=1
Есть элемент Б с GUID=2
у элемента А в другой базе GUID=2
С помощью этой обработки создается копия с указанным вручную GUID. Значит можно указать что новый GUID = 2.
Ниже Автор ответил, что все будет нормально в этом случае
Необходимо сменить ГУИД организации. При попытке сделать это через данную обработку, программа выдаёт ошибку:
«Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»
Как быть?
(6)
«Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данны
Выполнять когда в базе никого нет.
Программа выдала ошибку о том, что в процессе замены ссылок, кто то изменил документ или справочник в котором эта ссылка участвует
(7)
Замену пытаюсь выполнить на копии базы. Куда чисто теоретически никто, кроме меня, зайти не может. Проблема точно не в этом.
Забыл написать версию платформы и конфигурацию БД, исправляюсь:
Бухгалтерия предприятия 3.0.64.42, Платформа 8.3.10.2639
(8)Попробуйте на 8.3.12
(6)Прочитайте что делает обработка!!! Она не меняет ГУИД, она создает копию объекта с новым гуид и заменяет старые ссылки на новыев объектах. Поменять ГУИД объекта в принципе не возможно из 1С.
(9) Хм… Ок. Необходимо создать копию объекта (организация) с новым ГУИДом и заменить старые ссылки на новые в объектах. При попытке сделать это с помощью данной обработки, программа выдает ошибку:
«Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»
Попробовал на нескольких платформах 8.3.12. Ошибка повторяется из раза в раз.
(11)
«Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»
Попробовал на нескольких платформах 8.3.12. Ошибка повтор
Ошибки быть не должно, так как используется типовой механизм поиска ссылок на объект.
Попробуйте воспользоваться обработкой поиск и замена значений.
Там будет наглядно видно какой именно объект не удалось записать.
Еще есть предположение:
Так как вы меняете ГУИД у организации, а там есть реквизит головная организация, который равен этой же ссылке, возникнет такая ошибка.
Попробуйте на время выполнения данной обработки очистить данное поле. Возможно ошибка уйдет.
(12)
(12)
Там будет наглядно видно какой именно объект не удалось записать.
Первым делом это и попробовал. Ссылок очень много, в основном на договора.
(12)
Так как вы меняете ГУИД у организации, а там есть реквизит головная организация, который равен этой же ссылке, возникнет такая ошибка.
Попробуйте на время выполнения данной обработки очистить данное поле. Возможно ошибка уйдет.
В базе заведена только одна организация и, видимо, поэтому такого поля у меня просто нет.
(13) Поле есть, но оно не отображается, т.к. совпадает со ссылкой на сам Объект.
Вероятно в обработке надо предусмотреть подобные «Исключения»: т.е. один из реквизитов ссылается на самого себя…
(14)
(14)
И как его тогда очистить? Подскажите, коль не трудно.
(15) Обновил обработку. Скачайте заново
Некоррктный заголовок публикации, вернее бы назвать создание копии объекта с нужным гуидом. А то складывется мнение что можно перезаписать гуид у существующего объекта.
(17)
Так проще найти. В описании есть информация о том, как происходит замена.
Менял ГУИД-ы в справочнике Банковские счета организаций в ERP. У справочника нет реквизита КОД, зато есть уникальный НомерСчета. Обработка не умеет отрабатывать такое автоматически. Подправлял для конкретного случая.
.