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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *