<?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='\
Может уже хватит изобретать велосипеды?
Смотрим на ИТС:
Система стандартов и методик разработки конфигураций на платформе 1С:Предприятие 8
Правила образования имен переменных
Имена переменных следует образовывать от терминов предметной области таким образом, чтобы из имени переменной было понятно ее назначение.
Имена следует образовывать путем удаления пробелов между словами. При этом, каждое слово в имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами.
Пример:
Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом
Перем КоличествоПачекВКоробке; // Количество пачек в коробке
Имена переменных запрещается начинать с подчеркивания.
Имена переменных не должны состоять из одного символа. Использование коротких имен переменных допускается только для счетчиков циклов.
Переменные, отражающие состояние некоторого флага, следует называть так, как пишется истинное значение этого флага.
Например:
Перем ЕстьОшибки; // Признак наличия ошибок в процедуре.
Перем ЭтоТоварТара; // Признак, что товар относится к возвратной таре.
Слишком длинные имена: numberOfSeatslnTheStadium
То, что надо: numSeatsInStadiumrseatCount
Даа… УЖ.
(1) не все читают стандарты почему то
(3) Все правильно. Из-за таких и имеем криво переписанные конфигурации, в которых ни черта не понятно и со сменой сопровожденца либо умирающие, либо безжалостно переписываемые.
СегодняшняяДата 😉
(4) вот поэтому и считаю, что любая инфа, подталкивающая программиста писать более качественный код является весьма полезной
(0) откуда основа статьи? уж не из «Совершенного кода» ли? =) я вот тоже баловалсяhttp://infostart.ru/public/20992/
(5) Хе-хе, Вы тоже заметили…
Следует добавить еще одно правило:
«Имена переменных не должны содержать орфографических ошибок» 😐
Я привел реальный пример кода из конфигурации реальной за которую денег заплатили.
(6) Да именно из нее только сжато и отобрано более главные аспекты. Я же там написал, что не полеглотсвую чужих рукописей:
Не уж-то человек написавший все это «гений»!? Вот, что по такому поводу говорит книга С.Макконнелла «Совершенный код».
(0) во-первых не у всех есть доступ к ИТС, во-вторых не все ее и читают, банально все думают какой я крут что я не знаю как переменную назвать… К сожалению это реалии, на предыдущей работе был человек, который как попало называл переменные и сколько я не делал акцент на то как правильно называть, но как подчиненный может учить начальника — хех теперь я сокращен с этой работы… Я думал статья должна заинтересовать по крайней мере новичков да и старых «волков» тоже…
(2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу «Совершенный код» и аргументировать свой минус.
(10) Еще раз: у тебя
numberOfSeatslnTheStadium — слишком длинное имя, а
numSeatsInStadiumrseatCount — то, что надо, хотя на два символа длиннее.
А Стивен Макконнел здесь ни при чем. Это твой личный минус.
как это не причем — это взято из его книги 🙂 Получается, что как бы так такой человек, которого книга на таком уровне продажи вот так «лохонулся», кто же умней? Вы или Макконнелл?
(12) У Макконнела во втором случае
numSeatsInStadium
(стр 255)
«2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу «Совершенный код» и аргументировать свой минус.»
Мне вот интересно, по какой причине такому участинку ИС плюсы ставят за обыкновенный плагиат?
Если я «Капитал» Маркса ежедневно зацитирую, мне тоже за силу мысли и духа плюсы положены?
(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);
СуммаВыдачи = __зн;
Сумма = зн;
КонецЕсли;
Мешают резкие переходы на 1С и с 1С. Не выделены цитаты.
Красивее было бы взять идею из книги и ПОЛНОСТЬЮ транслировать её на 1С (особенно русский язык).
Если мне не изменяет память, то в том же ИТС дана рекомендация писать на русском.
Другими словами, например, участок:
Слишком длинные имена: numberOfPeopleOnThelJsOlympicTeam
numberOfSeatslnTheStadium
Слишком короткие имена: п, пр, ntm
п, ns, nsisd
т, тр, max, points
То, что надо: numTeamMembers, teamMemberCount
numSeatsInStadiumrseatCount
teamPointsMaxrpointsRecord
мог бы выглядеть так:
Слишком длинные имена: количествоЛюдейВОлимпийскойКоманде,
количествоСидячихМестНаСтадионе
Слишком короткие имена: к, кол, клок, сид, кс, ксмс,
То, что надо: колЧленовКоманды, счётчикЧленовКоманды
колСиденийСтадиона
Опять же в контексте 1С имя переменной ТекущаяДата совсем уж неудачное.
В целом при прочтении статьи возникло ощущение, как при разборе кода:
_с=0;ин=1;
Для ин=1 По цк Цикл
Если _пр[ин]=_б.Субконто(3) Тогда
_с=1;Прервать;
КонецЕсли;
КонецЦикла;
Если _с=0 Тогда
_пр[цк]=_б.Субконто(3);
цк=цк+1;
_сс=1;
КонецЕсли;
(15)
Продублируем.
«Ты не мне сделал минус, а самому Стивену Макконнеллу».
И что? Стивен воплощение бога на земле? Вы ему ссылку на форум отошлете, где ему минус поставили?
Или минус Вам поставили? За необтесанный плагиат вполне заслуженно.
Какое основание возмущаться?
P.S.
А код такой многие пишут, особенно программисты, не знакомые с предметной областью — им без разницы, поймет кто или нет. Круто же и быстро.
(17) А в чем крутость то такого кода, я бы наоборот сказал — «тупость его».
(16) Ну переменные не стоит привязывать к конкретному уклонению языка программирования, кто-то кодит на Java, C, C#, C++, а кто-то на 1С. Собственно англоязычные переменные можно использовать в 1С лишь были бы они удобочитаемы. А насчет «ТекущаяДата» — здесь не идет пример того, что у 1С есть такая функция, здесь показано, что переменные надо называть так, который смысл они несут содержя в себе какое-то значение!
(18)
Он работает. Быстро пишется.
Долго модифицируется потом, но это уже другая проблема.
Ну в общих чертах статья вызвала у людей внимание, а это уже хорошо… Дело не в плюсах и не в минусах, просто мне кажется это важный аспект информации на который нам программистам все же стоит сделать акцент… 🙂
(20) Я бы не сказал, что такой код быстро пишется… И работоспособность такого кода вообще равна провалу!
(0) Где брал книгу МакКоннела?
Дай, плиз, линк на электронный вариант.
У меня есть книжный вариант, но его постоянно с собой не потаскаешь 🙂
(23) ищи тут:Инфаната
Плюс за идею. Поддерживаю идею написания красивого кода. В свое время каминовские конфы поморочили мне мозг.
В связи с внесением автором исправлений отменяю свой минус 😎
(20) такой код пишется не быстро, а криво… Проблемы разработки (в данном случае написания кода), отладки функционала и дальнейшей модификации (развития функционала или его изменения) тесно связаны между собой. Человек, который это не понимает, и, возможно, поэтому пишет такой код, делает свою работу плохо (возможно это амбициозный и очень крутой, но …новичок).
(27)
Раньше в машинных кодах программировали (даже не на ассемблере).
И работало.
В жизни всякое бывает.
Это не значит, что я сторонник так кодировать на 1С.
(28) я программировал на первом курсе ВолГУ на ассемблере… и кроме меня (и то с картой и описанием подпрограмм) никто не знал, что там написано 🙂
….а в 1С лучше программировать так, что потом любой другой твой коллега (по профессии), даже самый начинающий был тебе благодарен за код.
Кстати, мне было полезно прочитать статью … я увлекаюсь иногда 🙂 и делаю иногда слишком длинные (но понятные) имена:
ТаблицаПроводокИзРегистраНекорректныхПроводок
ОтобранныеУзлыДляОбмена_Полный
НовыйСтатусПослеЗаписиДокумента
А что автор думает по поводу префиксов типов у переменных: Например переменная СтруктураКонтрагентов. Каждый раз писать слово Структура утомляет.
На ИТС не нашел такой инфы, хотя может плохо искал.
Помню когда писал на С++ хорошим тоном было делать префиксы типов данных
unsigned short usLongestWord; — us — префикс типа
(30) KilloN, Набери в вики «венгерская нотация». В 1С в ней тоже нет необходимости.
Я не испытываю, во всяком случае. А глаз режет, если встречаешь таких отщепенцев. Если у переменной грамотное название, то и так понятно из контекста, какой у нее может быть тип. А где возникают вопросы — жмешь F12.