Сила имен переменных




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

31 Comments

  1. tomvlad

    Может уже хватит изобретать велосипеды?

    Смотрим на ИТС:

    Система стандартов и методик разработки конфигураций на платформе 1С:Предприятие 8

    Правила образования имен переменных

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

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

    Пример:

    Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом

    Перем КоличествоПачекВКоробке; // Количество пачек в коробке

    Имена переменных запрещается начинать с подчеркивания.

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

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

    Например:

    Перем ЕстьОшибки; // Признак наличия ошибок в процедуре.

    Перем ЭтоТоварТара; // Признак, что товар относится к возвратной таре.

    Reply
  2. Арчибальд

    Слишком длинные имена: numberOfSeatslnTheStadium

    То, что надо: numSeatsInStadiumrseatCount

    Даа… УЖ.

    Reply
  3. Stepa86

    (1) не все читают стандарты почему то

    Reply
  4. tomvlad

    (3) Все правильно. Из-за таких и имеем криво переписанные конфигурации, в которых ни черта не понятно и со сменой сопровожденца либо умирающие, либо безжалостно переписываемые.

    Reply
  5. Jers

    СегодняшняяДата 😉

    Reply
  6. Stepa86

    (4) вот поэтому и считаю, что любая инфа, подталкивающая программиста писать более качественный код является весьма полезной

    (0) откуда основа статьи? уж не из «Совершенного кода» ли? =) я вот тоже баловался http://infostart.ru/public/20992/

    Reply
  7. marsohod

    (5) Хе-хе, Вы тоже заметили…

    Следует добавить еще одно правило:

    «Имена переменных не должны содержать орфографических ошибок» 😐

    Reply
  8. logarifm

    Я привел реальный пример кода из конфигурации реальной за которую денег заплатили.

    (6) Да именно из нее только сжато и отобрано более главные аспекты. Я же там написал, что не полеглотсвую чужих рукописей:

    Не уж-то человек написавший все это «гений»!? Вот, что по такому поводу говорит книга С.Макконнелла «Совершенный код».

    Reply
  9. logarifm

    (0) во-первых не у всех есть доступ к ИТС, во-вторых не все ее и читают, банально все думают какой я крут что я не знаю как переменную назвать… К сожалению это реалии, на предыдущей работе был человек, который как попало называл переменные и сколько я не делал акцент на то как правильно называть, но как подчиненный может учить начальника — хех теперь я сокращен с этой работы… Я думал статья должна заинтересовать по крайней мере новичков да и старых «волков» тоже…

    Reply
  10. logarifm

    (2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу «Совершенный код» и аргументировать свой минус.

    Reply
  11. Арчибальд

    (10) Еще раз: у тебя

    numberOfSeatslnTheStadium — слишком длинное имя, а

    numSeatsInStadiumrseatCount — то, что надо, хотя на два символа длиннее.

    А Стивен Макконнел здесь ни при чем. Это твой личный минус.

    Reply
  12. logarifm

    как это не причем — это взято из его книги 🙂 Получается, что как бы так такой человек, которого книга на таком уровне продажи вот так «лохонулся», кто же умней? Вы или Макконнелл?

    Reply
  13. Арчибальд

    (12) У Макконнела во втором случае

    numSeatsInStadium

    (стр 255)

    Reply
  14. KapasMordorov

    «2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу «Совершенный код» и аргументировать свой минус.»

    Мне вот интересно, по какой причине такому участинку ИС плюсы ставят за обыкновенный плагиат?

    Если я «Капитал» Маркса ежедневно зацитирую, мне тоже за силу мысли и духа плюсы положены?

    Reply
  15. logarifm

    (14) а здесь не причем плагиат, вот что заставило написать меня такую статью, разбор конфигурации с таким вот кодом:

    зн=б.СКК();

    __зн=зн;

    Если зн>0 Тогда

    Если (ПустоеЗначение(Сотрудник.ДатаУвол)=0)И

    (Сотрудник.ДатаУвол < НачМесяца(ДатаПериода)) Тогда

    Иначе

    зн=Цел(зн);

    КонецЕсли;

    Если (ЗаполнитьВсех=0) Тогда

    Если ((б.Субконто(1).ЧерезКассу=1)И(Сред(Строка(Счет),1,2)=»30″)) Тогда

    НоваяСтрока();

    Сотрудник = б.Субконто(1);

    СуммаВыдачи = __зн;

    Сумма = зн;

    ИначеЕсли ((б.Субконто(1).ЧерезКассу=0)И(Сред(Строка(Счет),1,2)=»31″)) Тогда

    Если б.Субконто(1).выбран()=1 Тогда

    б_с.ИспользоватьВладельца(б.Субконто(1));

    Если б_с.НайтиПоРеквизиту(«Банк»,Субконто1.Банк,0)=1 Тогда

    НоваяСтрока();

    Сотрудник = б.Субконто(1);

    СуммаВыдачи = __зн;

    Сумма = зн;

    ИначеЕсли пр_реп=0 Тогда

    НоваяСтрока();

    Сотрудник = б.Субконто(1);

    СуммаВыдачи = __зн;

    Сумма = зн;

    КонецЕсли;

    Иначе

    Сообщить(«Не вказано зп рахунок банку»);

    Возврат;

    КонецЕсли;

    КонецЕсли;

    Иначе

    НоваяСтрока();

    Сотрудник = б.Субконто(1);

    СуммаВыдачи = __зн;

    Сумма = зн;

    КонецЕсли;

    Reply
  16. apolon

    Мешают резкие переходы на 1С и с 1С. Не выделены цитаты.

    Красивее было бы взять идею из книги и ПОЛНОСТЬЮ транслировать её на 1С (особенно русский язык).

    Если мне не изменяет память, то в том же ИТС дана рекомендация писать на русском.

    Другими словами, например, участок:

    Слишком длинные имена: numberOfPeopleOnThelJsOlympicTeam

    numberOfSeatslnTheStadium

    Слишком короткие имена: п, пр, ntm

    п, ns, nsisd

    т, тр, max, points

    То, что надо: numTeamMembers, teamMemberCount

    numSeatsInStadiumrseatCount

    teamPointsMaxrpointsRecord

    мог бы выглядеть так:

    Слишком длинные имена: количествоЛюдейВОлимпийскойКоманде,

    количествоСидячихМестНаСтадионе

    Слишком короткие имена: к, кол, клок, сид, кс, ксмс,

    То, что надо: колЧленовКоманды, счётчикЧленовКоманды

    колСиденийСтадиона

    Опять же в контексте 1С имя переменной ТекущаяДата совсем уж неудачное.

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

    _с=0;ин=1;

    Для ин=1 По цк Цикл

    Если _пр[ин]=_б.Субконто(3) Тогда

    _с=1;Прервать;

    КонецЕсли;

    КонецЦикла;

    Если _с=0 Тогда

    _пр[цк]=_б.Субконто(3);

    цк=цк+1;

    _сс=1;

    КонецЕсли;

    Reply
  17. KapasMordorov

    (15)

    Продублируем.

    «Ты не мне сделал минус, а самому Стивену Макконнеллу».

    И что? Стивен воплощение бога на земле? Вы ему ссылку на форум отошлете, где ему минус поставили?

    Или минус Вам поставили? За необтесанный плагиат вполне заслуженно.

    Какое основание возмущаться?

    P.S.

    А код такой многие пишут, особенно программисты, не знакомые с предметной областью — им без разницы, поймет кто или нет. Круто же и быстро.

    Reply
  18. logarifm

    (17) А в чем крутость то такого кода, я бы наоборот сказал — «тупость его».

    Reply
  19. logarifm

    (16) Ну переменные не стоит привязывать к конкретному уклонению языка программирования, кто-то кодит на Java, C, C#, C++, а кто-то на 1С. Собственно англоязычные переменные можно использовать в 1С лишь были бы они удобочитаемы. А насчет «ТекущаяДата» — здесь не идет пример того, что у 1С есть такая функция, здесь показано, что переменные надо называть так, который смысл они несут содержя в себе какое-то значение!

    Reply
  20. KapasMordorov

    (18)

    Он работает. Быстро пишется.

    Долго модифицируется потом, но это уже другая проблема.

    Reply
  21. logarifm

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

    Reply
  22. logarifm

    (20) Я бы не сказал, что такой код быстро пишется… И работоспособность такого кода вообще равна провалу!

    Reply
  23. artbear

    (0) Где брал книгу МакКоннела?

    Дай, плиз, линк на электронный вариант.

    У меня есть книжный вариант, но его постоянно с собой не потаскаешь 🙂

    Reply
  24. logarifm

    (23) ищи тут: Инфаната

    Reply
  25. WellMaster

    Плюс за идею. Поддерживаю идею написания красивого кода. В свое время каминовские конфы поморочили мне мозг.

    Reply
  26. Арчибальд

    В связи с внесением автором исправлений отменяю свой минус 😎

    Reply
  27. KukA.5

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

    Reply
  28. KapasMordorov

    (27)

    Раньше в машинных кодах программировали (даже не на ассемблере).

    И работало.

    В жизни всякое бывает.

    Это не значит, что я сторонник так кодировать на 1С.

    Reply
  29. KukA.5

    (28) я программировал на первом курсе ВолГУ на ассемблере… и кроме меня (и то с картой и описанием подпрограмм) никто не знал, что там написано 🙂

    ….а в 1С лучше программировать так, что потом любой другой твой коллега (по профессии), даже самый начинающий был тебе благодарен за код.

    Кстати, мне было полезно прочитать статью … я увлекаюсь иногда 🙂 и делаю иногда слишком длинные (но понятные) имена:

    ТаблицаПроводокИзРегистраНекорректныхПроводок

    ОтобранныеУзлыДляОбмена_Полный

    НовыйСтатусПослеЗаписиДокумента

    Reply
  30. KilloN

    А что автор думает по поводу префиксов типов у переменных: Например переменная СтруктураКонтрагентов. Каждый раз писать слово Структура утомляет.

    На ИТС не нашел такой инфы, хотя может плохо искал.

    Помню когда писал на С++ хорошим тоном было делать префиксы типов данных

    unsigned short usLongestWord; — us — префикс типа

    Reply
  31. herfis

    (30) KilloN, Набери в вики «венгерская нотация». В 1С в ней тоже нет необходимости.

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

    Reply

Leave a Comment

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