Управление небольшим проектом в стиле Канбан (аналог Trello досок)




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

29 Comments

  1. aykcion@

    в бп 3.0 не работает

    Reply
  2. ardn

    (1) aykcion@, Конечно не работает, БП 3.0 вы запускаете в управляемом режиме, а эта обработка на обычных формах.

    Reply
  3. JohnyDeath

    Всегда радовал нездоровый интерес почти всех одинэсников написать свой собственный велосипед на 1С.

    Начинается всё с «перенумераторов» документов и заканчивается собственной системой баг-трекинга. Практически в любой средне-крупной конторе, где есть собственные программисты, имеется своя «База заявок». Зачем? Фор фан?

    Reply
  4. МимохожийОднако

    (3) JohnyDeath, почему «нездоровый»? Сам-то чем пользуешься? Или тебе это не надо. ИМХО, автор постарался. В любом случае, интересно в качестве примера.

    Reply
  5. dmt

    (3) JohnyDeath, 1С как единая точка входа довольно удобно.

    Заставить пользователей делать что-то в сторонней программе сложнее, чем допилить 1С.

    Reply
  6. vagipov

    (3) JohnyDeath,

    Полностью согласен, что велосипед.

    В организации есть и sharepoint и tfs, и более того к ним организовано подключение через 1с. Даже с инструментами на Trello организована какая-никакая связь. Но в любом случае для получения более детальной информации в них приходится переключаться. Для привыкших — легко. а вот для новых пользователей мало того что доступ надо организовывать, логины, пароли настраивать, так еще и обучать как в них работать.

    Прежде чем писать свое, я поискал на просторах инета да и инфостарта аналогичные обработки, но не нашел, поэтому и возник «нездоровый» интерес

    Reply
  7. vagipov

    (1) aykcion@,

    А для каких целей предполагаете использовать в Бухгалтерии 3.0

    В планах есть Перевести на управляемые.

    Могу держать в курсе

    Reply
  8. JohnyDeath

    (4) ИМХО, 1С не предназначена для таких вещей, как интерактивная работа с графикой. Для этого есть много более удобных инструментов (от github до kaiten).

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

    Автор безусловно постарался и как пример, наверное, очень интересно.

    Reply
  9. monkbest

    (3) JohnyDeath, придя на работу открываешь Outlook. открываешь 1С, открываешь sharePoint… и весь день щелкаешь между окошками с разными интерфейсами и принципами работы..

    1С имеет единую методологию работы с данными и единый внешний вид, что облегчает работу мозгу пользователя. Если уж основная корпоративная система на 1С, то туда все и надо пихать. Если основная система MS Office, то тут календарики и задачки в Outlook делай. Но единообразие — гуд.

    У меня вот на работе учет рабочего времени в 1С, а табеля мы сдаем в бухгалтерию через портал sharepoint. Каждый раз плююсь от того, что попадаю в недружественную среду.

    Reply
  10. monkbest

    Вопрос автору, в какой сущности (в каких метаданных) хранятся задачи, доски и связь задач с досками?

    Reply
  11. JohnyDeath

    (9) А зачем вы outlook открываете? Почему его не впихнули в 1С? Какой-нибудь фотошоп тоже в 1С будете пихать?

    Для разных задач подходят разные инструменты. И не надо пытаться впихнуть невпихуемое.

    Reply
  12. monkbest

    (11) JohnyDeath, все, что органично можно впихнуть в одно место. надо впихивать!

    Вы вот утрируете, а такой вопрос: если на предприятии ERP стоит от 1С, то хорошо ли ставить документооборот на SharePoint?

    Reply
  13. JohnyDeath

    (12) Я ж выше написал свое мнение — 1С не предназначена для интерактивной работы с картинками и прочими интерфейсными прелестями.

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

    Reply
  14. vagipov

    (10) monkbest,

    В данной обработке Доска — это таблица значений ячейками которой служат элементы «Структуры». По сути дела каждая карточка это отдельная структура со своим набором характеристик

    Наименование, дата время, Описание, Цвет, таблицы с комментариями и путями к вложению.

    Вносится изменение в карточку, обновляется структура, заносится в определенную ячейку таблицы.

    Сейчас думаю над тем как обеспечить многопользовательский доступ к таблице

    Пока пробую хранить ее в регистре сведений в виде «хранилища значений» смотреть кто и когда ее редактировал и обновлять форму табличного документа

    Reply
  15. monkbest

    (14) т.е. текущая версия не завязана на метаданных и каждый раз при открытии открывает пустую доску?

    Reply
  16. vagipov

    (15) monkbest,

    Не совсем верно

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

    Кроме стандартного механизма прописаны процедуры ручного сохранения доски на компьютер. По нажатию на кнопку [Доски] в левом верхнем углу, обработка сначала предлагает сохранить текущую таблицу в файл, а затем восстановить уже сохраненную таблицу из файла.

    Формат файла — это переведенная во внутреннюю строку структура с таблицей значения. Файл имеет расширение *.str

    Reply
  17. mulla1979

    Прикольно, а когда на управляемых планируете запилить?

    Reply
  18. vagipov

    (17) mulla1979,

    Сейчас планирую сделать ее многопользовательской и привязать к CRM думаю займет недели 2-3, а потом попробую на управляемые перенести

    А в какой конфигурации и для каких целей хотите использовать обработку?

    Reply
  19. mulla1979

    (18) мы тестируем взятую с ИС конфигурацию Service Desk FREE, хотелось бы для наглядности работы нашего ИТ отдела видеть такую штуку в данной конфигурации.

    Reply
  20. Fragster

    А я пока в процессе добавления в http://infostart.ru/public/556514/ интеграции с электронной почтой. Но зато драг-дроп работает уже сейчас 🙂

    Reply
  21. BlizD

    Еще один аналог канбан доски http://infostart.ru/public/552480/ и управление задачами.

    Reply
  22. madonov

    А мне понравилась реализация.

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

    Что касается функционала — не хватает автоматического сохранения и автоматической загрузки из файла при открытии. Кстати, думаю этот функционал можно без особых усилий спереть из типовой обработки «Консоль запросов» (обработчики ПриОткрытии, ПередЗакрытием).

    Reply
  23. vagipov

    (22)

    Благодарю за отзыв, Евгений.

    Автоматическое сохранение и загрузка реализованы уже в текущей версии через стандартный функционал Сохранения/Восстановления настроек

    Reply
  24. Makushimo

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

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

    По сути нужно все переписывать/дописывать заново.

    Reply
  25. omut

    Решение пригодно только в тех случаях, когда:

    1. Все сотрудники работают в одной и той же базе.

    2. ВСЕ сотрудники работают в 1С.

    3. Не требуется какой-то более продвинутый функционал.

    По этой причине в большинстве случаев проще использовать стороннее решение и интегрировать его в «привычную среду». Доска в 1С прикольно, но кто этой доской пользуется? Если только для своего отдела, то странно. Если для всех, то там будет куча вопросов по управлению проектами. Доска это только малая часть.

    Reply
  26. vagipov

    (24)

    Наоборот ) Можешь прикрутить ее к любой конфигурации.

    Я ее уже использую в конфигурации CRM

    Элементами карточек стали электронные письма

    Reply
  27. vagipov

    (25)

    С 1 и 2 пунктами полностью согласен. А вот по функциональности — это в любом случае вопрос «допиливания» функционала под конкретные нужды. В текущей реализации доработанная версия используется в отделе технической поддержкой для управления сроками ответов на вопросы пользователей.

    Reply
  28. omut

    (27)

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

    Ну да, ТП, пожалуй, самое то, раз там же CRM. Было очень интересно, как это завязано (если завязано) на работу сотрудников других отделов. Т.е. если ТП работает с «собственными» сотрудниками (не «внешние» клиенты), то было бы интересно заморочиться в сторону совместной работы. Потому что в данном варианте нет обратной связи (сами себе ведем план работ, сами себя контролируем). В таком разе весь функционал можно получить в любой другой «доске» и интегрировать в 1С только ее отображение. Т.е. тот же Документооборот может выдать нужный результат, редмайн опять же, да что угодно. Или не уловил фишку?

    Reply
  29. dj_serega

    (9)

    придя на работу открываешь Outlook. открываешь 1С, открываешь sharePoint…

    А если нужно создать собрание? Пилить в 1С? или может быстрее, удобней создать задачу в Аутглюке?

    Так что «все пихать в 1С» это не вариант. Можно конечно, но только если нечем заняться 😉

    Reply

Leave a Comment

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