Непосредственное удаление помеченных объектов с проверкой ссылочной целостности без установки монопольного режима




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

32 Comments

  1. 1cHyb

    А чем стаднартная обработка «Удаление помеченных объектов» не угодила?

    Reply
  2. Gaffer

    На диске ИТС есть такая же «Удаление помеченных объектов_8.1.epf»

    Reply
  3. Abadonna

    (1) А попробуй удалить когда в базе есть пользователи

    (2) А я его видал? 😉

    Reply
  4. Abadonna

    (1.2) При ходит наш восьмерочный программист (я семерочный) и говорит: «НИГДЕ не могу найти разработку для удаления помеченных в немонопольном режиме». У него и ИТС и все остальное, однако говорит — «НИГДЕ» .

    Reply
  5. poppy

    (4)

    Не верь плохим восьмерочникам. Он диск ИТС либо не открывал, либо плохо искал.

    Reply
  6. Abadonna

    Ваще-то он достаточно ленивый, чтобы день поискать, чем за час написать 😉

    Но я не в накладе — порулил на 8-ке немного :)))))

    Reply
  7. 1cHyb

    Было бы интересно, если можно было удалать объекты и их ссылки (и объекты с этой ссылкой) , например почистить справочник Организаций

    Reply
  8. Abadonna

    (7) там доделать под себя — как два байта отослать 😉 код открытый — дерзай. мне пока без надобности, мы еще на 7-ке сидим

    Reply
  9. Abadonna

    Добавлен файл УдалитьПомеченныеОбъектыAdv.erf.

    Отличия:

    1. Сразу блокируются все объекты из помеченных

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

    3. Добавлена возможность установки блокировки доступа к базе

    Reply
  10. Sirus Virus

    Мммм… Аркадий, а я помню кто-то очень ругался на 8ку 🙂

    А теперь смотрю и сам на ней пишешь.

    Reply
  11. Abadonna

    (10) Не пишу, а тренируюсь. А так: ваще любое 1С — говно, хоть 2, хоть 6, хоть, 7, хоть 8

    Reply
  12. RPV

    Подскажите, кто-нить особо одаренным откуда мона скачать файл (обработку). Шапку таблицы вижу, а нижней части таблицы нет, везде потыкался, не вижу нигде.

    Reply
  13. vasilykushnir

    Даю подсказку: Ставь плюсару и Абажонна восстановит файл для скачивания.

    Reply
  14. Abadonna

    (13) Не дури, Кушнир 😉 Листер действительное полезная вещь, а эта обработка — проходняк. Чуть лучше перенумератора

    Reply
  15. vasilykushnir

    (14) Но если кто-то качает, значит кому-то это нужно….

    Reply
  16. Abadonna

    (15) Листер из зарегенных на сайте смогут написать 5-10 человек, эту лабуду — любой неленивый

    Reply
  17. vasilykushnir

    (16) Дык неленивые и не качают…

    Reply
  18. RPV

    (13) Плюсару поставил, прошла уже неделя, однако Абадонна почему-то молчит и не реагирует, как-будто он здесь ни при чем!!!???

    Абадонна, может прояснишь, наконец, ситуацию?

    Reply
  19. Abadonna

    (18) Погодь, а я разве должен отвечать по идиотским кушнировским шуткам? (13)

    Давай мыло, в личку скину, а насчет восстанавливать — дык я еще на тропе войны, пока не собираюсь

    Reply
  20. poppy

    (19)

    Тропа закончилась?

    Reply
  21. levran

    так захватывает, прямо сантабарбара… уважаемые, а мжете подсказать где почитать про начало войны ? 🙂 жуть как интересно!!!

    Reply
  22. Abadonna

    (22)>Только непонятно, чем два файла отличаются друг от друга, напиши в описании.

    В продвинутом (adv) добавлено блокирование объектов, помеченных на удаление (сразу после построения списка), и блокировка входа в базу (по желанию). Плюс в adv производится попытка установить монопольный режим, в случае успеха просто производится штатное удаление

    Код
    УдалитьОбъекты(Помеченные, Истина, Найденные);

    Показать полностью

    Reply
  23. natik86

    А удалить организацию можно этой обработкой или нужно писать другую обработку? Ответьте пожалуйста. Заранее спасибо!

    Reply
  24. natik86

    Для удаление организации пользовалась другой обработкой. Все прошло успешно.

    Reply
  25. Sergey_Murzinov

    Можно взяьб за основу, но….

    Reply
  26. diman85

    Обработка конечно хорошая, однако следует четко осозновать что удалаешь, так как контроль ссылочной целостности теряется

    Reply
  27. Abadonna

    (29) Как раз НЕ теряется, так как не станет она удалять объект, на который есть ссылки. Иначе какой бы в ней прок был? Тупое удаление можно было проще написать

    Reply
  28. reik

    Не очень продуктивна обработка. Долго удаляет, можно использовать и стандартную, а эту если сидят пользователи

    Reply
  29. Abadonna

    (31) Кхм… А зачем тебе использовать ЭТУ, если пользователи НЕ сидят? Ясен Арафат, что если они НЕ сидят, надо стандартной.

    И кроме того:

    2. Производится попытка установить Монопольный режим, в случае успеха производится штатное удаление объектов
    Reply
  30. mariyanna

    Хорошая и удобная обработка, постоянно ей пользуемся, бухи ее очень любят) Только вот, если есть по удаляемому объекту записи в каких-нибудь регистрах сведений, то ничего не удаляется, приходится самой чистить регистры, потом снова удалять объекты..

    Reply
  31. xten

    а для 8.2 подойдет?

    Reply
  32. Abadonna

    (34) xten, вообще-то я и на 8.1 не шибко её пользовался 😉 Но, думаю, просто открыть в конфигураторе 8.2, согласиться с конвертацией — и все должно заработать.

    Reply

Leave a Comment

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