<?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='\
Прикольно.
Плюсую. Буду пробовать поюзать. Идейка весьма интересная.
Документы располагать относительно друг друга надо не изменением времени а правильным созданием и записью самих документов. только в этом случае мы избежим ограничения 86400 документов в сутки!
Согласен.
Данный код — и служит целям «правильного» программного создания/модификации документов. 😉
А про то, что документы интерактивно нужно правильно создавать/модифицировать — это да, возражений нет.
Если знаешь как программно создать и расположить реализацию после заявки не оперируя временем документа — поделись, будет интересно не только мне…
Ок. Скоро будет!
>GROOVY
>Ок. Скоро будет!
Будем ждать…
В дополнение к замечанию Сhe: расхождение по времени с заявкой и расходной еще пол-беды. У нас цепочка из трех документов ЗаявкаПокупателя-Отборочная-Расходная. Если с заявкой и расходной все понятно, то чуть уточню, что за зверь Отборочная. Этот документ представляет собой обычное перемещение с отдела хранения в отдел экспедиции, где на их основании создается расходная. При этом не обязательно все товары из заявки попадают в отборочные и расходные, ну это к делу не относится. Так вот временная последовательность должна четко соблюдатся для пары Отборочная-Расходная — ну не может экспедиция выписать товар, который еще не поступил со складов. Но наши крендели умудряются иногда шурануть расходную более ранним временем (а иногда и датой!), чем отборочная. Так что если у GROOVY есть идеи как это блокировать на этапе создания расходной — воздадим хвалу этому достойному человеку!
Не к теме публикации, а по обсуждению… у меня еще лучше… у меня из неподтвержденки дерево документов может быть листов на 8-10 (неподтвержденка-заявки-заказы-поступления-расходы)
Надо воспользоваться этим, чтобы рейтинг выпрашивать 🙂
Токо где финт-то? Обычное преобразование типов…
Просвети, плиз, неграмотного — где здесь преобразование типов?
Да все просто. Для тебя время — это минуты, секунды и часы, а во внутреннем представлении 1С — это число типа long. Поэтому, ты мог с таким же успехом не секунды прибавлять, а, скажем, минуты. Она все равно бы преобразовала бы все к формату времени.
Кстати, если хошь знать, какими бывают финты, то читай мою статью последнюю 🙂
будь спок. минуты тоже прибавляем… 😉
статью — ща посмотрим…
Интересно 🙂
Плюсую!
Спасибо, открыл для себя: движок 1С сам произведет »адекватный» пересчет секунд, минут, часов. А то я совсем недавно решал такую проблему, так накрутил там пересчеты все самостоятельно :-). Оказывается можно было не заморачиваться.
Надо попробовать 🙂 +1
А чего пробовать? Юзать надо 😉
баян
Может кто еще знает некоторые неочевидные хитрости?
Была такая фишка до 14-го релиза:
для дополнительных числовых реквизитов проводки
(напр. «количество2″ с конф.»Сельхоз.предприятие» от Рарус)
v77 поддерживала функции ДО() и КО() в запросе.
Жаль, что эту вещь выкосили в поздних релизах.
у меня(как у пита) такое давно реализовано:)Правда не мучался,сразу получилось.Это когда из ТиС в Бухию переброску и если изменения,то меняем и в бухии.Соотв. и время нужно точно расставить.
Boj мелкая хитрость: бывает надо на экран вывести ТЗ (типа в отладочных целях), причем с нумерацией строк. Чтобы не заморачиваться, пишем: [code]
ТЗ.ВидимостьКолонки(«НомерСтроки»,1);
ТЗ.ВыбратьСтроку(,» типа отладка»);
Не понял.. читать — читаем, ума-разума набираемся.. а кто рейтинг статьи плюсовать будет, а???
Бесценный опыт — в нашу копилку ;-)))
Не так давно была задача «раскидать» по дню загруженные документы, так тщательно прописывал ЧЧ,ММ,СС. А оказывается, можно было всё гораздо проще сделать. Спасибо за ценный опыт.
Пожалуйста! Приходите и читатйе другие мои «жизненные» статьи!
Позволю себе дополнить…
Управлять временем можно гораздо точнее нежели в переделах секунды… мы-то с вами знаем 🙂
86400 — это для пионэров
Есть у меня два документа с одинаковым временем 12.00.01
Если я поменяю время документа с ‘757H1S’ на ‘757H1T’, то документы что сделают?
Правильно, поменяются местами в журнале
А время какое мы продолжаем видеть в 1С? Правильно, 12.00.01 🙂
ЗЫ. Чучундеру ПЛЮС за упорство в написании полезных программ и статей
(25) И вот сколько документов «влазит» в одну секунду — это и определяется «емкостью» приведенного ниже идентификатора…
Бывает нелишним перед всем этим вставить «АвтоВремяОтключить()»
+
конечно не решило всех проблем, но все равно спасибо, подталкнуло в нужном направлении, поэтому однозначно +!
согласен все гениальное просто спасибо за идею 🙂
Спасибо за решение, очень помогло!
(30) Мамонты еще живы…
😉
(31) Ещё живее) Подскажите пожалуйста, не вижу ни ПолучитьВремя(), ни УстановитьВремя() (точнее функция есть — параметры другие).. Видимо с очередными версиями платформы (или это вообще для 7.7? к сожалению нет под рукой, а так давно не пользовался не помню уже) вырезали, теперь только свою проверку городить при добавлении? Или всё же есть какая-нибудь уловка?)
(32) пример рассмотрен для 7.7.
используются только штатные возможности.
.
вполне возможно, что такой подход (с поправкой на особенности 8-ки для задания датавремя документа) будет работать и на 1С 8.