Смена реквизита "СостояниеФизлица"




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

15 Comments

  1. Ёпрст

    Это из серии мой первый код ?

    Ужас просто. -10 за НайтиПоНаименованию. Молчу уже, что кнопочки не рабочие.

    Reply
  2. greyden1

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

    Ладно-ладно, файл обновил, «НайтиПоНаименованию» убрал, а кнопочки вроде как все и так работали.

    Reply
  3. greyden1

    Да, совсем забыл. Ёпрст, спасибо за конструктивную критику.

    Reply
  4. Ёпрст

    (2) На пустом списке нажмите на кнопку удалить…

    ЗЫ: Зачем добавлять Пометку ( причем, сам список на форме — без пометок), и потом нигде ЭТО не использовать ?

    Зачем условие на Выбран ? Зачем дана возможность подбора в Список одинаковых значений ? Зачем для такой простой задачи открывать еще Одну обработку ? …

    Ну и самое главное — нахрена выкладывать обработки, которые напишут самые начинающие ?

    Кто будет пользоваться вашей Обработкой ? Расчетчик ? Чтоб потом с криками, что же я наделала , верните всё в зад прибежала к вам ? ….

    Не понимаю.

    Reply
  5. nickVZ

    И помимо кода…

    «Иногда по непонятным причинам …» — мне досконально известны эти «непонятные причины». Они называются «разгильдяйство», «бардак», и «кривые руки».

    «Исправлять» последствия кривой и неграмотной эксплуатации каким либо кодом — значит, плодить новые «непонятные причины». Материал надо изучать. Функционал надо изучать. Логику надо изучать.

    И знать: эта самая логика не порождение капризов разработчика, или его фантазий. А модель законодательства. Довольно-таки точная.

    P.S. «Состояние сотрудника» — один из важнейших реквизитов, активно использующихся в конфигурации. Не надо лезть в конфу без понятия… Для себя же лучше.

    Reply
  6. AS108

    (3), (4) Кто-то здесь на Инфостарте (кажись Абадонна) сказал: лучше пусть умный поругает, чем дурак похвалит. Присоединяюсь к сказанным словам благодарности за конструктивную критику Ёпрст.

    Тем не менее, должна добавить, что мне Ваша обработка помогла, несмотря на её «примитивность». Во время аврала (как всегда перед отчётностью) 1С ЗиК упорно начисляла Детские Пособия вместе с окладом всем «Временно не работающим». Перепроведение и исправление не помогло, разбираться досконально времени не было, исправили «хирургическим» вмешательством. И за это — Вам спасибо.

    Как себя дальше поведёт пресловутое «состояние физлица» — не знаю. Если Уважаемые Критики в лице Ёпрст и nickVZ предложат более изящный вариант решения проблемы, то расчётчиков «с криками» станет как минимум на одного меньше :))))

    Reply
  7. greyden1

    (6) Спасибо 🙂 На самом деле обработка эта родилась когда ко мне попал клиент с госслужащими, заведенными в ЗиК как штатные сотрудники, поэтому система не начисляла им отпуск как госслужащим (собственно с этого вопроса и началось наше сотрудничество). Увольнение и дальнейший прием как госслужащих не помогали ибо не стал бы заполняться средний заработок, поэтому решено было «использовать скальпель» для исправления этой застарелой ошибки. После вмешательства с конфой все нормально (тьфу-тьфу) уже больше года.

    (5) Согласен с «бардаком» и пр. Однако самое радикальное что можно сделать это начать работать в новой базе и уже не совершать никаких ошибок. Но! Это повлечет за собой ряд новых проблем, связанных с переносом данных (представляете, сколько возни!) и возможным появлением новых ошибок при переносе. Вот и получается, что из нескольких зол приходится выбирать (будем надеяться 😉 ) меньшее.

    Reply
  8. Rasse1

    очень полезная вещь

    Reply
  9. Rasse1

    очень полезная вещь))

    Reply
  10. keysnofelet

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

    Reply
  11. elis99

    Не судите строго. Даже такие маленькие вполне могут пригодиться, особенно не программистам.

    Reply
  12. Ироида

    Спасибо пригодилась. Нужная вещь

    Reply
  13. 1с2с

    при использовании принудительного изменения значения «СостояниеФизлица» нужно, как минимум, дополнить условие в процедуре «глПриказПоСотруднику»:

    строку

    Если (Найти(Вид,Документ.Вид())>0)или(ПустоеЗначение(Вид)=1) Тогда

    дополнить

    Если ((Найти(Вид,Документ.Вид())>0)или(ПустоеЗначение(Вид)=1)) и (Документ.Выбран()=1) Тогда

    и ещё…

    можно обойтись и без обработки…

    в свойствах реквизита «СостояниеФизлица» установить признак ручного изменения (обязательно оставив и изменение документами)…

    и меняйте…

    Reply
  14. greyden1

    Да, я бы сейчас и сам лучше взвел флажок «Ручное изменение»…

    Reply
  15. kurvik

    Спасибо,пригодилась разработка.

    Reply

Leave a Comment

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