Свертка базы УНФ 1.6




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

29 Comments

  1. gnn_niko

    не открывается

    Reply
  2. artfa

    (1)работает в режиме толстого клиента обычное приложение

    Reply
  3. user610840_stuntbum

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

    Reply
  4. user610840_stuntbum

    (3)Извиняюсь, все запустилось после переноса базы из SQL в файловую. Однако в описании не сказано, что так нужно делать

    Reply
  5. Карамзин

    Подскажите, пожалуйста, данную свертку можно делать только на начало года или на любую дату?

    Reply
  6. artfa

    (5) хоть на дату рождения Христа,

    кончено же на любую удобную для вас дату, на начало года делают для того чтобы была статистика за полный год

    Reply
  7. Rustig

    (0)

    P.S. поделюсь маневром, который ускоряет процесс удаления документов после свертки:

    маневр сложный у вас — вот здесь реально быстрый способ удаления https://infostart.ru/public/1033813/

    велкам!

    Самое долгое в любой свертке это не сама свертка, а удаление помеченных на удаление в процессе свертки документов, удаление может длиться сутками, неделями.

    Согласен что удаление долгое, но это не самое долгое. Для меня «долгое» — это предварительный анализ базы, подготовительные работы, тестирование на копии проведения свертки. А вот удаление доков — уже третья стадия, которую можно и через некоторое время провести в фоновом режиме — документы распроведены, помечены на удаление, лежат в закрытом периоде.

    Если цель свертки уменьшить размер базы, то это одна задача.

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

    Reply
  8. Rustig

    (0) еще дополню, что при свертке НЕ НУЖНО сворачивать ВСЕ РЕГИСТРЫ

    Reply
  9. artfa

    (9) кому как

    Reply
  10. artfa

    (8)

    маневр сложный у вас — вот здесь реально быстрый способ удаления https://infostart.ru/public/1033813/

    велкам!

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

    (8)

    Для меня «долгое» — это предварительный анализ базы, подготовительные работы, тестирование на копии проведения свертки.

    блин, как же я мог забыть об этом, а еще забыл написать как родится, вырасти, стать специалистом в 1с, и остаться при этом Человеком.

    Публикация называется — Обработка свертки УНФ.

    Reply
  11. Rustig

    (11)

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

    я проверяю ссылки и не удаляю документы, которые есть в остатках, остальные документы удаляю.

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

    (11)

    как же я мог забыть об этом, а еще забыл написать как родится, вырасти, стать специалистом в 1с, и остаться при этом Человеком.

    Публикация называется — Обработка свертки УНФ.

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

    остальное из вашей жизни — не нужно упоминать. обижаться на меня тоже не нужно.

    Reply
  12. artfa

    (12)

    я проверяю ссылки и не удаляю документы, которые есть в остатках, остальные документы удаляю.

    руками проверяете, сотни, тысячи ссылок?

    (12)

    обижаться на меня тоже не нужно.

    даже и не думал

    Reply
  13. Rustig

    (13)

    руками проверяете, сотни, тысячи ссылок

    я понял вас — вы не знаете как это делать…

    руками конечно не смотрю — в запросе все документы из остатков тянутся — получаю список-1.

    удаляю все помеченные на удаление документы, кроме списка-1 из запроса.

    можете скачать обработку и изучить алгоритм.

    Reply
  14. artfa

    (14) скорость не замеряли?

    Reply
  15. Rustig

    (15) очень быстро для объема базы с документами за три года — может полчаса — может час.

    скажу так: я впервые столкнулся с задачей «удаления документов», когда надо было подготовить копию базы без документов и оборотов, но со справочниками номенклатуры и контрагентов… раз столкнулся, два — три…. идет потеря времени — когда ждешь удаления с проверкой ссылочной целостности, клиент переплачивает…. в итоге придумал такой обходной маневр — оставляю все , что нужно, остальное удаляю без проверки. применил этот подход к свертке — учел дополнительно документы в остатках.

    Reply
  16. artfa

    (16)спасибо за ликбез

    Reply
  17. pavl_vs

    (0), УНФ 1.6, релизы 1.6.16.153, 1.6.17.141 на платформе 8.3.13.1513;

    режим файловый, толстый клиент.

    Обработка не открывается (!?).

    Reply
  18. artfa

    (18)обычное приложение

    Reply
  19. pavl_vs

    (19), понял; «обычное приложение» — в этом и есть некая печаль.

    Reply
  20. artfa

    (20)в этом есть моя лень, рисовать управляемую форму, работает и ладно

    Reply
  21. artfa

    (17) не знаю как у вас, а у нас на Спасибо, принято отвечать Пожалуйста

    Reply
  22. artfa

    (9) спасибо кэп

    Reply
  23. Anthon

    Что делает кнопка Выполнить все и чем она отличается от кнопки Свернуть базу?

    Reply
  24. artfa

    (24)обработка создана на базе типовой обработки, погуглите

    Reply
  25. cool999

    Так по итогу запускается или нет? Не могу запустить. В толстом клиенте в файловой версии. (1.6.18.117) 8.3.13.1865

    Reply
  26. artfa

    (27) в толстом клиенте обычное приложение

    Reply
  27. pavl_vs

    (27), прежде, чем запустить толстый клиент, в конфигураторе (Свойства конфигурации) установите «Основной режим запуска» = «Обычное приложение».

    Reply
  28. GagarinIV

    (3)

    .Удаление документов можно обойти следующим образом, создаем пустую базу из той же конфигурации, обработкой Выгрузка и загрузка данных XML выгружаем из свернутой базы обычные документы с отбором по дате после даты свертки, затем выгружаем сами документы свертки, при этом, на остальных документах ставим флаг Выгружать по ссылке.

    Таким же маневром (флагом Выгружать по ссылке) можно избавится от лишних элементов справочников.

    Базу свернул, документы пометил на удаление.

    Помогите настроить Выгрузка и загрузка данных XML , не могу разобраться.

    Reply
  29. GagarinIV

    Базу свернул, документы пометил на удаление.

    Помогите настроить Выгрузка и загрузка данных XML , не могу разобраться.

    Reply

Leave a Comment

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