Универсальная свертка БД




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

23 Comments

  1. Rabajaba

    Абалдеть, 40 скачиваний и ни комента, ни плюса … 🙂

    Reply
  2. gaglo

    Оптимист… Многие (и я в том числе) не хотят ставить плюс без проверки работоспособности. Особенно когда обработка заявлена «универсальная». Ну на тебе плюс авансом. Проверить сильно охота, но и боязно: недавно у нас как раз сворачивали сильномодифицированную УПП, наскоками, частичными откатами, подчисткой хвостов занимались… с месяц. Так я думаю, у меня проверка займет с неделю…

    Reply
  3. Rabajaba

    (2) кончено, я после написания это обработки свою УТ неделю учился сворачивать так, чтобы данные корректность не потеряли. Но сама же обработка строго выполняет то, что её указали.

    Reply
  4. Delpass

    БУду испытывать сейчас 😀

    Reply
  5. GrRusel

    Если у документа нет поля с датой, то вылетает с ошибкой 🙁 вот в этом месте

    Если Док.ДатаПоля = NULL Тогда

    Продолжить;

    КонецЕсли;

    Надо ставить доп проверку…на существование поля

    Reply
  6. Rabajaba

    (5) Возможно я не понял вопрос, но как это документ без поля «Дата»?

    Reply
  7. GrRusel

    Возможно я не так выразился — сори 🙂

    Вы делаете проверку

    Если Док.ДатаПоля = NULL Тогда

    Продолжить;

    КонецЕсли;

    что и как и зачем и откуда я не знаю — не вникал.

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

    ДатаПоля

    ДокументПартии

    регдата

    регистратор

    В какой-то момент у этой таблицы есть только поле Заказклиета и всё

    Почему — не знаю — не вникал. Конфигурация не типовая, а Типография(УПП+Типография),купленная у армекса на ранних стадиях и именно на их документах обработка валится 🙁

    Reply
  8. GrRusel
    создать документ «УниверсальныйДокумент» и зарегестрировать его на все регистры накоплений

    а так же создать в нём реквизит: Комментарий — иначе вылетает.

    Reply
  9. Serj1C

    (0) Спасибо. Обработка выручила! После обработки напильником все прошло очень хорошо!

    — случай указанный в (7);

    — замена универсального документа типовой КорректировкойРегистров

    — установка доп. свойства для объектов, которое потом анализируется в модулях перед записью для оптимизации

    — сокращение визуальных эффектов типа «состояние».

    Кстати оставшееся время обработки действительно довольно точно оценивается!

    Reply
  10. alexkl

    собираю все для проверки, т.к. итс-овская вылетает.

    Reply
  11. trustgros

    чет у меня не пошла. ошибку выкинуло

    Reply
  12. Genneral

    Спасибо, сильно облегчила жизнь при свертке не типовой УТ,спасибо Serj1C за идею

    Serj1C пишет:

    — замена универсального документа типовой КорректировкойРегистров
    Reply
  13. Гость

    Очень жаль, что без свертки по регистру бухгалтерии, очень полезная свертка была бы. А так, очень даже ничего. Рекомендую!

    Reply
  14. _ink_

    Добрый день. Подскажите, правильно ли понимаю. В ней можно свернуть базу допустим на 31,12,11 и документы введённые после этого останутся (если да, то как будет выглядеть привязка к документу-основанию в срезанном периоде). Или всё таки необходимо сворачивать на сейчас и с этого момента начинать работу? Заранее спасибо.

    Reply
  15. Rabajaba

    Если я правильно помню, то она оставляет те документы, которые нельзя удалить. Т.е. по идее возвраты по продажам прошлого года вводить можно будет, основание будет, однако я не помню снимет ли она их с проведения или нет — проверяйте 🙂 это было почти 2 года назад, плохо помню.

    Reply
  16. pav_s45

    Свертка отличная, в моей УТ просто выбрал дату и нажал «Выполнить все». Пользуюсь второй год.

    Reply
  17. zhleonid8

    дорабатывай регистры

    Reply
  18. Akuji

    УТ 10.3 «практически типовая» добавлено парочка регистров накоплений…

    настройки по умолчанию позволяют удалить 3000 из 103000 документов…

    Это нормально?

    Reply
  19. Геннадьевич

    Не могу скачать, выдает ошибку:

    Скачать «Свертка базы.epf» для 1С

    Fatal error: Call-time pass-by-reference has been removed in /srv/www/core/bitrix/templates/.default/components/bitrix/asd.elements.list/is_buy_download_file/result_modifier.php on line 7

    Reply
  20. silver-747

    в УТ 10.3 под 1С 8.1 ничего почти не сделала из 3900 документов удалила только 277 и ничего не свернула. Что не так могу делать?

    Reply
  21. Rabajaba

    (21) dyak84, писал конкретно под самописную. база была существенно меньше, уже 2 года 1С не занимаюсь. удачи 🙂

    Reply
  22. corelius

    Непонятная обработина. Нужно сразу писать в описании, что она ничем не отличается от банальной пометки документов на удаление по периоду. Можно использовать стандартную обработку «групповая обработка справочников и документов» и помечать на удаление по дате. И ошибок много с регистрами.

    Reply
  23. ssn5810

    попробовал, — хрень, использовал стандартную, все получилось….

    Reply

Leave a Comment

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