Форма дерева любого справочника через FormEx




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

39 Comments

  1. Tatitutu

    Зачем два раза одно и тоже ?

    ЗагрузитьВнешнююКомпоненту(«Formex.dll»);

    Если LoadAddIn(«FormEx.dll») = 0 Тогда

    Замени на

    Если ЗагрузитьВнешнююКомпоненту(«Formex.dll») = 0 Тогда

    Reply
  2. Tatitutu

    При открытии или предложи на выбор вид справочка

    или поставь проверку , а если он справочник.Номенклатура в этой конфигурации.

    Если справочник большой…..то ждать придется ой как долго

    у тебя там столько событий повторяется….

    сделай динамический

    (не формируй все сразу)

    сформировал папки — клик по ней — ее разобрал и показал — так будет намного лучше.

    ОткрытьФорму(ТЗСПР.Элемент.ТекущийЭлемент());

    и

    ОткрытьФорму(ТЗСПР.Элемент);

    в твоем случай одно и тоже — но Отладчик в замере улыбаться начинает)))

    но правильнее наверное так

    ОткрытьФорму(ТЗСПР.Элемент,,-1);

    Reply
  3. GSoft

    за идею +

    можно использовать при диначеской раздаче прав

    вот если сделать панель управления аналогичную справочникам — то цены этой вещи не будет

    Reply
  4. unpased

    🙂 я понял… доработаю… панель управления завтра сделаю!!! полюбому такая штуковина нужна !!!

    Reply
  5. GSoft

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

    Reply
  6. Ёпрст

    Ужас, если чесно..

    Вот штатно, такой же ужас:

    http://webfile.ru/3678243

    А вообще, перелопачивать весть справочник, и хранить его в ТЗ — зло..

    Загнётся на большом..

    Советую автору ознакомится с этим решением, например:

    http://rikcenter.ru/solutions.php

    скачать демку тут:

    http://rikcenter.ru/download/Demo_RiK.rar

    Reply
  7. Ёпрст

    +6 т.е переделать форму списка справочника через ТабличноеПоле, дерево групп отображать через АктивИкс, панель инструментов тоже, поставщиком для ТП — прямой запрос к БД..

    Reply
  8. vip

    (0) Пару ложек дегтя…

    Абсолютно нежизнеспособно при более-менее большом справочнике.

    Плюс транзакция на большом справочнике заставит остальных юзеров курить, пока заполняется ТЗ.

    А вот ТабличноеПоле из 1С++ для этих целей очень даже хорошо.

    Reply
  9. vip

    (6)(7) Тов. (г-н?) Ёпрст опередил, как всегда :))

    Reply
  10. Ёпрст

    Кстати, вот аналогичное решение, тут же :

    http://infostart.ru/projects/1905/

    Пользуемся поиском активнее!

    🙂

    (9) а как меня не называй, один хрен — Ёпрст биомать!

    🙂

    Reply
  11. asterisk

    Спасибо огромное за обработку, она мне очень помогла в работе

    Reply
  12. vitaliy.ermolenko

    (11) а подробнее можно?

    ато наверное люд недоумевает….

    Reply
  13. unpased

    я вначале след. недели все доработаю…

    дегать в жопу!!! 🙂

    оптимизирую все как надо!!!

    разработак подобных небыло!!!

    перелопатил все!!! все- гамно!!!

    уже сделал классную панель инструментов просто еще не выложил!!!

    Reply
  14. unpased

    А вот интересно… я искал… думал — уже же писал люд подобное…. и че…. ниче ваще ненашел!!!

    даже вот решение «супер» — http://infostart.ru/projects/1317/

    не смешите мои подковы!!! багов — туча!!!! плюсов — 17 (заметсте)!!!

    и все почемуто положительные О_О — за что????

    Reply
  15. unpased

    а это ваще что вымне суете ??? http://infostart.ru/projects/1905/

    как это стыкуется с моей разработкай???

    печать справочника….. причем сдесь вообще печать….

    читайте описание внимательнее люди!!!!

    Reply
  16. unpased

    Кстати динамическим — не буду делать, иначе смысла отбора и регулировки отображения нету…. попробую прямой отбор или компоненты 1C++

    Reply
  17. Ёпрст

    (15) Тук-тук… Там такое же отображение справочника в виде дерева — путём слива всего справочника в ТЗ и представление ТЗ в виде дерева… а для чего оно надо — для печати, либо для выбора — вот не пофиг ли ?

    Смотрите внимательнее что вам пишут — на больших ТЗ — моветон, как будешь динамически обновлять своё дерево ?

    Используй ТП + прямой запрос в качестве поставщика… Решение как у вас — мегатормоз, если что.

    Reply
  18. artbear

    Автор, отметь, что твое решение подойдет не для всех справочников, для больших, «толстых» справочников возможны приличные тормоза.

    Насчет транзакции тебе также сказали.

    ЗЫ и спокойнее воспринимай критику, тебе люди говорят, которые уже прошли через подобные проблемы с большими справочниками.

    Reply
  19. unpased

    вопщем попробовал несколько способов запроса справочника, тот что был — быстрый…

    если у когото есть конкретные предложения просьба выкладывать их ввиде предложений по доработке, а не рекламой на платные разработки!!!

    Платно — то за деньги!!!!

    Reply
  20. Ёпрст

    (19) Решение в (6) — бесплатно, т.е даром.

    Reply
  21. Ёпрст

    >>>Время заргузки элементов от 5 до 10 сек.!

    Издеваешься над юзверями ?

    Reply
  22. vip

    (19) вопщем автор не читатель, автор песатель.

    Т.к. не хочет слушать умных людей, то последняя фраза из его 13-го (5 строчка) поста абсолютно правильная.

    Только по отношению к его решению.

    Reply
  23. Ёпрст

    +21Это поди еще и не в разделенном режиме проверял ?

    🙂

    Reply
  24. unpased

    решение (6) — совершенно бесполезно для разработчиков!!!

    Это — пример… просто пример, я кстати на его базе собирал разработку как видишь!

    Reply
  25. unpased

    Умные люди!!! ну порекомендуйте решение отбора справочника в ТЗ быстро и надежно, как в 8…

    потому как в стандартное отображение справочника фильтры прикручивать ваще не вариант…

    а все что написано выше в каментах вами — водица!!! ну ничего конкретного!!!

    Reply
  26. vip

    (24) Это твое решение!!!

    Совершенно!!! Бесполезно!!!!!! Для кого угодно!!!!!!!!!!

    Кстати как видишь!!!!!!!!!!!!!!!!!!!!

    Reply
  27. vip

    (25) Единственное правильное решение — это ТабличноеПоле!!!!!

    А все остальное — водица!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Reply
  28. unpased

    >скачать демку тут:

    >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)}: Значение не представляет агрегатный объект (ТаймаутОбновления)

    Reply
  29. Ish_2

    (27) Увидел знакомые имена с восклицательными знаками , забрел на огонёк .

    Возможна ли при использовании Формекса реализация подхода :

    клик на заголовке каждой колонки в табличном поле активизирует меню возможных действий.

    Для 8 эта тема обсуждается http://infostart.ru/projects/4338

    Reply
  30. artbear

    (28) Автор,

    1. юзай последнюю версию 1С++

    2. Ты видел упоминание о том, что это вариант для Скуля?

    Reply
  31. vip

    (29) В FormEx нет ТабличногоПоля.

    Это класс 1С++. И в нем реализован перехват очень многих событий.

    В том числе и клик по заголовку.

    А что, в восьмерке это проблема?

    Reply
  32. Ish_2

    (31) Да , проблема. Событие «клик на заголовке» отсутствует.

    Приходится заниматься «программными извращениями».

    Эх.. не удалось уязвить.

    Reply
  33. vip

    (32) Если ты поплотнее изучишь возможности 1С++ и FormEx, желание уязвить плавно пропадет.

    Reply
  34. Ish_2

    (33) Поплотнее не удастся.

    Правда, некоторые подозрения по отношению к 8 появились.

    Reply
  35. unpased

    ну так там эта… с папки где демка библа грузится ведь

    Reply
  36. unpased

    а то что для SQL-то плохо!!! у мну SQL версии нигде не стоит 🙁

    Reply
  37. Abadonna

    >а то что для SQL-то плохо!!! у мну SQL версии нигде не стоит 🙁

    Вот именно это плохо и очень 😉 Лично я видал о одном месте и в определенной обуви дожидаться восстановления индексов после того, как в результате экспериментов базу уронишь… Поэтому даже и на отладке только скуль!

    Reply
  38. unpased

    блин, но если пользоватся классом 1С++, там я так понимаю ТабличноеПоле под скулю… это получится не универсально!!!

    да и фирмы у меня на дбф-е сидят 🙁

    Reply
  39. Sprite

    Справочник Контрагентов из 11 000 элементов — 20 секунд.

    Повеситься!

    Reply

Leave a Comment

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