Как завести у себя в команде код-ревью. Отвечаем на вопросы




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

26 Comments

  1. ivanov660

    (1) Коллега есть комментарии по существу?

    Или какие-нибудь дельные предложения, советы. Хотите поделиться опытом?

    Reply
  2. Stepa86

    > Здорово если бы для 1С появился мощный статический анализатор кода типа PVS-studio, но пока его нет.

    Я аж кофем подавился. https://infostart.ru/public/1089670/

    Reply
  3. genayo

    «++ Задача-6800 Иванов» — не очень хороший комментарий. Имхо, вместо номера задачи более уместна прямая ссылка на треккер, и кроме задачи не помешало бы указывать проект/спринт, в рамках которого производятся изменения, чтобы потом было легко найти все изменения по проекту, сделанные всеми разработчиками.

    Reply
  4. CheBurator

    (4) + по крайней мере как минимум в скобках-комментах д.б. маркер дата-время

    Reply
  5. ivanov660

    (3) А от 1С есть что-то? Слишком много разных инструментов используется и для новичков это довольно напряжно будет применить и настроить.

    Reply
  6. user1219528

    (5)++. Зато мемы вкатили)

    Reply
  7. ivanov660

    (6) Конечно под себя нужно «допилить»). Однако если у вас задача в системе баг-трекинга, то большой перечень комментарием может быть излишним.

    Reply
  8. ivanov660

    (5) Коллега — я привел ответы на вопросы, которые просили. А что вы собственно хотели почерпнуть?

    Reply
  9. Stepa86

    (7) от 1С — АПК.

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

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

    В эту конфигурацию мы подгружаем все нарушения, которые нашли Сонар+АПК+EDT и аудиторы их сразу видят. И не тратят время на них. А автор кода получает по башке за то, что сам не прогнал свой код через сонар.

    Reply
  10. ivanov660

    (11) Не все имеют большую и продвинутую команду с хорошим набором инструментов и специалистов, как у вас.

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

    Reply
  11. Stepa86

    (12) Вот прям вообще ДА. Если у вас 1.5 программиста — вам не нужен инструмент по автоматическому статическому анализу кода. А если у вас большой и серьезный проект, то обязательно нужно и двойное чтение кода, и статистический анализ кода, и гит, и тесты, и покрытие, и CI/CD, и разные контуры.

    Не существует единый истины. Всегда нужно головой думать в каждой конкретной ситуации. И взвешивать профит и затраты.

    Reply
  12. ivanov660

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

    Reply
  13. Stepa86

    (14) «не использовал хранилище для разработки» можно двояко понять. Есть те, кто еще не использует, а есть те, кто уже не использует.

    Вы же статьи тоже пишете для того, чтоб другие почитали и улучшили процессы у себя?

    Reply
  14. TODD22

    (11)

    А автор кода получает по башке за то, что сам не прогнал свой код через сонар.

    А разве автоматически это не должно делаться?

    Reply
  15. Stepa86

    (16) Не на всех проектах. Да и если прогнали — не всегда правят. У нас тут тоже как бы костыли и эксперименты, а не отлаженный идеальный процесс с розовыми понями.

    Reply
  16. TODD22

    (17)У нас было строго, проверка автоматически, пока не исправил код не принимают.

    Reply
  17. genayo

    (6) Зачем, если есть ссылка на задачу в треккере?

    Reply
  18. Kutuzov

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

    Reply
  19. TODD22

    (20)

    Временные затраты, которые понес проверяющий — они падают на стоимость проекта?

    А на что ещё падают затраты в коммерческой организации?

    Reply
  20. ivanov660

    (22)Самое разумное раздавать задачи в зависимости от компетенции. А за джунами обязательно должен быть присмотр.

    Reply
  21. Kutuzov

    (21) Ну мало ли, может это считается как инвестиции в развитие сотрудников. Я поэтому и спрашиваю, что надо узнать)

    Reply
  22. skillman

    (9) Можете прикрепить к статье свои регламенты разработки, хотелось бы посмотреть чужую практику, возможно на будущее по взаимствовать.

    Reply
  23. skillman

    (22)

    проще было бы не допускать таких к работе

    Не согласен по поводу допуска, учить джунов как-то нужно, а код ревью дает еще рост квалификации

    Reply
  24. ivanov660

    (25)не могу, это внутренний документ, зато могу пообщаться в рамках этого вопроса.

    Reply
  25. ivanov660

    (26)конечно, джун же должен же как-то расти и притом что же он будет делать. Иначе это будет напоминать анекдот про молодого специалиста, которого не берут на работу из-за отсутствия опыта)

    Reply
  26. Бубузяка

    Автор, снимаю шляпу.

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

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

    Внутренних стандартов практически нет. В работе только Стандарты разработки от 1С, рекомендации с ИТС. Стилистику кода заимствуем из 1С:БП.

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

    Для проверки решения используем конфигурацию 1С «Автоматическая проверка конфигураций». Они ее регулярно обновляют, делая умнее. Сразу исправляем критические ошибки. После каждого релиза, это 3й знак в версии конфигурации по стандартам 1С, садимся за исправление того, что осталось, уменьшая технический долг. Ведь каждые 2 года сертификация на 1С-совместимо, а они там не разбираются где отступление от Стандартов, а где «проектное решение».

    Reply

Leave a Comment

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