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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *