Перевод сотрудника с совмещения в штат и наоборот.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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. gucci76

    Не рекомендуется изменять состояние физлица без документов. Может быть чревато проблемами.

    Reply
  2. ded00786

    (1) Если не давать в руки пользователям, то проблем не будет 😉

    Reply
  3. Nicholas

    Был у меня один случай, когда никак не удавалось сделать правильно документами. Поэтому написал подобную обработку и держу ее сейчас про запас. Но в целом (1) прав.

    Reply
  4. gucci76

    (2) Даже если сам изменишь состояние физлица без документа, а не пользователь, то ЗиК может неадекватно прореагировать.

    Какая разница кто изменит состояние?

    Главное — ЗиК не любит состояние без документа!!!!!

    В исключительных случаях можно подправить код модуля документа, а потом вернуть как было!!!!!

    Reply
  5. ded00786

    (4) Во-первых зачем изобретать велосипед и что-то менять в модуле документа

    Во-вторых, в данном случае, ЗиК’у совершенно все-равно, как у него появится строка в истории (т.е. будет у нее регистратор или нет). Главное установить сам факт того, что человек в штате.

    Reply
  6. DarkAn

    Понять не могу, а в чем проблема уволить и принять со след. числа?

    Reply
  7. llg_44

    Согласна с (4). ИМХО. Периодический реквизит состояние менять таким образом категорически нельзя. Самой пришлось устранять ошибку базы после такого вмешательства в ход событий. Пользователь впихнул данной обработкой состояние сотрудника, который никак не хотел выйти на работу после отпуска по уходу до трех лет. Документ был изначально создан неправильно. Результат был непредсказуемый. Причем откликнулось спустя несколько расчетных периодов. Необходимо учить пользователей правильному ведению учета. Вот и делайте так, чтобы состояние менялось только у физлица. 🙁

    Reply
  8. gucci76

    (5) Делай как нравится.

    Плохо, что другие почитают и будут так делать!

    Reply
  9. ded00786

    (7)

    Документ был изначально создан неправильно. Результат был непредсказуемый. Причем откликнулось спустя несколько расчетных периодов. Необходимо учить пользователей правильному ведению учета

    Дело в том, что этот косяк возникает при заполнении документа любым способом (правильным или нет — неважно). 1С’ка не понимает что от нее хотят, вызывая сотрудника из отпуска на работу раньше срока. Эта одна из тех ошибок, на которую в 1С упорно закрывают глаза.

    Reply
  10. ded00786

    (8)>Плохо, что другие почитают и будут так делать!

    Решение о применении данной обработки (или не применении) принимает человек, а не обезьяна… Надо думать головой, прежде чем вносить насильственные изменения в конфу.

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

    Reply
  11. gucci76

    Так если ты убеждаешь, что после применения данной обработки все будет замечательно, пользователи тебе поверят и будут ее использовать. Они же не сталкивались пока с трудностями при бездокументном изменении состояния физлица, поэтому поверят тебе раз ты так уверенно это утверждаешь.

    Но ты заблуждаешься.

    Я даже предложил другой способ выхода из ситуации, но он тебе не понравился.

    Reply
  12. gucci76

    Я не против использования этой обработки (по секрету — у меня тоже подобная есть), но не утверждай, что «проблем не будет smile;)»

    Reply
  13. llg_44

    (9) Я согласна, пример не очень удачный. Но эта обработка попала в руки системного администратора, который так решил пробему «по-быстрому». Может все-таки описать проблемы, которые могут возникнуть при использовании такого «быстрого» вмешательства в алгоритм ЗиКа. Это можно же как-то описать и предусмотреть? Это можно сравнить с обработкой мягкой смены приода. В руках неопытного пользователя — бомбы замедленного действия))). Извините за критику.

    Reply
  14. gucci76

    (13) даже в руках опытного пользователя, если состояние физлица будет изменено без документа, в последствии может выскочить ошибка (даже через несколько периодов).

    Конкретную проблему надо решать иначе.

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

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

    Reply
  15. ded00786

    (12)

    Если не давать в руки пользователям, то проблем не будет 😉
    Так если ты убеждаешь, что после применения данной обработки все будет замечательно, пользователи тебе поверят и будут ее использовать. Они же не сталкивались пока с трудностями при бездокументном изменении состояния физлица, поэтому поверят тебе раз ты так уверенно это утверждаешь.

    Но ты заблуждаешься.

    Э, друг… Сравни цитаты и покажи, где я рекомендовал использовать эту обработку «пользователям»? — Это РАЗ;

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

    Ошибка может выскочить даже вообще ничего не делая — Это ДВА;

    И, наконец, повторюсь, что в данном случае 1С’ине совершенно все-равно, документом эта запись была сделана или нет. Т.К. документ проведен и перепроведен быть не может (если говорить за будещие периоды) — Это ТРИ 🙂

    ПЫ.СЫ. Обработка абсолютно рабочая и на 100% выполняет свои функции, вопрос в том в чьих руках она находится. (К примеру карандашом можно писать, а можно и заколоть 😎 …уф, аж самому страшно)

    Reply
  16. ded00786

    (13)

    >Я согласна, пример не очень удачный. Но эта обработка попала в руки системного администратора, который так решил пробему «по-быстрому».

    Сразу уточним, что не эта, а схожая по функциям, а во-вторых вы сами написали: «в руки системного администратора, который так решил пробему «по-быстрому»» — хвала и почести вашему администратору, хотя никто не безупречен и все совершают ошибки 😉

    Reply
  17. llg_44

    (14) Конечно интересуюсь, если не сложно, дайте ссылку. Спасибо заранее)))

    (16) Цитирую:

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

    Если бы это был наш администратор, я бы близко не подпустила его к задаче))), я считаю, что каждый должен заниматься своим делом. А вообще, можно ему сказать спасибо за такие действия, исправили это за его же счет.

    Reply
  18. gucci76

    Предлагаю ничью!

    Все равно каждый останется при своем мнении, а время рассудит.

    У меня претензий к самой обработке нет.

    Reply
  19. ded00786

    >Все равно каждый останется при своем мнении, а время рассудит.

    Это точно, особенно в том плане, что спорить-то особо не о чем. Объективный ответ на этот вопрос никто не сможет дать, т.к. ЗиК — это как швейцарский сыр… дырок несчесть 🙁

    Reply
  20. dekart58

    В качестве примера — посмотрите, как при изменении состояния физлица НЕ документами, а подобными обработками (кстати, это можно сделать обычным ю-чоисом), начинает плющить лицевую карточку (форму Т-2).

    🙂

    Reply

Leave a Comment

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