<?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='\
Зачем два раза одно и тоже ?
ЗагрузитьВнешнююКомпоненту(«Formex.dll»);
Если LoadAddIn(«FormEx.dll») = 0 Тогда
Замени на
Если ЗагрузитьВнешнююКомпоненту(«Formex.dll») = 0 Тогда
При открытии или предложи на выбор вид справочка
или поставь проверку , а если он справочник.Номенклатура в этой конфигурации.
Если справочник большой…..то ждать придется ой как долго
у тебя там столько событий повторяется….
сделай динамический
(не формируй все сразу)
сформировал папки — клик по ней — ее разобрал и показал — так будет намного лучше.
ОткрытьФорму(ТЗСПР.Элемент.ТекущийЭлемент());
и
ОткрытьФорму(ТЗСПР.Элемент);
в твоем случай одно и тоже — но Отладчик в замере улыбаться начинает)))
но правильнее наверное так
ОткрытьФорму(ТЗСПР.Элемент,,-1);
за идею +
можно использовать при диначеской раздаче прав
вот если сделать панель управления аналогичную справочникам — то цены этой вещи не будет
🙂 я понял… доработаю… панель управления завтра сделаю!!! полюбому такая штуковина нужна !!!
можно сделать своего рода универсальный справочник — открываешь форму, выбираешь справочник из списка (при этом список может фильтровать только те которые разрешены этому пользователю)
Ужас, если чесно..
Вот штатно, такой же ужас:
http://webfile.ru/3678243
А вообще, перелопачивать весть справочник, и хранить его в ТЗ — зло..
Загнётся на большом..
Советую автору ознакомится с этим решением, например:
http://rikcenter.ru/solutions.php
http://rikcenter.ru/download/Demo_RiK.rar
скачать демку тут:
+6 т.е переделать форму списка справочника через ТабличноеПоле, дерево групп отображать через АктивИкс, панель инструментов тоже, поставщиком для ТП — прямой запрос к БД..
(0) Пару ложек дегтя…
Абсолютно нежизнеспособно при более-менее большом справочнике.
Плюс транзакция на большом справочнике заставит остальных юзеров курить, пока заполняется ТЗ.
А вот ТабличноеПоле из 1С++ для этих целей очень даже хорошо.
(6)(7) Тов. (г-н?) Ёпрст опередил, как всегда :))
Кстати, вот аналогичное решение, тут же :
http://infostart.ru/projects/1905/
Пользуемся поиском активнее!
🙂
(9) а как меня не называй, один хрен — Ёпрст биомать!
🙂
Спасибо огромное за обработку, она мне очень помогла в работе
(11) а подробнее можно?
ато наверное люд недоумевает….
я вначале след. недели все доработаю…
дегать в жопу!!! 🙂
оптимизирую все как надо!!!
разработак подобных небыло!!!
перелопатил все!!! все- гамно!!!
уже сделал классную панель инструментов просто еще не выложил!!!
А вот интересно… я искал… думал — уже же писал люд подобное…. и че…. ниче ваще ненашел!!!
http://infostart.ru/projects/1317/
даже вот решение «супер» —
не смешите мои подковы!!! багов — туча!!!! плюсов — 17 (заметсте)!!!
и все почемуто положительные О_О — за что????
а это ваще что вымне суете ???http://infostart.ru/projects/1905/
как это стыкуется с моей разработкай???
печать справочника….. причем сдесь вообще печать….
читайте описание внимательнее люди!!!!
Кстати динамическим — не буду делать, иначе смысла отбора и регулировки отображения нету…. попробую прямой отбор или компоненты 1C++
(15) Тук-тук… Там такое же отображение справочника в виде дерева — путём слива всего справочника в ТЗ и представление ТЗ в виде дерева… а для чего оно надо — для печати, либо для выбора — вот не пофиг ли ?
Смотрите внимательнее что вам пишут — на больших ТЗ — моветон, как будешь динамически обновлять своё дерево ?
Используй ТП + прямой запрос в качестве поставщика… Решение как у вас — мегатормоз, если что.
Автор, отметь, что твое решение подойдет не для всех справочников, для больших, «толстых» справочников возможны приличные тормоза.
Насчет транзакции тебе также сказали.
ЗЫ и спокойнее воспринимай критику, тебе люди говорят, которые уже прошли через подобные проблемы с большими справочниками.
вопщем попробовал несколько способов запроса справочника, тот что был — быстрый…
если у когото есть конкретные предложения просьба выкладывать их ввиде предложений по доработке, а не рекламой на платные разработки!!!
Платно — то за деньги!!!!
(19) Решение в (6) — бесплатно, т.е даром.
>>>Время заргузки элементов от 5 до 10 сек.!
Издеваешься над юзверями ?
(19) вопщем автор не читатель, автор песатель.
Т.к. не хочет слушать умных людей, то последняя фраза из его 13-го (5 строчка) поста абсолютно правильная.
Только по отношению к его решению.
+21Это поди еще и не в разделенном режиме проверял ?
🙂
решение (6) — совершенно бесполезно для разработчиков!!!
Это — пример… просто пример, я кстати на его базе собирал разработку как видишь!
Умные люди!!! ну порекомендуйте решение отбора справочника в ТЗ быстро и надежно, как в 8…
потому как в стандартное отображение справочника фильтры прикручивать ваще не вариант…
а все что написано выше в каментах вами — водица!!! ну ничего конкретного!!!
(24) Это твое решение!!!
Совершенно!!! Бесполезно!!!!!! Для кого угодно!!!!!!!!!!
Кстати как видишь!!!!!!!!!!!!!!!!!!!!
(25) Единственное правильное решение — это ТабличноеПоле!!!!!
А все остальное — водица!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>скачать демку тут:
http://rikcenter.ru/download/Demo_RiK.rar
>
а это какаято сырая штуковина которая меня кроет вот таким матом:
ТСправочник.Форма.ДеревоГрупп::ЗаполнитьУзел(OLE.INode Node=) : База данных не установлена
тзГруппы = РС.ВыполнитьИнструкцию(ТекстЗапроса);
{классФорма_ДеревоГруппСправочника@MD(209) }
ТСправочник.Форма.ДеревоГрупп::ДобавитьКорень() : ТСправочник.Форма.ДеревоГрупп::ЗаполнитьУзел(OLE.INode Node=) : База данных не установлена
тзГруппы = РС.ВыполнитьИнструкцию(ТекстЗапроса);
{классФорма_ДеревоГруппСправочника@MD(209) }
Сам.ЗаполнитьУзел(Root);
{классФорма_ДеревоГруппСправочника@MD(17) }
оДерево.Инит(Контекст, «текстДеревоГрупп», «Контрагенты»);
{Отчет.обрФормаСпискаСправочникаКонтрагенты.Форма.Модуль(332)}: ТСправочник.Форма.ДеревоГрупп::ДобавитьКорень() : ТСправочник.Форма.ДеревоГрупп::ЗаполнитьУзел(OLE.INode Node=) : База данных не установлена
тзГруппы = РС.ВыполнитьИнструкцию(ТекстЗапроса);
{классФорма_ДеревоГруппСправочника@MD(209) }
Сам.ЗаполнитьУзел(Root);
{классФорма_ДеревоГруппСправочника@MD(17) }
оПанель.Обновить();
{Отчет.обрФормаСпискаСправочникаКонтрагенты.Форма.Модуль(223)}: Значение не представляет агрегатный объект (Обновить)
оТП.ТаймаутОбновления = 0;
{Отчет.обрФормаСпискаСправочникаКонтрагенты.Форма.Модуль(573)}: Значение не представляет агрегатный объект (ТаймаутОбновления)
(27) Увидел знакомые имена с восклицательными знаками , забрел на огонёк .
http://infostart.ru/projects/4338
Возможна ли при использовании Формекса реализация подхода :
клик на заголовке каждой колонки в табличном поле активизирует меню возможных действий.
Для 8 эта тема обсуждается
(28) Автор,
1. юзай последнюю версию 1С++
2. Ты видел упоминание о том, что это вариант для Скуля?
(29) В FormEx нет ТабличногоПоля.
Это класс 1С++. И в нем реализован перехват очень многих событий.
В том числе и клик по заголовку.
А что, в восьмерке это проблема?
(31) Да , проблема. Событие «клик на заголовке» отсутствует.
Приходится заниматься «программными извращениями».
Эх.. не удалось уязвить.
(32) Если ты поплотнее изучишь возможности 1С++ и FormEx, желание уязвить плавно пропадет.
(33) Поплотнее не удастся.
Правда, некоторые подозрения по отношению к 8 появились.
ну так там эта… с папки где демка библа грузится ведь
а то что для SQL-то плохо!!! у мну SQL версии нигде не стоит 🙁
>а то что для SQL-то плохо!!! у мну SQL версии нигде не стоит 🙁
Вот именно это плохо и очень 😉 Лично я видал о одном месте и в определенной обуви дожидаться восстановления индексов после того, как в результате экспериментов базу уронишь… Поэтому даже и на отладке только скуль!
блин, но если пользоватся классом 1С++, там я так понимаю ТабличноеПоле под скулю… это получится не универсально!!!
да и фирмы у меня на дбф-е сидят 🙁
Справочник Контрагентов из 11 000 элементов — 20 секунд.
Повеситься!