<?php // Полная загрузка сервисных книжек, создан 2025-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='\
(0) Ваша корректно сопоставит справочники между базами УТ 10.3 и БП 2.0 ?
Изменил название и описание! Теперь должно быть понятно, что она делает!
«ранее никогда не обменивающихся!!»
А что будет, если они ранее когда-то обменивались?
Вообще, как определяется, что они «обменивались»?
(3) OBEH,
если обмен уже происходил (стандартным механизмом), то поиск объектов производится по GUID!
т.е.
смысла в этой обработке в этом случае нет(ну почти нет)!
Просто мне пришлось настраивать обмен с базами «»ранее никогда не обменивающихся!!»», а справочники как-бы одинаковые должны быть(потому-что одна контора), а при обмене, если не править правила обмена справочники задвоятся!
РЕШЕНИЕ:
Сопоставил вручную коды справочников с помощью этой обработки
+
подкорректировал правила обмена!
вот
А если по GUID?
Собственно о чём:
Имеется две одинаковых базы, допустим речь идет про справочник номенклатура.
Только часть синхронизирована по вн.индентификатору, остальная расходится. Вот собственно вопрос?
Хотелось бы сначала посмотреть что сопоставлено по вн.индентификатору?
(6) jonybanchicov,
не нашёл возможности получить GUID из другой базы по средству COM-соединения!
рассматривал вариант через XML, но запускать обработку пришлось бы из обеех баз!
+
критической надобности в этом не было!
Если есть соображения по этому поводу могу дописать …
(7) amurimpulse,
попробую чего-нибудь придумать …
Если получится сделайте . Очень нужно. Самому некогда.
(9) jonybanchicov,
добавил функционал сравнения по GUID …
Есть Вопросики:
1) А подключение только к Файловым БД? Если понадобится Клиент-Сервер, то допиливать самому?
2) Если Базы обменивались двунаправлено и штатно, то должны быть заполнены регистры «СоответствиеОбъектов…» Эти регистры можно задействовать для Сопоставления?
(11) V.Nikonov,
1) Да. Да (у меня нет возможности отладить на системе «клиент-сервер»).
2) Нет.
Вот обработка, которая позволяет сравнивать справочники в разных конфигурациях, и даже в случае отличающихся наименований реквизитовhttp://infostart.ru/public/257211/
(13) kiberiq,
у меня много идей дописать всякое(в том числе и «даже в случае отличающихся наименований реквизитов»)!
просто нет времени :((
а на тот момент мне имеющегося функционала хватало …
PS
не активна публикация! хочу посмотреть!
Такая возможность уже есть. Публикация снова активна ) Адрес тот жеhttp://infostart.ru/public/257211/
(15) kiberiq,
Не пробовал, но выглядит прилично! Зачет!
Но я так понял исходя из свежести твоей обработки, что идею ты заплогиатил!!
+
Настроек у тебя куча! Не опытный пользователь запутается!
…
Да и вообщем решать не мне, что лучше!
Дерзайте!
Думаю вряд ли кто-то обладает авторским правом на сравнение двух вещей.
А создание обусловлено необходимостью.
Да и все сравнение можно провести в несколько кликов.
(17) kiberiq,
я на авторское право не претендую!
(16) amurimpulse, тем не менее спасибо за оценку. )
убедительная просьба плагиаторам:
— не выкладывайте здесь ссылки на свои публикации
исправил ошибку при обработке ненайденых справочников
Прочитал, что обработка может делать записи в регистр сведений «СоответствиеОбъектовДляОбмена» А Ваша обработка может проверить правильность соответствия элементов справочников используя этот регистр?
(22) apostal86, в описании про это написано!
пока нет! скоро отпуск, так что скоро сделаю ))
(24) apostal86, да у меня привычка ставить «!» вместо точки
отучиваюсь потихоньку
про описание вы правы
надо сделать
(23) amurimpulse, а что за «!» — они что выражают? Возмущение или удивление? Здесь на инфостарте полно разработок и описания к ним порой просто оставляют желать лучшего. Потому и задаю такой вопрос. То что ничего не написано — ничего не говорит, я же не могу знать, насколько полно Вы изложили описание к разработке.
Преимущества моей разработки:
подробнее смотрите тут
(27) pvb2003, на УФ не взлетит. Сначала разберусь с известными проблемами, а потом на УФ сбацаю.
На Управляемых Формах вариант будет ? Или поставлю вопрос по другому как запустить под УТ 11.1.7….
Солидный инструмент +1
— Разобрался не сразу, необходимо выставить все галки чтобы всё в отчет вывелось.
Конструктор автоматически формирующий запрос очень вкусно сделан.