Очистка БД от документов всех организаций (фирм) кроме указанной




Принцип обмена данными из 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='\

13 Comments

  1. kompas-dm

    Тема актуальна, плюс

    Reply
  2. logdog

    бух 2.0.12.2 не работает!

    Reply
  3. Farpost

    Ну дык пока в работе релиз если я не ошибаюсь 1.6 (1.6.24.7)…

    релиз 2.0.12.2 бета пока что — так что на ентом релизе не тестил

    Reply
  4. Farpost

    (4) Обработка помечает на удаление документы в которых поле Организация, не равно выбранному значению, используется Метод «УстановитьПометкуУдаления(Истина)», то есть этот метод делает документ непроведенным!!!

    После чего все документы удаляются стандартной обработкой «Удаление помеченных на удаление», вообще писано все на скорую руку — но будет пара часов свободных, постараюсь оптимизировать код и заточить под максимально возможный спектр конфигураций, а так — можете дорабатывать у кого руки откуда надо растут

    Reply
  5. logdog

    (3) нет, 2.0.12.2 не бета …

    Reply
  6. Alav

    Все придумано до нас

    http://www.infostart.ru/public/20396/

    Reply
  7. RustamZz

    Самый простой способ для БП это создать узел по плану обмена по нужной организации и создать первоначальный образ. И документы почистятся, и справочники, и регистры причем очень быстро. Проверено на базе в 40 ГБ., 70 организаций.

    Reply
  8. PVG_73

    А я свое время для этих целе приспособил тивую обработку с ИТС «Поиск и замена значений»… просто добавил кнопку пометить на удаление выбранного и усе… а потом удаление помеченных…

    (8) У меня для БП или для ЗиУП не удалось расчленить организации по созданию образов… слишком много мусора получилось во вновь созданных базах… в результате воспользовался свое доработанной обработкой и получилось просто быстрее… 🙂

    Reply
  9. kasperok

    Я скачал файл без разрешения, поставил .epf не открывает 1с 8.1, это и не архив. Так что это ?

    Reply
  10. nikser

    Программа лажовая. Многие документы остаються.

    Reply
  11. rikony

    добавил .epf и в 8.2 всё работает !

    Да не все удаляет … надо доделать чуть чуть !

    Автору спасибо !!!

    Reply
  12. IP43

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

    Reply
  13. fixin

    Бухгалтер поставила задачу: нужно было отдать базу БП сторонним разработчикам, оставив в ней только документы по одной организации по выбранным контрагентам (3 штуки).

    Пришлось повозиться, причем в основном с поиском готовых обработок.

    Для удаления информации по другим организациям использовал эту обработку: http://infostart.ru/public/333528/ (Обработка для пометки на удаление всей информации, связанной с помеченными на удаление организациями. Работает с «1С.Бухгалтерия предприятия» 1.6 и 2.0.). Хотя можно было попробовать и специфическую: http://infostart.ru/public/70660/ (Очистка БД от документов всех организаций (фирм) кроме указанной).

    Для удаления документам по контрагентам использовал лучший на мой взгляд общий журнал http://infostart.ru/public/69707/ (Универсальный журнал документов для 1С 8.1, 8.2 и 8.3 (3.20.1.8))

    Reply

Leave a Comment

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