<?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='\
Плюс, однозначно. Я примерно также использую свойства контрагентов и номенклатуры в клюшках.
Имхо, такие вещи у нормального спеца отрабатываются спинным мозгом. Без подключения головы. Зачем данная статья? Непонятно.
(2) Не у всех к сожалению. Вещь действительно очевидная, но! Как изложено. Отличный методический материал для начинающих.
Продолжай Poppy
А то иногда лень очевидное расказывать начинающему, а так, носом в статью ткнул и красота.
Так что +
Хорошая статья для новичков.
+3 Тут и придраться некчему. Однозначно полезно. Ждём продолжения.
Были похожие вопросы на форуме, да и самому скоро придётся с разными организациями и складами разбираться, поможет, чтоб поменьше в типовой копаться.
Есть ещё задача: у одного заказчика по разным договорам разные адреса доставки. Могу выслать своё решение.
> Плюс, однозначно. Я примерно также использую свойства контрагентов и номенклатуры в клюшках.
а то!
только многие почему-то не удосуживаются проверять/отрабатывать ветку когда своство отсутсвует как класс…
А что здесь нового? Если конфа не снята с поддержки, то только таким способом и выкручиваются. Но здесь есть одно «НО» — если в базе работает около 30-40 пользователей, то с этим методом надо быть осторожнее, т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций, а так же возникают ситуации с порчей СсылокНаОбъекты (ссылка одного объекта присваивается другому) в следствии чего идет недостоверная информация.
Все это взято не спотолка, а при работе с типовой УПП в течении года.
(8)
> А что здесь нового?
По сравнению с чем?
> Если конфа не снята с поддержки, то только таким способом и выкручиваются.
Я бы сказала по-другому. Таким способом выкручиваются для того, чтобы не снимать с поддержки.
> т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций
О каких транзакциях идет речь?
> а так же возникают ситуации с порчей СсылокНаОбъекты
Причина порчи? Мною приведены примеры чтения свойств. Как чтение может испортить ссылки?
> Все это взято не спотолка, а при работе с типовой УПП в течении года.
Может поделишься своим опытом? А то складывается впечатление, что все это взято с потолка…
(8) У нас более 40 свойств использовано (УПП) проблем особых нет. Не удобно только в некоторых отчетах, что «служебные» своиства мешают, но это можно решить, например:http://infostart.ru/profile/10590/projects/1993/
Ценность этой статьи, не в том что она описывает что то новое, а в том что это сделано подробно и понятно. Насчет транзакций вообще непонятно.. что имется ввиду? Какие таблицы? А про порчу ссылок вообще ересь, свойства они только называются страшно )))))) на деле обычный регистр сведений да ПВХ..
Спасибо!
1. Почему в первом примере не стали использовать Категории, и собственно…
2. Если не сложно дополните статью способами отбора по Категориям.
(11) Статья дополнена…
Что то я не понял… Как не снимать с поддержки если общий модуль изменен?
(13) Ты, Hans, о чем? В статье описан способ не изменять общий модуль.
По твоему вопросу смотри мои комментарии здесьhttp://infostart.ru/blogs/892/
а я что то попутал… Плохо прочитал… Подумал что в статье писывается решение без изменения конфы ваще… а тут только без изменения метаданных и форм.
Да, предлагаемая методика может быть полезна во многих случаях. Но как быть в ситуации, когда нужно использовать свойства документа?
Например, после проведения документа необходимо установить некий признак в одно из нескольких фиксированных значений. Установленный признак — свойство именно текущего документа. Но это второстепенный признак, в регистрах не прописан, и из-за него перепроводить документ не стоит. Напрашивается использование свойства документа. Но типовая конфигурация УТ этого не позволяет. Как быть?
(16) В типовой УТ10.3 свойства у документов есть.
(17) Действительно, есть. Поторопился, не разобрался.
Спасибо.
(17) В своей публикацииhttp://www.infostart.ru/public/65526/
сослался на некоторые Ваши работы, т.к. сам использую практически те же самые технологии 🙂
И фсе это только для того, чтобы не добавить один реквизит в метаданные ??? А потом долбаться с выводом в отчеты информации по условию, накладываемому на свойство… Да ну вас, окститесь.
есть свои плюсы и минусы у способа… у статьи тоже… в результате пока «0»
(20) Не надо все возводить в абсолют. Многие отчеты типовых конфигураций поддерживают механизм свойств.
Как говорится — кто на что учился. Проще добавить реквизит? Добавляй. Это твое решение, как архитектора ИС.
(21) Спасибо, что обратил внимание…
(19) Спасибо, artbear! Для меня важно твое мнение.
хотя за подробность описания поставлю +
нужно это обдумать..может и пригодится.. 🙂
Спасибо! полезная инфа!
Здравствуйте.
Полезная статья для тех кто осваивает возможности 1С. Это знание — кирпичик в копилку профессионала.
Я попробовал применить эту идею в 1С Бухгалтерия для регистрации менеджера который сделал продажу в документе реализации. Окончательно задачу реализовал по другому, но возможность работать со свойствами заняло своё место в копилке.
если создать непериодический регистр сведений «ТекущиеКонстанты» и добавить в него все используемые свойства, то не придется писать в модуле «НайтиПоНаименованию» и обеспечит однозначность использования))
Спасибо очень полезно и познавательно.Про такую возможность работать со свойствами даже не догадивался. Так держать
будет полезна новичкам