Новая версия (1.6)! Электронный каталог продукции с возможностью создания из 1с.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

50 Comments

  1. Душелов

    А скрин покрупнее низя?

    Reply
  2. DGorgoN

    (1) Идет?

    Reply
  3. Душелов

    При редактировании на закладке «Картинки» можно добавить картинку, они будут с первьюшками 😉

    Reply
  4. DGorgoN

    Уже думал над этим — пока так. картинки будут в следующей версии

    Reply
  5. DGorgoN

    Главное что-бы спросом пользовалось — а то не плюсика, не комментария..

    Reply
  6. cs25

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

    Reply
  7. DGorgoN

    Спасибо добрым людям! Значит хоть кому то да надо 🙂 буду развивать.

    Reply
  8. mdzen

    Нравится! Идея хорошая… Развивай…

    Reply
  9. wirg

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

    Reply
  10. DGorgoN

    (9) Уже начато — к тому же запуск 1с с флехи противоречит лицензионному законодательству.

    Сегодня доделал пару вещей. Возможно к концу недели будет еще одни релиз.

    Reply
  11. Душелов

    Советую еще сделать оле-обмен с типовыми конфигурациями, а еще лучше правила конвертации данных 😉

    Reply
  12. DGorgoN

    (11) А оле зачем? там же Выгрузка/Загрузка есть через xml

    Reply
  13. DGorgoN

    +(12) В плане как её прикрутить..

    Reply
  14. Душелов

    (13) А еще можно данные хранить в Accessовском файле (с которым каталог и будет работать), и читать/писать его напрямую из 1С-ки. Т.е. прям из 1С создавать каталог «под ключ» с передачей его клиентам. А еще добавить возможность автоматического заказа, получения остатков, состояния своих заказов через веб-сервисы и по эл.почте… 😉

    Reply
  15. Душелов

    ************* Текст исключения **************

    System.NullReferenceException: В экземпляре объекта не задана ссылка на объект.

    в xfb0eb36a3ee612fb.x40e6f36d5c51987b.x5b749607edfd2c9a(Object xe0292b9ed559da7d, EventArgs xfbf34718e704c6bc)

    в System.Windows.Forms.Control.OnClick(EventArgs e)

    в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

    в System.Windows.Forms.Control.WndProc(Message& m)

    в System.Windows.Forms.DataGridView.WndProc(Message& m)

    в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

    в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

    в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    😉

    Reply
  16. Душелов

    И не запоминает настройки и положения окон, панелей инструментов 🙂

    Reply
  17. Душелов

    …хотя winforms ui это по-умолчанию делает 🙂

    Reply
  18. DGorgoN

    (17) О у меня вываливал ошибку — теперь понял почему и докрутил уже.

    (15) А это где?

    (14) дык оно же изночально в xml базу все выкручивается. Асес — не есть гуд, лучше mssql compact..

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

    Reply
  19. DGorgoN

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

    Reply
  20. Душелов

    (18) Закрыл окно какой-то и щелкнул мышкой ниже датагридвью, где не было стро 😉

    Можно и скуль, без разницы.

    А то, что проще сваять обработку, которая будет работать с БД твоего каталога через АДО. Без всяких нажатий «импорт/экспорт». хмл оставить можно, даже нужно, но зачем делать лишние действия? Когда ты программной из 1Сы сможешь сформировать нужный каталог для клиента с теми данными, к примеру, на которые он по условиям договора может рассчитывать, и автоматом отослать ему по почте.

    Reply
  21. Душелов

    А если еще у себя на сервере в 1С-е вебсервисы поднимешь, чтобы клиенты могли в онлайне обновлять каталог данных, остатки и делать заказы… ;))

    Reply
  22. DGorgoN

    (20) Вообще идея такая — из справочника напрямую каталог делаешь, в т.ч. и на диск его закатываешь. Щёлк из 1с-са и готово..

    Соответственно компонент для автоматического обновления каталога на сайте тоже будет разработан — не все так быстро 🙂

    Reply
  23. Душелов

    А, типа запуск экзешника с ключами, с передачей в качестве параметра файла хмл 🙂

    Reply
  24. DGorgoN

    (23) Дык там xml просто в каталог с программой копируется и все. Командной строки не делал — а зачем это? 🙂

    Reply
  25. DGorgoN

    За внимание спасибо

    Reply
  26. DGorgoN

    Хотя тоже идея, буду учитывать в следующей версии

    Reply
  27. Душелов

    а если еще сделать что-то типа маленького конфигуратора 😉 для добавления полей…. :)))

    Reply
  28. DGorgoN

    (27) у.. как растут наши аппетиты 🙂 Сам думал — к сожалению времени свободного нету — был бы студентом, а так — уже вплотную занятся конкуренцией 1с-са — вот толкьо кому оно надо будет? Ананас вон загибается

    Зы — там можно свои поля добавлять, т.е. количество полей в табличной части справочника и табличная часть свойств не задана жестко — ты можешь хоть 20 артикулов добавить и 2000 свойств 🙂

    Reply
  29. DGorgoN

    (27) Хотя если хочешь — можно объединить усилия 😉 Как то давно я подбивал гепарда на такое, но он не согласился..

    Reply
  30. DGorgoN

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

    Reply
  31. Душелов

    (28) Это не оттуда. Я подобное делал для клиентов-сервисных центров, которые заказывали запчасти у нас. А вебинтерфейс им не подходил из-за никакого интернета в регионах.

    Ну если не жестко, то скуль компакт лучше всего + порт на кпк 😉

    Reply
  32. Душелов

    (29) Это уже вполне нормальный коммерческий продукт получится 🙂

    Reply
  33. DGorgoN

    (32) Я серьёзно — если есть желание, алга определимся — подберем команду (иили сами — 2 человека все же это уже сила) и вперед.. 🙂 Сам давно уже мечтаю об этом.

    Reply
  34. Душелов

    (33) Если создавать этот «каталог», то время на это выкроить можно.

    А если что-то серьезнее, то вряд ли 🙂 Я тут наблюдаю за проектом http://nsgsoft.ru/production_framework.html — франч свой продукт сделал, аналог 1С-ы…

    Reply
  35. DGorgoN

    (34) Не, не каталог, именно то что в nsg — по типу того

    Reply
  36. DGorgoN

    Только полноценная среда — без студии, непосредственно из самой же себя компилирует. ст-ноо с возможностью портации из 1с, естественно в возможностью оптимизации и вставок кода на с#

    Reply
  37. Душелов

    Портация из 1С чего?

    Reply
  38. DGorgoN

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

    Reply
  39. Душелов

    (38) Очередной «убийца 1С»? 🙂 Это как минимум все объекты 1С должны быть сделаны аналогичные 😉 Что-то примерно, что я делаю в своем компиляторе…

    Reply
  40. DGorgoN

    (39) Совершенно верно. В этот и схожесть. Поэтому и предложил объединить усилия. Я даже очень много продумал — так сказать концепцию продумал продукта. Все объекты 1с портировать не обязательно — достаточно создать 3 своих: список, документ и регистр. А уже наследованием создавать справочники, перечисления, документы и т.п. Но это уже тема сторонная — стукнись в аську завтра если интересно

    Reply
  41. DGorgoN

    Или на мыло

    Reply
  42. DGorgoN

    А то контакты у тебя в личке недоступны

    Reply
  43. Душелов

    (42) Аська доступна 🙂

    Reply
  44. DGorgoN

    (43) Контактная информация недоступна. — не увидел тама аськи

    Reply
  45. danio

    +1 Отличная вещь!!!

    Но обнаружен косячок — когда отбираешь товар в заказ и нажимаешь Отмена (Cancel) товар все равно попадает в заказ. И еще, изменяя количество товара уже в заказе — сумма по строке не изменяется 🙁

    Reply
  46. DGorgoN

    (45) Над этими багами я работаю, приболел немного 🙁

    Reply
  47. BorisBelov

    Автор! Ау-у-у! Судя по дате последнего комментария Вы где-то далеко. Хотелось бы пообщаться, на всякий случай borisbelov48@mail.ru

    Reply
  48. 1C-CHIP

    хорошая вещь, а на ут11 планируется?

    Reply
  49. Иваныч

    Остатки как просмотреть?

    Reply
  50. 1C-CHIP

    а на ут11 планируется?

    Reply

Leave a Comment

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