[ОБУЧАЛОВКА] Финт ушами с временем документа.




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

33 Comments

  1. АЛьФ

    Прикольно.

    Reply
  2. vasilykushnir

    Плюсую. Буду пробовать поюзать. Идейка весьма интересная.

    Reply
  3. GROOVY

    Документы располагать относительно друг друга надо не изменением времени а правильным созданием и записью самих документов. только в этом случае мы избежим ограничения 86400 документов в сутки!

    Reply
  4. CheBurator

    Согласен.

    Данный код — и служит целям «правильного» программного создания/модификации документов. 😉

    А про то, что документы интерактивно нужно правильно создавать/модифицировать — это да, возражений нет.

    Если знаешь как программно создать и расположить реализацию после заявки не оперируя временем документа — поделись, будет интересно не только мне…

    Reply
  5. GROOVY

    Ок. Скоро будет!

    Reply
  6. vasilykushnir

    >GROOVY

    >Ок. Скоро будет!

    Будем ждать…

    В дополнение к замечанию Сhe: расхождение по времени с заявкой и расходной еще пол-беды. У нас цепочка из трех документов ЗаявкаПокупателя-Отборочная-Расходная. Если с заявкой и расходной все понятно, то чуть уточню, что за зверь Отборочная. Этот документ представляет собой обычное перемещение с отдела хранения в отдел экспедиции, где на их основании создается расходная. При этом не обязательно все товары из заявки попадают в отборочные и расходные, ну это к делу не относится. Так вот временная последовательность должна четко соблюдатся для пары Отборочная-Расходная — ну не может экспедиция выписать товар, который еще не поступил со складов. Но наши крендели умудряются иногда шурануть расходную более ранним временем (а иногда и датой!), чем отборочная. Так что если у GROOVY есть идеи как это блокировать на этапе создания расходной — воздадим хвалу этому достойному человеку!

    Reply
  7. CheBurator

    Не к теме публикации, а по обсуждению… у меня еще лучше… у меня из неподтвержденки дерево документов может быть листов на 8-10 (неподтвержденка-заявки-заказы-поступления-расходы)

    Reply
  8. O-Planet

    Надо воспользоваться этим, чтобы рейтинг выпрашивать 🙂

    Токо где финт-то? Обычное преобразование типов…

    Reply
  9. CheBurator

    Просвети, плиз, неграмотного — где здесь преобразование типов?

    Reply
  10. O-Planet

    Да все просто. Для тебя время — это минуты, секунды и часы, а во внутреннем представлении 1С — это число типа long. Поэтому, ты мог с таким же успехом не секунды прибавлять, а, скажем, минуты. Она все равно бы преобразовала бы все к формату времени.

    Кстати, если хошь знать, какими бывают финты, то читай мою статью последнюю 🙂

    Reply
  11. CheBurator

    будь спок. минуты тоже прибавляем… 😉

    статью — ща посмотрим…

    Reply
  12. Mey

    Интересно 🙂

    Плюсую!

    Reply
  13. Спасибо, открыл для себя: движок 1С сам произведет »адекватный» пересчет секунд, минут, часов. А то я совсем недавно решал такую проблему, так накрутил там пересчеты все самостоятельно :-). Оказывается можно было не заморачиваться.

    Reply
  14. d.snissarenko

    Надо попробовать 🙂 +1

    Reply
  15. CheBurator

    А чего пробовать? Юзать надо 😉

    Reply
  16. баян

    Reply
  17. CheBurator

    Может кто еще знает некоторые неочевидные хитрости?

    Reply
  18. item

    Была такая фишка до 14-го релиза:

    для дополнительных числовых реквизитов проводки

    (напр. «количество2″ с конф.»Сельхоз.предприятие» от Рарус)

    v77 поддерживала функции ДО() и КО() в запросе.

    Жаль, что эту вещь выкосили в поздних релизах.

    Reply
  19. Плюшкин_

    у меня(как у пита) такое давно реализовано:)Правда не мучался,сразу получилось.Это когда из ТиС в Бухию переброску и если изменения,то меняем и в бухии.Соотв. и время нужно точно расставить.

    Reply
  20. CheBurator

    Boj мелкая хитрость: бывает надо на экран вывести ТЗ (типа в отладочных целях), причем с нумерацией строк. Чтобы не заморачиваться, пишем: [code]

    ТЗ.ВидимостьКолонки(«НомерСтроки»,1);

    ТЗ.ВыбратьСтроку(,» типа отладка»);

    Reply
  21. CheBurator

    Не понял.. читать — читаем, ума-разума набираемся.. а кто рейтинг статьи плюсовать будет, а???

    Reply
  22. das

    Бесценный опыт — в нашу копилку ;-)))

    Reply
  23. Voldemar

    Не так давно была задача «раскидать» по дню загруженные документы, так тщательно прописывал ЧЧ,ММ,СС. А оказывается, можно было всё гораздо проще сделать. Спасибо за ценный опыт.

    Reply
  24. CheBurator

    Пожалуйста! Приходите и читатйе другие мои «жизненные» статьи!

    Reply
  25. Вадимко

    Позволю себе дополнить…

    Управлять временем можно гораздо точнее нежели в переделах секунды… мы-то с вами знаем 🙂

    86400 — это для пионэров

    Есть у меня два документа с одинаковым временем 12.00.01

    Если я поменяю время документа с ‘757H1S’ на ‘757H1T’, то документы что сделают?

    Правильно, поменяются местами в журнале

    А время какое мы продолжаем видеть в 1С? Правильно, 12.00.01 🙂

    ЗЫ. Чучундеру ПЛЮС за упорство в написании полезных программ и статей

    Reply
  26. CheBurator

    (25) И вот сколько документов «влазит» в одну секунду — это и определяется «емкостью» приведенного ниже идентификатора…

    Reply
  27. valent

    Бывает нелишним перед всем этим вставить «АвтоВремяОтключить()»

    +

    Reply
  28. hate

    конечно не решило всех проблем, но все равно спасибо, подталкнуло в нужном направлении, поэтому однозначно +!

    Reply
  29. nickkey

    согласен все гениальное просто спасибо за идею 🙂

    Reply
  30. juraua

    Спасибо за решение, очень помогло!

    Reply
  31. CheBurator

    (30) Мамонты еще живы…

    😉

    Reply
  32. ZloyProger

    (31) Ещё живее) Подскажите пожалуйста, не вижу ни ПолучитьВремя(), ни УстановитьВремя() (точнее функция есть — параметры другие).. Видимо с очередными версиями платформы (или это вообще для 7.7? к сожалению нет под рукой, а так давно не пользовался не помню уже) вырезали, теперь только свою проверку городить при добавлении? Или всё же есть какая-нибудь уловка?)

    Reply
  33. CheBurator

    (32) пример рассмотрен для 7.7.

    используются только штатные возможности.

    .

    вполне возможно, что такой подход (с поправкой на особенности 8-ки для задания датавремя документа) будет работать и на 1С 8.

    Reply

Leave a Comment

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