Автоформатирование кода




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

53 Comments

  1. serega3333

    так автоформатирование как таковое не вкручено? хочется закрывать конфигуратор — открывать предприятие — нажимать кнопку в обработке — она парсит и обрабатывает…а тут копипаст туда сюда получается?

    Reply
  2. pumbaE

    Вверху страницы баннер, там можно даже не закрывать конфигуратор.

    Конечно не все там есть из перечисленного но можно и добавить.

    p.s: в принципе, эту обработку думаю можно портировать для работы прямо из снегопата.

    Reply
  3. Sibars

    (1) serega3333,

    Пока поддерживается только копипаст. В следующей версии предполагается выгрузка текстов модулей из режима предприятия и/или выбор уже выгруженных в файлы и их форматирование с сохранением в текстовые файлы.

    Также предполагается запустить орфографическую проверку на наименование метаданных и переменных в модулях. Естественно с учетом правил именования объектов состоящих из нескольких слов.

    Reply
  4. pumbaE

    Какой движок будете использовать для проверки орфографии?

    совет: не забудьте добавить правила для исключений префиксов и суффиксов при проверке.

    Reply
  5. Sibars

    (2) pumbaE,

    Сам пользуюсь СНЕГОПАТОМ. Вещь с правильной пометкой «must have»!

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



    Если есть желание, могу предложить такой вариант:

    Пишется скрипт для СНЕГОПАТА (сам пока не разбирался с написанием), который по хоткею, копирует выделенный фрагмент текста или весь модуль целиком и помещает его в текстовый файл.

    Параллельно запущена моя обработка, которая определяет наличие этого файла, обрабатывает его и кладет новый файл с форматированным кодом рядом. Скрипту СНЕГОПАТА останется только получить текст из нового файла и заменить его на старый.



    Автору такого скрипта с такой логикой или более удачной — в подарок эта обработка.



    В будущем предполагается развитие данной обработки и наращивание функционала.

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

    Reply
  6. Sibars

    (4) pumbaE,

    Для орфографии будем использовать старый добрый Word.

    C предложениями по вариантам замены, словарем исключений.

    За совет спасибо. Префиксы и суффиксы постараемся учесть.

    Reply
  7. Sibars

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

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

    Reply
  8. pumbaE

    (5) зачем же так сложно. Если есть обычная форма, то можно отделаться 5 строчками кода. Например для портирования обработки анализа цикломатической сложности кода, я добавил в модуль такие строки:

    Процедура МакросАнализЦикломатическойСложностиТекущегоМодуля() Экспорт
    ТекстовоеОкно = Конфигуратор.snegopat.activeTextWindow();
    
    Если ТекстовоеОкно = Неопределено Тогда
    глВывестиСообщение(«Не найдено текстовое окно!»);
    Возврат;
    КонецЕсли;
    
    ИсходныйКод = ТекстовоеОкно.text;
    ТекстМодуля = ИсходныйКод;
    
    Форма = ПолучитьФорму(«Форма»);
    ВычислитьСложностьТекстаМодуля();
    Форма.ЭлементыФормы.Панель1.ТекущаяСтраница = Форма.ЭлементыФормы.Панель1.Страницы.СтраницаРезультаты;
    Форма.ОткрытьМодально();
    
    КонецПроцедуры
    

    Показать

    и у меня теперь прям из конфигуратора работает данная обработка Пример

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

    Посмотрите на скрипт spellchecker.js , там тоже есть проверка как word так и libreoffice.

    Reply
  9. w-divin

    прикольненько, но жаба давит…

    а по поводу снегопата (юзверем которого также являюсь) там есть подобный механизм: format.js Функционал конечно послабее, но для халявного варианта хватает…

    Reply
  10. Sibars

    (8) pumbaE,

    Интересно. Спасибо.

    Все форматирование происходит в модуле объекта. на формах реализованы только выбор настроек и вывод результата.

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

    В принципе если заодно передать настройки в строке в формате XML можно для основного форматирования вообще обойтись без интерфейса.

    А обработку использовать для создания настроек 🙂

    Готовы взяться за сопряжение со СНЕГОПАТОМ?

    Reply
  11. Sibars

    (9) w-divin,

    Жаба она такая 🙂

    А функционал будем наращивать! Планов — громадье)

    И, надеюсь, задавим Вашу жабу объемом возможностей!

    Reply
  12. pumbaE

    (10) готов. Пишите на мыло. Мой профиль Сосна Евгений e-mail в скриптах думаю найдете 🙂

    Reply
  13. Sibars

    (12) pumbaE,

    Отлично! Завтра Вам напишу.

    Reply
  14. Sibars

    (14) artbear,

    Если обработка не полезна, то ей нет места ни в платном разделе, ни в бесплатном.



    Посмотрим как это получится объединить со СНЕГОПАТОМ.



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

    А платной станет конфигурация, с большим функционалом.

    Вопрос только сколько будет стоить эта конфигурация 🙂

    Поэтому есть смысл купить обработку сейчас, что бы потом не платить больше.

    Равно как и есть смысл подождать, когда обработка станет бесплатной.

    Решение за вами!

    Reply
  15. tormozit

    Ждем бесплатную)

    Reply
  16. _also

    мне кажется актуально только со снегопатом, а pumbaE пора Снегопат store открывать ))). Скрипты по 99 центов будут разлетаться только в путь))

    Reply
  17. Sibars

    Решил выложить в общий доступ.

    Работа по интегрированию в снегопат ведется.

    Надеюсь у Евгения хватит терпения общаться с таким невеждой в JS как я и допилить функционал до рабочей версии.)

    Reply
  18. dyak84

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

    Reply
  19. Sibars

    (20) artbear, Возражений никаких нет, только приветствую).

    А то из меня тестировщик не очень получается — то уеду, то подключить библиотеку не могу.

    Если Евгений aka pumbaE не возражает, то милости просим)

    Reply
  20. WKBAPKA

    а я немного покритикую… даже работая в режиме аврала я код оформляю как следует… единственное, чего я не делаю, так это не документирую, чего иногда не хватает…

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

    Reply
  21. Sibars

    (23) WKBAPKA, Это не критика, а повсеместная действительность )))

    Именно из-за этого данная работа и была проделана.

    1. Когда видишь такой код — спокойно его форматируешь, и читаешь уже более привычном формате.

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

    Reply
  22. WKBAPKA

    (24)

    если с этой точки зрения, когда пишут несколько человек, согласен, нужная вещь… вот интересно, а форматирует код под один шаблон, или можно под себя настраивать? а то не очень хорошо получается, пишут несколько человек, а код форматируется под одного человека 😉

    Reply
  23. Sibars

    (25) WKBAPKA, Можно хранить неограниченное количество настроек.

    Мы у себя в отделе за основу приняли стандарты оформления изложенные на диске ИТС + оптимизировали под себя.

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

    Reply
  24. pumbaE

    Добавлю от себя, к моему сожалению от говнокода данная обработка не спасет, даже если нормально отформатирует. Эх…

    Reply
  25. pumbaE

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

    Reply
  26. Sibars

    (28) pumbaE, Евгений, ошибки нет, так как я выложил обработку не адаптированную под СНЕГОПАТ.

    Reply
  27. pumbaE

    Прошу прощения, значит меня ввели в заблуждение.

    Reply
  28. Sibars

    (30) pumbaE, Это я сам себя ввел в заблуждение. Теперь исправил. Обработку обновил.

    Reply
  29. mzelensky

    довольно забавная штука

    Reply
  30. ZhokhovM

    Доброго времени суток! Добавьте ещё изменения:

    1. 0 (пробел) 0 (кол-во пробелов до и после)

    Пример:

    Возврат (пробелы) СтруктураДействий; -> Возврат СтруктураДействий;

    2.Расшифровка представления

    Пример:

    // ДанныеПараметры — ТИПДАННЫХ — ОПИСАНИЕ -> // ДанныеПараметры — ТИПДАННЫХ — Данные параметры

    Reply
  31. AlexO

    (0) есть такая функция в 1С — Alt+Shift+F

    Все остальное — это придумывание себе работы.

    Формуляты-оформляты….

    Лучше б код писали грамотней.

    И коментарии ставили….

    Reply
  32. AlexO

    (27) pumbaE,

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

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

    Reply
  33. pumbaE

    (35) AlexO, при должной настройке наоборот помогают исправить некоторые недочеты, которые на первый взгляд и не видны.

    alt+shift+f — это хорошо, но как показано на рисунке, после обработки значительно лучше выглядит текст.

    Reply
  34. AlexO

    (36) pumbaE,

    ну вот сразу — вот это «фНеОтбиратьПодразделение» — это что такое? Фукнция без скобок? 🙂

    Reply
  35. pumbaE

    (37) AlexO, прочтите еще раз (27) — данная обработка от говнокода не спасет, но вот от «ИНаче» , «ЕСли» и т.д. очень даже помогает. Я очень надеялся, что может быть достаточно такой код отформатировать нормально и станет чуть легче, но (27) .

    Еще раз хочу акцентировать внимание, лучше уж отформаированный говнокод, чем неотформатированный.

    Reply
  36. Sibars

    (33) Maxim2012,

    От двойных пробелов убирает.

    Возврат СтруктураДействий; -> Возврат СтруктураДействий;

    ..

    Описание добавляет, если его нет, если описание есть — то оставляет его нетронутым

    // ДанныеПараметры — ТИПДАННЫХ -> // ДанныеПараметры — ТИПДАННЫХ — ОПИСАНИЕ

    , но если

    // ДанныеПараметры — ТИПДАННЫХ — Параметр вывода ТЗ -> // ДанныеПараметры — ТИПДАННЫХ — Параметр вывода ТЗ

    Reply
  37. v.l.

    (0) Никак не избавлюсь от двойной пустой строки:

    настроено пропускать строку после КонецЕсли/КонецЦикла

    и пропускать строку перед КонецПроцедуры/КонецФункции

    Оба правила накладываются и получаются некрасивые две пустые строки.

    Reply
  38. Sibars

    (40) vladal, Не могу повторить такой же ситуации у себя. Если возможно, пришлите на d.d.kruglov@gmail.com файл настроек и текст для форматирования, в котором есть появляются две пустых строки.

    Reply
  39. Maxis

    Интересная обработка! Но сам стараюсь изначально код оформлять нормально: так его и для себя в процессе работы читать проще)

    Reply
  40. GerHard

    Вот что, снегопатофаны… Обработочка полезная, автору плюс.

    У меня практически всегда когда что-то пишу рядом открыт и пользовательский режим. Не проблема CTRL-C CTRL-V пару раз жамкнуть. А учитывая возможность настройки под себя — да вообще вполне самостоятельная вещь.

    Reply
  41. Sibars

    (43) GerHard спасибо).

    По снегопату: Евгений (pumbaE) написал интеграцию к снегопату.

    И соответственно, кто хочет — может использовать обработку как самостоятельную, кто со снегопатом — может загрузить ее функционал в него)

    Reply
  42. internetname

    Как-то привык уже сразу все форматировать.

    Reply
  43. Геннадьевич

    На мой взгляд — полезно, но не удобно.

    Что за СНЕГОПАД? Дайте ссылку посмотреть.

    Reply
  44. pumbaE

    (46) Геннадьевич, http://infostart.ru/public/102065/

    Reply
  45. Геннадьевич

    (47) pumbaE, Спасибо, но вроде писали что эта разработка бесплатна.

    Reply
  46. pumbaE

    (48) Геннадьевич, эта разработка да — бесплатна, а инструмент платный.

    Reply
  47. ponaroshku

    Спасибо 🙂

    Reply
  48. dour-dead

    Спасибо!

    Reply
  49. v.l.

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

    Пример:

    НСтр(«ru = ‘Накладная на перемещение’;uk = ‘Накладна на переміщення'», КодЯзыкаПечать)

    разбивается на несколько строк и производится выравнивание знака равенства по самой длинной строке в блоке, добавляя 139 пробелов:

    НСтр(«ru = ‘Накладная на перемещение’;
    uk                                                                                                                                          = ‘Накладна на переміщення'», КодЯзыкаПечать)

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

    Reply
  50. break

    не хватает выравнивания по запятой

    Reply
  51. dour-dead

    Не большой троллинг.

    А так автору спасибо.

    Reply
  52. v.l.

    (53) break, поддерживаю.

    Пробовал нарисовать такое, да где-то прокол вышел — они потом все равно переформатируются.

    (0) Что еще заметил: обработка режет большие комментарии — закомментированные блоки или текстовые описания и пояснения.

    Reply
  53. Sibars

    Рад, что обработка оказалась полезной. Прошу прощения за долгое молчание — загруз на работе.

    Ошибки и недочеты безусловно есть, но как часто бывает, нет времени их устранить, тем более, что после написания обработки стал писать код сразу правильно :))

    Если у кого есть желание дописать обработку — welcome! Могу опубликовать обновленную версию у себя, можете выложить ее в своем блоге — ссылку на обновление здесь размещу.

    Reply

Leave a Comment

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