Принципы профессионализма через истории. Про слепоту и вопросы




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

25 Comments

  1. pm74

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

    Reply
  2. nytlenc

    А еще иногда (процентов 90 случаев) у заказчика семь пятниц на неделе. Сегодня хочу одно, завтра другое, после завтра третье. В итоге вообще не то давайте все переделаем. И благодарностью будет конечно — ваша тупая программа не работает как надо!

    Reply
  3. boln
    Заказчик написал красивое ТЗ. В нем было прописано, что нужно сделать, вплоть до объектов системы.

    Это не его заказчиковское дело, какие объекты будут в системе. Заказчик «заказывает» вход и выход, остальное — вопрос реализации.

    Reply
  4. o.nikolaev

    (3) При все уважении, Николай. И этого не могут — «вход и выход» заказать. Мычат только.

    А история просто замечательная! Порадовало попадание:

    А заказчик с таким уверенным голосом точно знает, чего хочет.
    Reply
  5. 1c-intelligence
    Уточняй цели. Без понимания цели сложнее увидеть скрытые проблемы. А иногда оказывается, что задачу надо делать по другому или вообще не надо делать.

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

    Анализируй задачу досконально.

    лично мне это кажется лишним. Лучше ставить себе задачу самому, зная цель. Тогда и анализировать не придется, когда сам себе постановщик.

    Задавай вопросы пока не поймешь все до конца

    Формулировка как в цикле Пока Цикл, но вроде можно не ограничивать условие выхода из цикла. Выходом может быть достигнутая совсем другими методами цель (не теми, что в задаче). У всех, наверное, бывала ситуация, когда создаешь готовое решение за время, в течение которого заказчик от тебя ждет прочтения ТЗ и вопросов.

    Reply
  6. &rew

    Ничто так не укрепляет веру в успех проекта как предоплата! Вы когда брались за проект, Вас спросили «Как Вы видите?». Если нет, то Ваше дело выполнить проект и получить деньги. Даже если это не нужно, все будут знать, что Вы — профессионал и с Вами можно работать. Если Вас не спросили, а вы начинаете задавать «лишние» вопросы, т.е. вопросы не типа «КАК» а типа «ЗАЧЕМ», то это очень часто выглядит как попытка «отъехать» от проекта и, как следствие, невозможность выполнить именно Вами поставленную задачу (в глазах Заказчика).

    Reply
  7. boln

    (4)

    При все уважении, Николай. И этого не могут — «вход и выход» заказать. Мычат только.

    Вы, Олег, еще более безжалостны, чем я 🙂

    Да, это серьезная задача — научить заказчика говорить членораздельно. Мне приходилось интервьюировать заказчика с целью написать однозначно трактуемое обеими сторонами ТЗ. Прямо ощущал себя в роли следователя, который «колет» матерого преступника…

    И ведь нигде не учат этому искусству. Или, может, уже учат?

    Reply
  8. 6JIoHguH

    (6)

    Если нет, то Ваше дело выполнить проект и получить деньги. Даже если это не нужно

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

    Гораздо приятнее получить отзыв от заказчика типа:

    — Пришел разработчик и не ринулся бездумно выполнять задачу а все проанализировал и предложил более рациональное решение (переубедил меня, что мне это не нужно), в результате я сэкономил. Пожалуй, я обращусь к вам еще раз.

    чем:

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

    Хотя, просто, может мне еще не попался *тот самый заказчик* 🙂

    И это не будет выглядеть как «попытка отъехать от проекта», если грамотно объяснить все заказчику. Никто не любит просто так тратить деньги, поэтому, я думаю, что при грамотном обсуждении задачи (и с рационально мыслящем заказчиком) все будет хорошо 🙂

    Reply
  9. &rew

    (8) «- Пришел разработчик и не ринулся бездумно выполнять задачу а все проанализировал и предложил более рациональное решение (переубедил меня, что мне это не нужно), в результате я сэкономил. Пожалуй, я обращусь к вам еще раз. »

    А в жизни это выглядит так.

    — Пришел мальчик, начал нам говорить, что нам это не надо, что понимает больше нас в наших бизнес-процессах. Чудак какой-то, ему деньги не нужны что ли?

    и

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

    — Сделал нам разработчик то, что мы просили. Оно работает именно так, как мы хотели. Хоть сейчас это уже не актуально, но человек свою работу сделал качественно. В следующий раз обратимся к нему же.

    «…Никто не любит просто так тратить деньги…»

    Вот это в точку. И люди это понимают очень хорошо. И они не поймут, почему вы тратите свое время/деньги и не хотите заработать.

    Reply
  10. Starec_I

    (9)

    Сделал нам разработчик то, что мы просили.

    — это уже фантастика.

    Reply
  11. 6JIoHguH

    (9)

    начал нам говорить, что нам это не надо

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

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

    P.S.

    Опять же оговорюсь, мне еще не попался *тот самый заказчик* 🙂

    Reply
  12. tailer2

    не смешно

    вопрос был всего один:кто это написал

    Reply
  13. Разумов

    Из выводов пункт №3 считаю самым важным.

    Reply
  14. &rew

    (11) Александр, историй полно:)

    «Скоро стану я седым и старым,

    Вот тогда и напишу свои я мемуары…»

    Reply
  15. Yashazz

    Слабаки) Любое ТЗ, если только его не писал профи-методист-внедренец, будет с пробелами, и таких подавляющее большинство. Надо или «чуйку» включать, или опыт (знание подводных камней), или делать универсал. А не ждать от заказчика у моря погоды.

    Много раз делал задачу «вслепую». Пару конфигураций с нуля так написал. Работают. И знаете почему? Там, где у меня была неясность, я делал общее настраиваемое решение, универсальный регулируемый блок, как угодно, но чтоб потом можно было быстро докрутить, когда появится понимание. Благо общие бизнес-процессы предметных областей и хоз.операции учёта более-менее стандартны. А детали настраивались уже потом «на лету». Универсальность наше всё)

    Да, это дольше и дороже по времени. Но это стократ окупается при запуске и опытно-промышленной эксплуатации, когда вдруг оказывается, что «всё не так» и «имели в виду не это». Причём это бывают как универсальные архитектурные решения, так и просто правильно структурированный и параметризованный код.

    Reply
  16. VmvLer

    банально, скучновато и предсказуемо

    в 5-м классе средней школы такие статейки пишут

    это исключительно мое впечатление как на духу

    Reply
  17. Rustig

    (2) так говорят, если за работу не платят = не видят ценности работы разработчика (внедренца). с такими надо работать по предоплате (частичной или полной), чтобы почувствовали цену

    Reply
  18. Rustig

    (3) ага, точно = все учатся на своих ошибках

    Reply
  19. Rustig

    (4) сейчас надо одно, в другой момент — другой контекст = надо другое — нормальное требование к программе 1с — начните работать по предоплате — это спускает заказчика с небес на землю

    Reply
  20. IvanovAV

    Вам денег за эти 2 недели заплатили??

    Если нет, тогда чем обосновали не уплату? Вины вашей нет!

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

    Были в похожей ситуации, приехали на переговоры КА 1.1, просят переписать блок себестоимости и весь партионный учет. Начали задавать вопросы, оказалось, то что они хотят решается типовыми средствами через ТипЦен ПлановойСебестоимости и флаг в правах запрещающий продавать выше этого типа цен. Вторая задача, привязать шаблоны проводок к справочнику проекты, мы сказали есть типовой механизм счета учета контрагентов. В результате реализация двух ТЗ, заняла несколько человеко часов, вместо нескольких человеко недель, с туманной перспективой дальнейших обновлений. А мы получили лояльного клиента.

    Reply
  21. Neti

    (20) Да, клиент тогда сам поднял вопрос оплаты и заплатил денег без каких-либо обсуждений. Но в итоге клиент был не доволен ситуацией. И скорее всего я у клиента в голове связывался с негативными воспоминаниями, так как какое-то время он с неохотой работал со мной. Поэтому я достаточно долго менял это отношение максимально проактивными и безошибочными действиями с моей стороны.

    Reply
  22. Neti

    (16)

    Правильно ли я понял, что хотелось бы историю с более интересным сюжетом? Или хочется больше полезных практических идей в ней?

    Эти истории я изначально пишу для своих сотрудников, чтобы лучше объяснить наши принципы. Так как принципы без истории не всегда сразу хорошо воспринимаются.

    Но если история эмоционально не задела, значит надо другую.

    Reply
  23. VmvLer

    (22) Я же написал — изложение скучновато.

    Когда такое рассказывают обычно клонит ко сну и вылетает из головы сразу после звонка на перемену)

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

    Reply
  24. Neti

    (23)

    Понял. Спасибо за обратную связь.

    Reply
  25. Neti

    (5)

    Как всегда полезные дополнения) Спасибо!

    Reply

Leave a Comment

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