Автозадачи




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

    На мой взгляд интересная разработка, относительно простая для понимания и полезная после внедрения.

    Reply
  2. genayo

    Сама идея далеко не нова, изюминка в использовании для всего этого СКД.

    Reply
  3. 1c-intelligence

    (2) у вас есть ссылки на материалы, где упомянута такая идея, или описана реализация?

    Не в качестве доказательства, просто интересно.

    На конференции партнеров мне говорили, что почти полный аналог есть в ДО 2 (если собрать там комплексное решение из нескольких инструментов).

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

    Reply
  4. 1c-intelligence

    (1) не сомневайтесь, она и правда очень простая и полезная.

    Я пользовался ей в реальном внедрении 3 года.

    Reply
  5. dock

    в демо базе поправьте режим совместимости интерфейса 🙂

    что-то вообще какая-то странная демо-база… вроде как все под УФ, а пришлось пошаманить для правильного запуска

    Reply
  6. 1c-intelligence

    (5) там все правильно вроде. Режим совместимости интерфейса такой же, как в УПП, в которой автозадачи разрабатывались изначально.

    Reply
  7. genayo

    (3) ДО2 это совсем другая тема, задачи там таки существуют как сущность и закрыться сами могут далеко не всегда.

    Относительно похожая подсистема есть в одной WMS родом из начала 2010-х, только там все кодом без СКД, и кроме рассылки почтой иных способов доставки «задач» нет. Ваша подсистема конечно гораздо более продвинутая и удобная.

    Reply
  8. 1c-intelligence

    (7) я видимо неправильно акцентировал внимание в публикации — здесь задачи тоже существуют как сущность. Это справочник.

    Reply
  9. genayo

    (8) Я имел в виду объект платформы Задача.

    Reply
  10. 1c-intelligence

    (9) Понятно. Ну это вроде не так важно.

    Reply
  11. genayo

    (10) Использование объектов задача — это скажем так более классический подход, и накладывает определенные ограничения на функциональность, в отличии от вашего решения.

    Reply
  12. 1c-intelligence

    (11) я за 12 лет несколько раз смотрел на ветку «Задачи» в дереве метаданных, но каждый раз что-то останавливало от их использования. Ну нет там ничего такого интересного, существенно выделяющего их на фоне справочников и документов.

    Возможно, это просто мертворожденный тип объектов метаданных. Равно как и железобетонные бизнес-процессы, карты которых рисуются в конфигураторе.

    Reply
  13. genayo

    (12) Вы видимо близко не смотрели ДО2, там все на задачах, бизнес-процессах и справочниках. И бизнес-процессы в конфигураторе там уже давно не рисуются, в последней версии даже сделана попытка обеспечить графический интерфейс создания новых бизнес-процессов в режиме предприятия.

    Кстати, сейчас ДО2 внедряется на Почте России, и по результатам внедрения обещают новую прорывную версию 🙂

    Reply
  14. 1c-intelligence

    (13) ладно, хрен с ними, с задачами этими 🙂

    Reply
  15. dock

    (6) да, всё верно. Просто уже привык к УФ (даже не к УФ, а Такси) и мои необоснованные ожидания были не оправданы….

    Reply
  16. EarlyBird

    У меня один вопрос: зачем конфигурацию и демо-базу выкладывать двумя разными архивами, почему не объединить в один?

    Они что, весят по гигу?

    Reply
  17. 1c-intelligence

    (16) даже не знаю, что ответить. Не мелькнула такая мысль в голове.

    Reply
  18. antoklio

    Получается, что на любую конфигурацию можно накатить? например, мне нужно на УТ10.3 и на Розницу 2.1.

    Reply
  19. 1c-intelligence

    (18) на УТ 10.3 и Розницу точно встанет.

    А вообще — да, на любую, кроме самописанных — там минут 10 рихтануть придется.

    Будут трудности — пишите.

    Reply
  20. 1c-intelligence

    Друзья, кто скачал, удалось попробовать сделать автозадачи?

    Трудности есть?

    Reply
  21. antoklio

    накатил на Розницу.

    При добавлении нового элемента в справочник «Параметры автозадач» ошибка преобразования данных ХДТО: НачалоСвойства: {http://v8.1 бла-бла -бла} settingsVariant

    Форма: Элемент

    Тип:{http://www.w3 бла-бла-бла}

    Версия Розницы 2.1.8.16, доработанная.

    Платформа 8.3.6.2237

    PS. Кажется, ошибка возникает в тонком клиенте. В Толстом нормально….

    Reply
  22. 1c-intelligence

    (21) да, так и должно быть — в тонком клиенте 8.3.6 нет конструктора схемы компоновки.

    Схемы рисуйте в толстом, сами задачи в тонком нормально работают.

    Reply
  23. romankoav

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

    Reply
  24. 1c-intelligence

    (23) обновил публикацию, дописал раздел про мою практику использования автозадач.

    Задавайте вопросы, буду рад ответить.

    Прям точный список дать не могу, т.к. у меня нет доступа к базе.

    Reply
  25. 1c-intelligence

    На днях, обсуждая развитие недавно начатого проекта flowcon, вспомнили про автозадачи.

    Похоже, найдется им место во флаконе, как одному из ответвлений — управлению задачами, которых еще нет.

    Когда задачи есть, как сущности, ими управлять не сложно. Об этом есть миллион программ и сервисов, типа redmine или JIRA.

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

    Спасаются, в основном, через KPI. Формула такая: я не могу прочитать этот блоб, оценю хотя бы его размер. Другими словами, не понимаю, что и как происходит и как этим управлять, поэтому буду смотреть на результат и оценивать его.

    Управлять в такой ситуации очень сложно, только эпизодически и вручную, или как крутой управленец — «мне не нравится ваш результат, работайте лучше! Повышайте эффективность!».

    Автозадачи это препятствие — отсутствие задач как сущностей — устраняют, и появляется шанс навести блестящую красоту.

    Поэтому автозадачи войдут во флакон — причешем их методически, перепишем на metadata.js, сделаем красивую морду, и пойдем мир завоевывать.

    Reply
  26. leemuar

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

    Начали с проверок, критичных для работы бизнеса. Потом постепенно добавляли менее «критичные» проверки. Первыми пользователями были представители бизнеса, позже хотим и службу поддержки подключить к автозадачам.

    Для непосредственно бизнес-пользователей (менеджеров) функционал удобен: вывели им форму на рабочий стол — и они все проблемы/задачи видят сразу. Не нужно строить 200 отчетов, не нужно искать нужный отчет — все в одном месте. Скорость добавления новых проверок теперь измеряется в минутах, а не часах и днях как при использовании «стандартных» отчетов

    Для разработчиков тоже довольно удобно — одним инструментом заменили множество отчетов.

    Естественно, дорабатываем под себя. Но в целом идеи, заложенные в фундаменте автозадач — отличные. Автозадачи позволяют быстро и с малыми затратами решать множество часто встречающихся проблем.

    P.S.

    Я часто объясняю принцип работы автозадач через игру Тетрис — в Тетрисе ты всегда видишь только свои ошибки, проблемы. Когда собираешь полную линию — она исчезает, оставляя тебя наедине с тем, что было сделано «неправильно»

    Reply
  27. leemuar

    (22) Эта ошибка появляется при открытии формы параметров автозадачи в тонком клиенте. Часто в тонком клиенте нужно просто посмотреть или отредактировать параметры автозадачи без редактирования СКД, запускать для этого толстый клиент неудобно.

    Мы это переработали: блокируем кнопку редактирования СКД в тонком клиенте и выводим надпись с инструкцией о том, что редактировать можно только в толстом клиенте

    Reply
  28. 1c-intelligence

    Скрестили несколько своих решений, помогли администратору БД 1С.

    Взяли Автозадачи, настроили на те механизмы, которые могут время от времени зависать или требовать внимания администратора.

    Сначала просто вывели ему автозадачи, но скучновато — надо же заходить и смотреть на них. А администратор БД — человек занятой, на месте не сидит.

    Потом вспомнили про диаграммы Flowcon (https://infostart.ru/public/907796/). Они же умеют не только графики выводить, но и любые данные в виде таблицы. А автозадачи — это, по сути, просто таблица, содержащая все необходимые данные.

    Ну и скрестили одно с другим. Автозадачи формируются сами, асинхронно, реагируя на появление проблем. Диаграммы сами, опять же асинхронно, подхватывают автозадачи и несут их в облако.

    А администратор просто заходит иногда в телефон и видит, надо ему бежать к компу, или нет.

    И все это — на бесплатных компонентах. Тру-ля-ля. Картинку приложил. Задачи еще и разукрашиваются, в зависимости от просрочки.

    Reply
  29. 1c-intelligence

    Так, все дружно ломимся читать и жарко плюсовать статью о практике применения автозадач.

    Reply
  30. leemuar

    Если у вас етсь интеграции через внешние SQL базы данных и ваша платформа умеет работать с внешними источниками данных — автозадачи отлично решают проблему, например, сверки данных внешнего источника с данными 1С: например, поиск незагруженных данных (отсутствующих в 1С), ошибки загрузку и т.п.

    Reply
  31. rush52

    Иван, пробую настраивать автозадачи.

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

    Так и должно быть?

    Reply
  32. 1c-intelligence

    (31) вероятно, у вас взведен флаг «Закрывать по окончании срока».

    Reply
  33. rush52

    (32) нет, флаг не стоит

    Reply
  34. 1c-intelligence

    (33) можете как-то показать элемент справочника «Параметры автозадач»? Скриншоты закладок или выгрузить, если на типовой работать будет.

    Reply
  35. rush52

    На типовой не будет, есть свой документ.

    Суть — проверка, чтобы у непроведенного заказа покупателя не было введенной на основании заявки на сборку.

    Запрос:

    ВЫБРАТЬ

    ИСТИНА КАК КлючЗадачи,

    ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,

    ЗаявкиНаСборку.Ссылка КАК ЗаявкаНаСборку,

    ПеремещениеТоваров.Ссылка КАК Перемещение,

    РеализацияТоваровУслуг.Ссылка КАК Реализация,

    1 КАК ТекущийОстаток,

    ЗаказПокупателя.Дата КАК ДатаЗаказа

    ИЗ

    Документ.стЗаявкаНаСборку КАК ЗаявкиНаСборку

    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров КАК ПеремещениеТоваров

    ПО (ПеремещениеТоваров.стЗаявкаНаСборку = ЗаявкиНаСборку.Ссылка)

    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя

    ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

    ПО (РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка)

    ПО ЗаявкиНаСборку.ДокументОснование = ЗаказПокупателя.Ссылка

    ГДЕ

    ЗаявкиНаСборку.Проведен

    И НЕ ЗаказПокупателя.Проведен

    И ЗаказПокупателя.Дата > &Дата

    Reply
  36. 1c-intelligence

    (35) черт его знает, странно как-то…

    Попробуйте ключ задачи числовым сделать, единичку например. Без отладки и только гадать могу.

    Reply
  37. rush52

    (36) Замена Истины на единичку помогло, спасибо)

    Reply
  38. romankoav

    (25) Ссылка на флакон не работает.

    Reply
  39. 1c-intelligence

    (38) да, это нормально. Тот флакон умер.

    Reply

Leave a Comment

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