СКД. Сортировка




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

20 Comments

  1. BigClock

    Зачем используются англоязычные ключевые слова вперемешку с переменными на русском?

    Reply
  2. DoctorRoza

    (1) Тут другое, если ты пишешь на православном ООП, то почему условный оператор написан не по канону!?

    if (_ПолеПорядка=fld) then ….

    🙂

    Reply
  3. Bassgood

    (2) А как же стандарты?

    Реально глаза режет когда смотришь на текст, в котором перемешены два языка

    Reply
  4. slimper

    (4) Это, наверно мое кривое восприятие. Мне трудно читать код, когда ключевые слова написаны кириллицей.

    Reply
  5. awk

    (2) Если кто-то, будет в тестовом задании, такое делать, при трудоустройстве, то 100% пойдет мимо моей организации. Ну мне так удобней. Так же пойдет лесом человек неоправданно использующий «_» и однобуквенные переменные. Это если кто дошел из новичков до комментариев и решил, что код крутой.

    Reply
  6. slimper

    (6) К счастью или сожалению я не буду соискателем места в вашей компании. Представленный код не претендует на образец для подражания. Вам удобней отправлять лесом людей, не подходящих под ваши представления, a мне удобней

    такое делать
    Reply
  7. Трактор

    Ключевая строка оказалась в конце

    Формируем отчет с новыми настройками сортировки.

    А нужно ли его формировать? Любопытно, что быстрее будет работать. Формирование нового отчёта или перестановка строк в уже сформированном.

    Reply
  8. slimper

    (8) Если я правильно понял, вы предлагаете просто переставить строки в табличном документе «Результат». Этот вариант я не рассматривал.

    Reply
  9. MSK_Step

    (6)в языках программирования мы также использовали «_» , только на 1с это как то считается плохим

    Reply
  10. awk

    (7) У меня в компании люди код пишут для коллег и себя, а не для ЧСВ,

    Reply
  11. awk

    (10) Префикс «_» в Си зарезервирован для служебных переменных.

    Reply
  12. slimper

    (11)

    а не для ЧСВ

    Ошибочная оценка, не соответствующая реальности.

    Reply
  13. zqzq

    Просто тогда нужно и всё остальное на английский переводить. И соблюдать стандарты по большим буквам и вообще названиям (без _).

    &НаСервере
    procedure НовоеПолеПорядка(fld,_Коллекция)
    //…
    НовыйПорядок=_Коллекция.Вставить(0,Тип(«ЭлементПорядкаКомпоновкиДанных»));

    превращается в

    &AtServer
    Procedure NewFieldOfOrder(fld, Collection)
    //…
    NewOrder = Collection.Insert(0, Type(«DataCompositionOrderItem»));

    … и получится неплохой индусский код…

    Reply
  14. slimper

    (14) Попробую объяснить свой подход. Наверно в большинстве языков условный оператор это if, т.е. такое обозначение является мировым стандартом (может у китайцев по другому). В языке 1С объектная модель реализована на русском языке, поэтому названия объектов логично писать на этом языке, но для ключевых слов существует общий стандарт, который, для меня имеет приоритет над стандартом 1С. Если вы работаете в разных языковых средах, мне кажется проще, использовать ключевые слова из общего стандарта. Заглавные буквы — это должна делать сама среда разработки, как например в VS. Подчерки — здесь чтобы отличать переменные от системных объектов, при совпадении наименований.

    Reply
  15. buganov

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

    procedure ПроверкаПоляАвтоПорядка(_Коллекция)
    //Если элемент автопорядка — удаляем
    if _Коллекция.Количество()>0 then
    for each _эл in _Коллекция do

    достойно премии всем известного сайта

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

    Reply
  16. dabu-dabu

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

    Reply
  17. Поручик

    (7) Удобно чесать ЧСВ и показывать «крутость». Сишные понты. Я бы тоже лесом отправил.

    Reply
  18. slimper

    (16)

    С такой точки зрения это оправдывает использование английского в 1С,

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

    я думаю, многим проще и быстрее в настройках СКД задать свою сортировку.

    Все еще проще. В СКД отчетах есть контекстное меню, где среди прочих присутствует команда «Упорядочить».

    Reply
  19. starik-2005

    Нормальный код. Еще бы переменные на латинском языке были обозваны — вообще бы зачот! )))

    ЗЫ: я бы лучше такого программера на работу взял, чем того, кто с кучей сертификатов, а программировать не умеет. У нас есть один умелец — он запросы пишет как матерый SQL-щик с SEL ECT FR OM LEFT JOIN WHERE GROUP BY … — чё он там творит никто не знает, но все работает )))

    Reply
  20. iov

    А говорят у прогеров нет времени. Вон сколько потратили на срач в каментах )))

    Reply

Leave a Comment

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