Подсистема "Учет по доп. аналитике" (8.1)




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

40 Comments

  1. gutentag

    + за идею однозначный!

    Reply
  2. KukA.5

    Работа эта представлена здесь именно как ПОЛЕЗНАЯ ИДЕЯ — на основе такого подхода можно реализовать в принципе любой свой учет.

    Особенно удобно когда надо реализовать какой-нибудь оперативный дополнительный учет в программе «Бухгалтерия предприятия» (священная корова), и нужно ….чтобы ничего в ней не менять :). А то потом же самим ее обновлять каждый месяц 🙂

    Reply
  3. KukA.5

    (1) — спасибо… пока подправлял описание мне уже плюс влепили 🙂

    Reply
  4. anig99

    а свойства в типовых зачем даны? Прекрасно работает всё с ними. Зачем изобретать велосипед?

    Reply
  5. KukA.5

    (4) здесь сделано просто по другому. Считай что свойства продублированы нужными и гарантированно существующими в БД.

    Свойства пользователь может не создать, удалить и т.д.

    Reply
  6. e.kogan

    (4) Кстати, в БП свойств как раз нет.

    Автору: есть ли настраиваемая проверка обязательной заполненности реквизитов? Почему реализовано как регистр накопления, а не сведений? Как типизируется доп.реквизит? Есть ли настраиваемое разграничение прав на доп.реквизиты? И т.д.

    Reply
  7. so-quest

    Спасибо. Интересная идея

    Reply
  8. bonv

    (6) уже есть БП КОРП, скоро и в БП будет наверное.

    Reply
  9. Maxis

    Скоро будет редакция 2.0 Бухгалтерии Предприятия 8 — будут показывать на осеннем семинаре партнеров 1С в конце сентября

    Reply
  10. larisab

    Это идея обсуждалась здесь http://infostart.ru/blogs/1098/?p=2

    А пример ее решения http://www.infostart.ru/profile/9211/forum/9884/

    Укажите ссылки на настоящего автора идеи (Сергей Троицкий). Ваша только реализация с регистром накопления.

    Плюс поставлю после появления ссылок.

    Reply
  11. Boroda

    Формат второго файла .doc или какой? В чём открывать?

    Reply
  12. WiseSnake

    Имхо, неудобно потом в отчетах юзать.

    Вот еще посмотрите по этой теме http://infostart.ru/projects/4288/

    Reply
  13. KukA.5

    (10) идея эта у меня, по сути, от умнейших голов департамента разработок 1С-Рарус. Я в свое время как сотрудник этой Великой компании делал задание «дополнительные реквизиты к шапке и табличным частям и работа с ними» — задача стояла такая: насколько убивается производительность с помощью такого подхода. Задача была мне выдана Гавриловым Володей (толковый программист и руководитель проектов, мой непосредстсвенный начальник в то время).

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

    (11) — да ворд 2003 (неужели слетело расширение файла?)

    Reply
  14. larisab

    (13) Простите, не поверю, я сравнила обе разработки, отличия очень маленькие, код чуть другой, регистр накопления добавлен. Все остальные объекты от Троицкого. ИДЕЯ его, исполнение в виде примера — его, вы придали более-менее пользовательский вид. Ссылку поместите обязательно, это просто неприлично, автор и так ПОДАРИЛ ИДЕЮ всем, вы же её присвиваете, это просто отвратительно. Жаль, автора нет…

    Reply
  15. larisab

    + 14 на сайте

    Reply
  16. Gilev.Vyacheslav

    (14) да успокойся, не надоелу «правду» искать

    лично я вполне допускаю, что правильные идеи могут прийти нескольким людям (пусть и не однорвременно)

    Reply
  17. Gilev.Vyacheslav

    (1) а чем тебе просто реквизиты документа не нравяться?

    Reply
  18. larisab

    Да и правда, зачем оно мне, уже успокоилась 🙂

    Reply
  19. NeeDiGeo

    Подобный функционал реализован в таких ПП как Инталев: Корпоративный менеджмент. Там это называется дополнительные свойства. Которые можно привязать к справочникам и документам. Кстати реализован через ПВХ, пару справочников и регистр сведений, в котором значения и хранятся. На эти доп.свойства обычно много завязывается при настройке бюджетной модели. Посмотрим как автор это реализовал.

    Reply
  20. lustin

    идея увести специфические данные для конкретного предприятия «наверх» обсуждается давно

    будь то доп.аналитика (как вы это называете), ДопРеквизиты или еще как то

    еще 2 года назад я в «production» использовал такую подсистему и не раз

    на сегодняшний момент развитие этой подсистемы выглядит так

    http://infostart.ru/blogs/601/

    так что согласен — идея одна и пришла во многие головы

    реализация разная

    Reply
  21. KukA.5

    (18) larisab, я ничего не знал ранее о вашем друге и его идеях и его работах на эту тему… да я и о сайте об этом узнал не так давно.

    …и вообще я писатель, а не читатель 🙂 Мне проще (и интереснее) придумать, чем перереализовывать чужое.

    Если речь идет об ИДЕЕ — оцените ее, если речь идет о РЕАЛИЗАЦИИ идеи — оцените ее….

    larisab — от Вас плюс (или минус), однозначно!

    Reply
  22. larisab

    (21) Да не друг, просто я читала ту ветку, и когда увидела вашу разработку, показалось знакомо, там идея была в подписке на события, понятно, что в воздухе носилось, но глаз резануло, пошла сравнивать и… сами посмотрите…

    Мне как раз-то понравилось и я с удовольствием плюсану, но дайте ссылку на аналог, а то… «новый инфостарт»…

    Reply
  23. KukA.5

    (22) по просьбе (уверен очаровательной) larisab не привожу ссылку (которая уже и так была в обсуждении) 🙂

    Мне понравился вопрос, заданный однажды знатокам «Что? Где? Когда?»: с какими геометрическими объектоми можно сравнить мысли умных людей? (как то так звучало, точно не помню)

    Ответ был такой: прямые линии (умные люди думают одинаково)

    У нас пример паралельных линий :), не пересекающихся

    Жду от larisab плюса! 🙂

    Мне он будет особенно приятен.

    Reply
  24. larisab

    Ставлю. По причине «какое удовольствие от принципов, если их не нарушать» (с) Э-М. Ремарк. Вам того же пожелаю 🙂

    Reply
  25. chang

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

    Reply
  26. KukA.5

    (25) сделай свой интерфейс — делов то… а еще можно сделать в объекте кнопочку (и тоже ее программно добавить) — открывается с отбором по GUID. Кнопка «История этого объекта»

    Reply
  27. KukA.5

    26 — это по другой теме я писал 🙂

    Reply
  28. СветикК

    Спасибо за статью точно также мне пришлось делать года три назад….

    регистр сведений и строчка(гиперссылка) в документе… «Детализация», работает на ура,

    Reply
  29. rasswet

    на регистрах сведений или таки накопления? плюсанул за описание.

    Reply
  30. alex4x

    Чем отличается от реализованных в Инталеве «КФ» дополнительных свойств ?

    Reply
  31. KukA.5

    Я просто не знаю как реализованы доп свойства в Инталев — чем отличаеются не смогу ответить..

    Reply
  32. wirg

    можно вести учет по проектам, категориям и свойствам и платить 3000рублей не нужно.

    Reply
  33. WKBAPKA

    идея далеко не новая… учет по дополнительным свойствам уже давно реализован в том же КУБиКе: http://infostart.ru/public/56988/

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

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

    Reply
  34. WKBAPKA

    2(10): этой идее уже 100 лет. Еще у Инталева в их Корпоративных финансах на 7.7 использовалось. 😉

    Reply
  35. larisab

    (34) Причем тут 77?

    Reply
  36. WKBAPKA

    при том, что этой идее уже лет 6 без малого

    Reply
  37. KukA.5

    для support:

    Дорджи, можно как то избавить меня от преследований этой «озабоченной» larisab_Ы?

    Ниже скриншот типа «я забираю мои игрушки, и ты не писяй в мой горшок» 😀 — в детский сад превращает инфостарт

    Reply
  38. poppy

    (37) А в чем проблема? Тебе поставили минус. Не просто минус, а минус на ранее поставленный плюс. Т.е. нуль.

    Что в этом такого?

    Reply
  39. larisab

    (38) Именно так 🙂

    Reply
  40. KukA.5

    Подсистема снова в свободном скачивании.

    Надеюсь эта конфигурация более полезна, чем тупые комментарии, забивающие мою ветку (и Инфостарт в целом) мусором из амбиций и самодовольной глупости…

    Reply

Leave a Comment

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