Количество месяцев и дней между датами (ЗУП)




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

    Плиз, по-возможности оставляйте критику ) (хамло может проходить мимо)

    Reply
  2. coder1cv8

    (1) Если не хамить, то моя критика укладывается в одну строку:

    Запрос=Новый Запрос(«ВЫБРАТЬ РАЗНОСТЬДАТ(&НачалоПериода,&КонецПериода,МЕСЯЦ) КАК Месяцев, РАЗНОСТЬДАТ(&НачалоПериода,&КонецПериода,ДЕНЬ) КАК Дней»);

    Reply
  3. relax2105

    coder1cv8 спасибо. Теперь буду знать)

    Reply
  4. KapasMordorov

    2(2)

    В теме+картинке условие задачи другое. Запрос выполняет половину заданного.

    Reply
  5. tango

    (0) сделай рабочих дней

    Reply
  6. tango

    (4) не выполняет и половины

    Reply
  7. rasswet

    в зупе насколько я помню стаж вводить надо через лет, месяцев, дней. ибо просто так 78 месяцев это не наглядно. и не удобно.

    покопал инфу по екселю, ввел формулу, сделал табличку, кадровики уже по ней 400 чел просчитали стаж.

    Reply
  8. relax2105

    (7) в ЗУПе нажно вводить стаж следующим образом: на дату приема ставится количество месяцев и дней стажа! В екселе расчитывать стаж неудобно, по крайней мере у нас, т.к. пользователи работают в Ске под терминалом и переключение из терминала на машину, чтобы расчитать стаж в екселе — не есть удобно. Потому и написал для кадров эту штуку. Да, rasswet, по-мимо же расчетов стажа, кадрам необходимо эти цифры еще и забить в Ску (вторая версия реализует это). Хотя, критика принимается)))

    Reply
  9. rasswet

    сделай переключатель «лет, месяцев, дней»-«месяцев, дней». мне не надо (я в екселе), но будет универсальнее. мож кому-то и пригодится.

    Reply
  10. relax2105

    сделдю

    Reply
  11. limbo

    БП 1.6.15.5 вылезла ошибка

    {Форма.Форма(109)}: Поле объекта не обнаружено (ВидыСтажа)

    ВидСтажа = Справочники.ВидыСтажа.СтраховойСтажДляБЛ;

    Reply
  12. relax2105

    (11) в бухгалтерии нет такого справочника «ВидыСтажа»

    Reply
  13. coder1cv8

    У меня еще один вопрос 🙂

    В ЗУП есть типовая функция, возвращающая количество лет, месяцев, дней между датами… Зачем изобретать велосипед?!

    Reply
  14. relax2105

    (13) просвети, плиз, я не в курсе этой функции)

    Reply
  15. coder1cv8

    (14)

    // Процедура вычисляет количество лет, месяцев и дней между двумя датами

    ОбщегоНазначения.РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0)

    Reply
  16. lonec

    relax2105, спасибо большое!!! Типовая процедура РазобратьРазностьДат не учитывает високосные года и из-за этого теряются 2 дня… Например, 06.04.1995 и 29.02.1996. Разность между этими датами должна быть равна 10 мес. 23 дня. А типовая процедура насчитывает 10 мес. 21 день. Так что, relax2105, спасибо!!!

    Reply
  17. relax2105

    lonec, пожалуйста! Рад что кому то пригодилась сия штука))))

    Reply
  18. olegbushev

    а как узнать количество дней в месяце?

    Reply
  19. olegbushev

    желательно запросом

    Reply
  20. cheiser1982

    При внедрении ЗУП 8.3 писал обработки для загрузки информации из другой программы. Т.к. ранее учет велся помесячно, написал простенькую функцию для подсчета количества месяцев между датами. Может кому нибудь пригодится…

    //Считаем количество месяцев между датами

    &НаКлиенте

    Функция КоличествоМесяцевМеждуДатами(НачальнаяДата, КонечнаяДата)

    МесяцНачальнойДаты = Месяц(НачальнаяДата);

    МесяцКонечнойДаты = Месяц(КонечнаяДата);

    КоличествоЛет = Год(ТекущаяДата()) — Год(НачальнаяДата);

    Возврат КоличествоЛет * 12 — МесяцНачальнойДаты + МесяцКонечнойДаты;

    КонецФункции

    Reply

Leave a Comment

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