[IMAGE] Шоу "За лупой" (просмотр и установка привязки товар-изображение)




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

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

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

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

66 Comments

  1. Abadonna

    Серега, за название +1000 :)))))))))))))))))))))))))))

    Reply ↓
  2. mdzen

    За название +.

    Reply ↓
  3. vip

    Не, название можно сделать еще однозначней.

    Просмотр и установка привязки товар-изображение (за лупой).

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

    Reply ↓
  4. vasilykushnir

    Прочитал название — хохотнул…

    Reply ↓
  5. Shaman100M

    А где кнопка с лупой? 🙂 +1

    Можно бы расширить список форматов, не только .jpg

    Reply ↓
  6. andrewalexk

    🙂

    для бесплатного — неплохо

    для «за 1000р» — дерьмо

    Reply ↓
  7. CheBurator

    (5) бесплатно, т.е. ДАРОМ — то что есть.

    (6) скажем так — я не видел аналогичного ни за за 2000 руб., ни за 500, ни за 1000…

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

    Reply ↓
  8. JohnyDeath

    да ладно тебе Че. как нет аналогов??? Если ты имеешь ввиду способ идентификации картинки по элементу, то да, конечно.

    Такой подход не прокатит для УРБД и иже сним. Там картинки должны хранится в самой базе. Есть несколько компонент, которые реализуют это (абсолютно бесплатно)

    Reply ↓
  9. CheBurator

    (8) Почему это для УРБД картинки должны храниться в базе? не вижу необходимости в этом…

    Единственное, при сливе картинок из филиалов надо обеспечить уникальность имен файлов для каждого филиала — добавляем в имя файла префикс ИБ

    ..и вообще — там где есть УРБД, как правило, есть свой программер — эта обработка (если он ее заюзает) — будет только как «мясо», а не как готовый бифштекс…

    Reply ↓
  10. JohnyDeath

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

    Reply ↓
  11. CheBurator

    (10) читаем выше

    «Несколько лично моих постулатов:

    — изображения товаров не являются необходимым условием торговли/учета товаров;»

    ..поэтому нефиг их гонять туда-сюда… там где надо — ну и пусть лежат в филиалах… нафига они в центре?

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

    Reply ↓
  12. Shaman100M

    (10),(11) унутри не надо. Обмен «снаружи» можно сделать проще, исходя из того, что «цеплять» к базе картинки не нужно — они должны просто быть в наличии в каталоге, обработка их сама найдет, т.е. решение — синхронизировать удаленные каталоги с «превосходством» центрального.

    — шлем из центра обновленные и новые с командой «замещать все»

    — шлем обратно с периферии с командой «замещать старые».

    Ну, а чтобы каждый раз не перебирать все файлы каталога, а по номенклатуре их м.б. много — можно в маску имени добавить формат даты, и перебирать с маской «???????»+ТекущаяДата(), соответственно, для перебора «имиджей» одной номенклатуры используем уже маску на дату.

    Reply ↓
  13. CheBurator

    (12) Ну и я про то же — докрутить как нужно самому…

    Reply ↓
  14. Abadonna

    (6) не обижай Серегу, он хороший……. девелопер 😉

    Reply ↓
  15. CheBurator

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

    Reply ↓
  16. Abadonna

    blow job for image назови, еще плюс поставлю

    Reply ↓
  17. vip

    (15) Да как бы помягче — обыкновенно.

    А вот хранить картинки в базе это интереснее. Задача несложная, но эффектная.

    Reply ↓
  18. Abadonna

    А Чебур спец из обычного сделать тоже обычное, но не очень. Андрей, мы с тобой механики (!), а с Чебуром мы горнолыжники (!).

    Reply ↓
  19. CheBurator

    (16) Так именно я ж и сделал — именно чтоб обыкновенно, без выкрутасов, по принципу «поставил — юзай»… сегодня положу еще и РМ сборщика, для которого эта прога собственно является подготовителоьной, как я это упоминал…

    картинки в базе хранить — да, интересно, решаемо… но смысл… — база рухнет — рухнут и картинки.. а так — вот они… отдельно лежат… бэкапы же до сих пор не все делают…

    Reply ↓
  20. Abadonna

    А за постоянный топик с Чебура отказ от Far-а ;)))

    Reply ↓
  21. Abadonna

    Я тебя тОплю, все время вверху, кричи «грехи осознал, буду юзать Тотал и плагин к нему Абадонновский» 😉

    Reply ↓
  22. mdzen

    (16)(20) Пробовали уже хранить в базе.

    1. База пухнет до невообразимых размеров, тем более если к номенклатуре 2 и более картинок привинчены.

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

    Reply ↓
  23. JohnyDeath

    >база рухнула считай пропало

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

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

    Отвечу вашими же методами: а вдруг каталог с картинками упадёт? а у вас нет их бэкапов? что тогда? )))

    Reply ↓
  24. mdzen

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

    Reply ↓
  25. mdzen

    Тогда просто вместо картинки типа «NO Photo. Sorry!». Хе-хе

    Reply ↓
  26. vip

    (22) Это смотря КАКИЕ картинки и смотря КАК хранить.

    Сдуру можно и [вырезано цензурой] сломать.

    Reply ↓
  27. Abadonna

    Ну бросте вы. Что касается элементанраных действий, Чебур всегда молодец. У него проколов не бывает. Он самый лучший девелопер и самый лучший beta-tester из всех, мне знакомых. Far его погубит, а так он находится под протекцией Abadonna, если трогать — начинать с меня! Беру Чеба под своё крыло, кто (хотел ведь напписать!) недооволегн — писать мне

    Reply ↓
  28. CheBurator

    Илите флеймить в форум!

    просьба высказываться по сути обработки!

    Reply ↓
  29. vasilykushnir

    (22)1. База пухнет до невообразимых размеров, тем более если к номенклатуре 2 и более картинок привинчены.

    А бывает и 5…

    А кто мешает их хранить в отдельной скульной базе? Собственно это сейчас планирую с переходом на скуль (на стадии осмысления): будет основная база и парочка вспомогательных. На ДБФах, конечно такое не выкрутишь…

    И еще: к каждому товару не 5 (к примеру) картинок (у меня сертификаты в виде графики), а только 3, если больше — однозначно из расчета 2 картинки на лист.

    Reply ↓
  30. vasilykushnir

    А что касается собственно темы: у Чебура всегда оббалденные интерфейсы — ничего лишнего и аляповатистого, но максимум удобств для юзеров. Кстати, а где обещанный скрин сканирования сертификатов?…

    Reply ↓
  31. CheBurator

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

    Reply ↓
  32. ge_ni

    Для швейника организовал аналогичное еще лет 5 назад. Хранит 10000 картинок, все хорошо. В момент привязки картинки изодражение пропорциональное, без искажений… Но как только начинается следующий цикл просмотра при оьбращении к карточке номенклатуры: «Стройные дамы превращаются в толстушек и наоборот..» Вомущается гад! На примере у Che искажение тоже присутствует. Может в 1С кто умеет подгонять динамически окно по картинку… Просто сильно этой проблеммой не занимался, а тут вдруг — родственные души… Подскажите плз…

    Reply ↓
  33. JohnyDeath

    (32) >Может в 1С кто умеет подгонять динамически окно по картинку…

    это может делать FormEx. Класс «РасширениеФормы», свойства на чтение и запись:

    Высота / Height

    Ширина / Width

    Reply ↓
  34. CheBurator

    (33) + или делаешь окно «типа портрет», на нем — картинка, а дальше — штатно

    РежимРисования(<?>);

    Синтаксис:

    РежимРисования(<Режим>)

    Назначение:

    Установить режим рисования картинки.

    Возвращает:

    Текущее числовое значение режима рисования картинки (на момент до исполнения метода).

    Параметры:

    <Режим> -:

    1 — растягивать;

    2 — рисовать по центру с оригинальным размером;

    3 — рисовать, сохраняя оригинальное соотношение размеров.

    Подробнее см. в документации, глава »Работа с Картинками»

    Reply ↓
  35. ineoosaki

    Пример смотрите в конфе 1C ДЕНЬГИ

    Reply ↓
  36. Alexandra

    Обработка — даром, за название — 1000

    Reply ↓
  37. nnvlad

    Cnfylfhnyfz конфа 1с:Деньги давненько имеет в своем арсенале вызов изображения, так что велосипед батенька, велосипед!

    Reply ↓
  38. CheBurator

    (37) Что, позволяет привязывать по аналогичному алгоритму? Предоставляет такой же интерфейс?

    Reply ↓
  39. dim1976

    Неплохо придумано! Молодец!

    Можно выводить весть товар и которого нет на складе ,скажем по галочке «Все товары» ?

    Reply ↓
  40. Sure

    Да, название того стОит! Нарочито-нецензурное пополам с неприличным.

    Reply ↓
  41. Abadonna

    (37) Ну что вы все так до этого велосипеда докопались? Если бы его не изобретали — так бы и ездили на том монстре с огромными колесами. А сейчас, однако, и горные, и т.д….

    Reply ↓
  42. елерина

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

    Reply ↓
  43. CheBurator

    Ознакомиться и использовать можно просто: скачать с этой страницы и пользоваться. Если интересует «встраивание» картинок в процесс продажи — это отдельная маленькая задачка

    Reply ↓
  44. sirius77

    Как сделать так чтобы во врема подажи в ТиС 9.2 по документам Чек ККМ; Реализация; Реализация(розница); В справочниках номенклатура и т.д. когда водишь курсором по позициям то же появлялась картинка???

    Как в 8-ке.

    Reply ↓
  45. CheBurator

    (44) примерно как и здесь…

    Reply ↓
  46. korpas

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

    Reply ↓
  47. CheBurator

    (46) Имхо картинки в процессе именно подбора номенклатуры — необходимости нет… чем картинка поможет манагеру…? если он не знает номенклатуры — то и картинки не помогут… В специфических случаях надо рассматривать отдельно

    Reply ↓
  48. Валерий_

    (47) Прекрасная идея, но использовать не возможно.

    Идею с изображением товара можно применить, например, при продаже в помощь и менеджеру (для быстрого предложения товара) и покупателю (для выбора)

    Это и есть помощь менеджеру, таким образом, можно ознакомить весь персонал, с новым товаром, и очень даже изображение поможет, если товар не известен.

    Номенклатуру в обработке искать можно Ctrl+F3 > поиск > Справочник номенклатуры > F7… быстрее, если расположена по алфавиту.

    Да и изображение получается корявое.

    Жаль

    Идея отличная +

    Но без «маленьких задач» …

    Reply ↓
  49. CheBurator

    Да, у меня, например, ассортимент идет большой и ротация товара постоянная.

    насчет

    > Да и изображение получается корявое. Жаль

    — не понял.. что плохо/не устраивает?

    .

    данная обработочка для установки привязки.

    сама работа с изображениями в карточке товара описана здесь: http://infostart.ru/blogs/330/

    .

    при желании применить данный подход к раположению картинки на форме списка — нужны незначительные модификации

    Reply ↓
  50. CheBurator

    у меня просмотр картинки в любых списках товаров происходит по Ф4 — потому что постонно держать картинку на форме в моем случае — нецелесообразно

    Reply ↓
  51. Валерий_

    (49) Например фото: диск алмазный (круглый) — в миниатюре всё нормально, а в текущем изображении товара — эллипс (круг вытянут вверх, низ), к стати заметил, если вставлять фото в — не ландшафт, а портрет, то проблема уходит.

    Вытянуты так же и фото квадратной формы.

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

    Reply ↓
  52. CheBurator

    (51) ну… обычно пропорции картинки не так критичны, поэтому картинка умолчательно масштабируется на все доступное поле… можно смасштабировать с соблюдением пропорций…

    Reply ↓
  53. CheBurator

    Советую посмотреть вот это: http://infostart.ru/projects/2188/

    Reply ↓
  54. Валерий_

    (53)Посмотрел, отмасштабировал, давлю на кнопку «выбрать» > выдаёт окно: «Нет данных о том, в какое место выбрать указанную картинку…

    В выборе отказано!»

    Т.е. пардон, как сохранить?

    Reply ↓
  55. CheBurator

    (54) данный диалог просмотра/масштабирования может:

    — вызываться интерактивно пользовтелем самостоятельно: тогда картинку выбранную некуда «передавать» (вам хочется сохранить, а кому-то захочеться распечатать — на всех не угодишь…);

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

    ..

    возможно для ваших нужд (пока мне непонятно каких) следует воспользоваться вот этим: http://infostart.ru/projects/2439/

    Reply ↓
  56. Валерий_

    (55) «воспользоваться вот этим: http://infostart.ru/projects/2439/»

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

    А нужды наши — солидарны с (44)

    Reply ↓
  57. CheBurator

    (56) читаем (49) последнее предложение

    Reply ↓
  58. Валерий_

    (57) Отражённые здесь: http://infostart.ru/blogs/330/ или несколько иначе?

    Reply ↓
  59. CheBurator

    практически 1 в 1…

    убегаю домой буду на связи +1.5 часа

    Reply ↓
  60. Валерий_

    (52) Странно, как пропорции предлагаемого, тем более «обычно», могут быть не критичны, тогда и предложения не эффективны, на сколько некритичны.

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

    Reply ↓
  61. CheBurator

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

    — не имеет смысла, потому что другие картинки будут криво… надо просто в коде при назначении картинки на предназначенное ей место задать соответсвующий режим пропроциональности…

    ..

    сорри, но более подробное преподавание основ и приемов/методов программирования не входит в мои ближайшие планы… 😉 Если вам надо «докрутить» — обратитесь в раздел «заказы»..

    Reply ↓
  62. Serdjio

    клевая прога очень помогла, спасибо автору!!!!!(=

    Reply ↓
  63. winise

    Спасибо то что нужно !

    Reply ↓
  64. SerNikAnt

    Отлично, применил на практике

    Reply ↓
  65. Nurbert

    спасибо

    Reply ↓
  66. CheBurator

    (66) Пожалуйста

    Reply ↓

Leave a Comment

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