Data Commander 2.4 Универсальная обработка данных




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

28 Comments

  1. Alex1Cnic

    Идея интресная, надо прощупать…

    Reply
  2. Yashazz

    И попёрли коммандеры один за другим… Это хоть интереснее и полезнее, чем просто два дерева справочника.

    Reply
  3. b1958

    А что, может быть даже как-то и удастся использовать эту обработку.

    Правда, сейчас все более актуальными становятся обработки на управляемых формах.

    Reply
  4. WalterMort

    Для управляемых форм уже в разработке.

    Reply
  5. alex_bob

    Начал смотреть. Добавляю источник данных Запрос COM82. Выбрал серверную базу и хопа — под имя кластера всего 10 символов. Сделайте побольше, чтобы можно было вводить имя кластера в формате XXX.XXX.XXX.XXX:YYYYY, где ХХХ — IP-адрес сервера, YYYYY — номер порта.

    И главное — справка нужна более развернутая. Чувствую, обработка многое может, но пока не догоняю, что надо делать. Скорее всего нужен какой-то демо пример в картинках.

    Reply
  6. WalterMort

    (5) Справку пишу, скорее не справку, а примеры использования в разных задачах, скриншоты и т.п. Планирую справку и ряд корректировок внести сегодня вечером/завтра утром.

    Reply
  7. WalterMort

    +(6) В смысле, выложить.

    Reply
  8. kauksi

    полезная вроде штука…

    Вытащил две таблицы: из локальной базы и из Com

    как теперь их сравнить?

    Reply
  9. WalterMort

    (8) Сравнения в текущей версии нет. Вообще был такой модуль, но много нюансов с этим сравнением, пока отложил. Может включу в ближайшее время и его.

    Reply
  10. Smoke23

    Не работает на версии 1С 8.2 (Управление торговлей для Украины 3.0)

    Reply
  11. andpyxa

    Ждём полезных примеров использования. Будут?

    Reply
  12. ardn

    Как дела с вариантом под управляемые формы?

    Reply
  13. bandru

    Умеет копировать справочники вместе с подчиненными? Например, контрагентами

    Reply
  14. AlexO

    (0) ограничение на ввод имени сервера — 10 символов всего.

    Если и остальное также сделано…

    Reply
  15. AlexO

    «Слияние. В комментах раскрою подробнее, если кто не понял.»

    я не понял. И в каких комментах-то?

    Описания нет, что и как делать — нужно догадаться…

    В каких форматах, что вводить — непонятно.

    Что получим в итоге — неясно…

    Я потнимаю, что «для себя писал». Но посмотрим, как сам вспомнишь, как работает, через пару лет ))

    Reply
  16. AlexO

    (11) andpyxa,

    Ждём полезных примеров использования. Будут?

    Видимо, уже нет. Автор потерял интерес к своему коммандеру??

    Reply
  17. WalterMort

    Ну вот. Не прошло и полгода (а год) как публикую примеры + внес несколько исправлений.

    В архиве всё лежит, можно качать.

    Reply
  18. WalterMort

    (14) AlexO, а точнее? В каком источнике данных?

    Reply
  19. WalterMort

    (12) активно продвигается.

    Reply
  20. serg__k

    Уважаемый автор

    Есть ли новые доработки по Вашей разработке? Особенно интересует направление упр. приложения

    Reply
  21. WalterMort

    (20) Обработка уже готова в основной функциональности. Постоянно откладываю, довожу по мелочи. Думаю выложу как есть на этой неделе, иначе никогда не соберусь.

    Reply
  22. AlexO

    (18) Я про источник не писал ничего. Просто ограничение в 10 символов на имя сервера — мало.

    (21) И? неделя-то прошла ))

    А вообще — нормальная загрузка.

    Чуть добавить универсальности (и наглядности, что-куда-какие данные попадают) — и вообще можно как рыбу использовать для своих загрузок.

    Reply
  23. AlexO

    (0) да, кстати, можно примеры отдельно в комментариях выложить — чтобы не перекачивать заново?

    Reply
  24. WalterMort

    До выпуска DataCommander 3 (УФ) остались считанные дни.

    +10000 строк написаны, проверены и оформлены.

    Возможности — отвал башки. (xls во внутреннюю таблицу запроса — я делаю это каждый день)

    Три года использовалось и собирался опыт в процессе внедрения в ряде крупных компаний.

    Будет круто!

    Полный функционал на момент выхода будет абсолютно бесплатен.

    Для состоятельных профессионалов будет GOLD версия.

    Reply
  25. Filipp_inf

    Добрый день!

    Обработку скачала.

    Понравилось.

    В начально версии DataCommander.epf нареканий нет, все работает.

    А вот в версиях DataCommander23 и DataCommander24 при «ИсточникДанных- ПрикладнойОбъект -Справочники-Конкретный Справочник» — объект-папка появляется в дереве, но стоит попытаться открыть эту папку для просмотра элементов -появляется сообщение :»Ошибка при установке значения атрибута контекста (Данные),

    и далее при подробном просмотре ошибки » {ВнешняяОбработка.DataCommander24.Форма.ИД_ПрикладнойОбъект.Форма(263)}: Ошибка при установке значения атрибута контекста (Данные)

    Колонка.Данные = Поле.Имя;

    по причине:

    Недопустимое значение

    »

    Если игнорировать сообщение, в табличном поле появляется список элементов выбранного справочника с пустым текстом в колонке «Имя предопределенных данных».

    Конфигурация типовая Розница 2.2

    1с 8.3 (8.3.9.2003) в режиме запуска /RunModeOrdinaryApplication.

    Затем при выборе этих пустых строк открывается как обычно форма элемента.

    Т.Е. элементы есть, просто не видно их наименование.

    С документами такого явления нет.

    Заранее благодарю за ответ.

    Reply
  26. WalterMort

    (25) Спасибо за отзыв. Залил версию с исправлением v2.4.1. Скачайте архив заново.

    Reply
  27. Filipp_inf

    Скачала обновленную версию, все прекрасно!

    Большое спасибо и признательность автору !!!!

    Reply
  28. WalterMort

    Свершилось!

    Вышел Data Commander 3.0 (УФ, полностью поддерживает отказ от модальности)

    Скачайте бесплатную Lite версию здесь: http://infostart.ru/public/635478/

    Reply

Leave a Comment

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