Универсальная обработка для перенумерации справочников и документов




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

21 Comments

  1. tanilka

    Класс!!! Спасибо за обработку. Просто, быстро, удобно!

    Reply
  2. kis

    7 зик справочник Сотрудники были номера (00001 и 0003 и т.д. разной длины). Все это перенеслось в 8 ЗУП. Сначала сделала перенумерацию справочника Физлица с префиксом 00д (иначе говорила, что код не уникальный). Потом с префиксом 000, теперь все красиво. Спасибо!

    Reply
  3. AlenaR

    Спасибо, пригодилась

    Reply
  4. heavymetal

    Хорошая обработка!!! Но было бы не плохо добавить возможность перенумерации без контроля уникальности, добавив флажок на форме, а в модуле прописать:

      Об = СписокДокументовИсправления.Ссылка.ПолучитьОбъект();
    Если НеКонтролироватьУникальность Тогда
    Об.ОбменДанными.Загрузка = Истина;
    КонецЕсли;
    Если ДокумениЛИ = Истина Тогда
    

    И еще один косячок, если номер 1000 или больше, делает как «0001 000» с пробелом. Исправляется вместо «Строка(Ном)» — «Формат(ном, «ЧГ=0″)»

    Reply
  5. No_Namer

    (4) heavymetal, хорошо поправлю.

    Reply
  6. tanilka

    (4) heavymetal, а я для того чтобы контроль уникальности проходил нормально — перенумеровывала сначала с каким-нибудь префиксом, любым, а затем делала без префикса… тогда все красиво получается. В принципе обработка живенько работает, поэтому 2 раза перенумеровать не сложно… 🙂

    Reply
  7. No_Namer

    (6) tanilka, Я оброботку подправил теперь можно перенумерацию делать и без контроля уникальности.

    Reply
  8. tanilka

    (7) ну спасибо!!! Она и так отлично справлялась с перенумерацией, а теперь так вообще будет еще проще! Спасибо, скачаю, попробую!!!

    Reply
  9. AlexO

    (0) автор, а зачем

    Если выбраны документы, то надо ставить галку проводить

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

    Reply
  10. Raminus

    хорошая обработка.

    Reply
  11. Венера я

    здорово, спасибо большое за обработку,очень помогло

    Reply
  12. No_Namer

    (12) electronik, Когда ставишь галочку перепроводить появляется поле префикс и туда можно занести что угодно, но вобще если не нужно изменять нумератор то выполняем обработку без галок и тогда обработку возмет данные о количестве символов в номере и добъет недостающие символы нулями. все просто.

    Reply
  13. Nata

    Спасибо! Должна пригодится.

    Reply
  14. Kaniman

    (13) спасибо за разработку и подробные пояснения. Как раз надо исправить нумерацию заявок.

    Reply
  15. bnw

    Добрый день!

    Я бы предложила еще указывать длину номера (6 знаков или 10 знаков).

    Это удобно если у Пользователя увеличен шрифт и длинные номера не помещаются в список.

    Reply
  16. No_Namer

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

    Reply
  17. Anna_G

    Спасибо. Хорошая обработка.

    Reply
  18. skvorc-elena

    Спасибо! Очень выручила обработочка!

    Reply
  19. IlyaSR

    Спасибо! Сберег время!

    Reply
  20. tanilka

    Пользуюсь давным-давно обработкой, и вот только сейчас обнаружила такой глюк: когда документов не больше 999, то все хорошо перенумеровывает, как только документов становится больше 1000, то номера идут с пробелом перед последними тремя знаками. Например:

    0000000001

    0000000002



    0000000998

    0000000999

    000001 000

    000001 001

    Может у меня устаревший вариант обработки…

    Reply
  21. forrin

    помогла переименовать 33000 позиций номенклатуры

    спасибо

    Reply

Leave a Comment

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