Универсальная внешняя форма документа/справочника. Свободный вариант.




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

35 Comments

  1. cleaner_it

    Если проверки на уровне объекта (документа/справочника), то «… без обработки системой этого изменения …» не совсем верно. А сама идея хороша. Регистры еще добавьте для просмотра:)

    Reply
  2. chmod660

    (1) да,я немного некорректно сформулировал. спасибо, поправлю.

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

    Reply
  3. boy13

    мою идею перехватил? >8-[ http://infostart.ru/public/64362/

    Reply
  4. boy13

    еще и плюсов больше нахватал… вообще непорядок!

    Reply
  5. Арчибальд

    (3,4) Идеи не патентуются 😎

    Reply
  6. Поручик

    (2) Нормально. За открытый код плюс.

    Reply
  7. Abadonna

    (5)

    Идеи не патентуются

    Почему не патентуются? Абсолютно точно знаю, на Западе один мэн запатентовал такую идею:

    1. При помощи спецдатчиков во время съемок с актера снимаются эмоции

    2. При просмотре при помощи спецдатчиков они траслируются на зрителя.

    Техническое воплощение пока невозможно, но идея уже запатентована

    Reply
  8. Поручик

    В чём проблемы? Я здесь тоже одну идею и готовую подсистему позаимстовал и развил дальше. Кому от этого плохо стало? Мои работы тоже заимствовали, в том числе и для phpbb.

    Reply
  9. Арчибальд

    (7) Скорее всего, зарегистрирована формула будущего изобретения. Типа «организация хранения шоу, отличающаяся тем, что передача эмоций осуществляется напрямую от актера к устройству записи и от устройства записи к потребителю …»

    Reply
  10. larisab

    На самом деле, самое ценное, это идеи. Много раз видела — закодить могут, что хочешь, но ЧТО, за пределами сознания. Консультанты — бывшие бушки тоже хрень придумывают, например четырехуровневые субсчета, не имея понятия о маске кода, применямой в конфигурации.

    Так что — руки прочь от идей! Или ссылку, как в данном случае. 🙂

    Reply
  11. larisab

    (9) а ты не читал, как снимали Аватар?

    Reply
  12. chmod660

    (3) да, и я честно сослался на вашу работу в описании.

    идея-то лежит на поверхности — самому пришлось недавно удалять пустую строку из скрытой табличной части документа. в процессе и подумалось — что «универсальный подбор и обработка» от 1С умеет работать с реквизитами, а с табличными частями — напрямую нет.

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

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

    Reply
  13. chmod660

    (7) патентное законодательство различное в разных странах. в США можно патентовать идеи (например, шоу «Кто хочет стать миллионером», сериалы). в Украине и России (не знаю насчет всей Европы) — нельзя.

    Reply
  14. chmod660

    (11) вы про датчики на актере?

    вроде даже во «Властелине колец» так Горлума делали.

    Reply
  15. Abadonna

    (3)

    мою идею перехватил?

    Если говорить об идее, то она настолько давно была в 77 реализована, что может тебе тогда и было boy, 13 лет 😉

    Reply
  16. lazy

    Ой, а я как раз собирался написать такого зверя! Спасибо, что сэкономили мне время! )))

    Reply
  17. scape

    (3) Идея витала в воздухе. А закрытый код это фу… Еще цену назначь. 👿

    Автору спасибо. Сэкономил время. И открытый код позволит внести изменения, если что…

    Еще и копирайт в модуле формы повеселил. На него, наверно, больше времени потратил чем на разработку. 😀

    Reply
  18. alexk-is

    (0) Не ругаюсь, так советую в плане развития…

    1. Выводить не имена полей, а их синонимы

    2. Добавить проведение

    3. Добавить реквизиты Дата и Номер

    Reply
  19. chmod660

    (16), (17) очень рад, что оказался полезным

    Reply
  20. chmod660

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

    Текст взял с Википедии

    (18) спасибо за подсказки, обновил обработку.

    Reply
  21. cleaner_it

    Настолько нужная вещь — еще один плюс поставил-бы на обе разработки не думая:) Спасибо авторам!

    Reply
  22. chmod660

    (22)

    Спасибо за ваш отзыв! Очень приятно.

    (сам пользуюсь чуть не каждый день : )

    Reply
  23. Alias

    Постоянно во всех аналогичных обработках забывают про несколько весьма важных возможности:

    1. Редактирование данных, хранящихся в ХранилищеЗначения.

    Возьмём, скажем, Консолидацию — там все настройки в Хранилищах.

    Получить хранилище, проверить его тип на примитивные (таблица значений, дерево, список, массив) — и вывести для редактирования в отдельну форму. Просто.

    2. Возможность отобразить тип хранимых данных. Сейчас для того чтобы понять пустое значение какого типа в реквизите, нужно нажимать три точки и пытаться понять что за форма выбора открылась. Чтобы понять какие вообще типы может принимать реквизит (составного типа) приходится очищать поле и нажимать кнопку «т»(выбора типа)

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

    Для себя постоянно приходится дорабатывать такой небольшой, но нужный функционал.

    Reply
  24. Поручик

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

    Reply
  25. chmod660

    (24) типы добавить вообще без проблем, действительно не подумал.

    Редактировать данные хранилища дольше, но тоже непременно добавлю.

    Большое вам спасибо за подсказки 🙂

    Reply
  26. Alias

    (25) Зачем изобретать велосипед? Пока мне достаточно взять любую существующую обработку и внести в неё соответствующие изменения. Что я, собственно, и делаю когда встречаю обработку лучше той, которой пользуюсь в настоящее время.

    Сюда свои разработки постить не привык… Но тот же функционал открытия Хранилищ кому-то уже посылал письмом для включения.

    Я свой комментарий написал не для того чтобы сказать «а я могу и лучше» 🙂 Я-то может могу, опыта хватает, да вот не хватает времени… доработать существующую обработку быстрее чем писать свою.

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

    Reply
  27. cas1611

    Спасибо! Сэкономил время, не пришлось писать свою. Очень понравилась, всем рекомендую.

    Reply
  28. d0dger

    Небольшая рюшечка — колонка типа значения должна быть только просмотр…

    Reply
  29. eeeio

    Отличная вещь. Плюсанул. Совет: иногда может пригодиться кнопка «Открыть основную форму».

    Reply
  30. chmod660

    (30) спасибо!

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

    Reply
  31. kiv2008

    очень хорошая, попалась в нужное время

    Reply
  32. Bylka

    Жаль нельзя приминить для списка однотипных объектов ‘Справочник’ или для элементов группы.

    Reply
  33. chmod660

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

    Reply
  34. Stradivari

    Отлично, вовремя попалась)

    Reply
  35. chmod660

    (35) Stradivari, рекомендую вам

    http://infostart.ru/public/145611/

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

    Reply

Leave a Comment

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