[ОБУЧАЛОВКА] Каким макаром к номенклатуре привязать картинку…?




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

56 Comments

  1. ineoosaki

    Предлагаемое решение изменяет типовую конфу, хотя есть решения которые используют штатные функции современных типовых конфигураций 7.7.

    Например здесь находиться одно из таких решений:

    http://infostart.ru/forum/read.php?21,16144

    Reply
  2. ineoosaki

    Кстати, одна из удачных реализаций привязки изображений к объектам в базе реализована в типовой конфе 1С:Деньги.

    Reply
  3. CheBurator

    (1) Полностью согласен, в своей конфигурации у меня через внешние печатные формы почти все делается…

    А данная статья — в первую очередь как пример, «разжевывание» как это сделать…

    Reply
  4. CheBurator

    (2) а в чем там «фишка» удачной реализации…?

    Reply
  5. ineoosaki

    Насчет «удачной», то я конечно немного загнул. 🙂

    Но, в приниципе, довольно удобно, ИМХО.

    Reply
  6. Abadonna

    Можно сделать всё изложенное, совсем не трогая стандартную конфу

    Reply
  7. CheBurator

    и без ВК!!

    Reply
  8. O-Planet

    Мде… Если рейтинг этой

    Reply
  9. O-Planet

    Я балдею!!! А почему по табуляции срабатывает «Добавить комментарий!? 0_о

    Reply
  10. O-Planet

    Хотел сказать, что совсем не удивлюсь, если рейтинг этой статьи будет 500 и выше 🙂 А что? Суть и «урок» предельно ясны, так что каждый может почувствовать себя гением:

    Имя файла = код товара . bmp

    Reply
  11. O-Planet

    Короче, оскудение нравов — налицо! Зря не назвал «Финт ушами с кодом товаров» 😉

    Reply
  12. logarifm

    Я вообще не понял прикола…

    Reply
  13. logarifm

    а… эта наверна автар от скуки пожестил …

    Reply
  14. CheBurator

    ясен пень…

    Reply
  15. Abadonna

    >// ДОБАВЛЕНО НЕТИПОВОЕ

    >_сруЗагрузитьКартинку()

    _ссуЗагрузитьКартинку() — может по приличнее бы было ;)))))

    Reply
  16. JohnyDeath

    Аркадий, жжош!!!! )))))

    Reply
  17. miraj_mv

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

    Reply
  18. venger

    Что-то подобное реализовано тут:

    http://infostart.ru/projects/1528/

    А тут в доках:

    http://infostart.ru/projects/1527/

    Reply
  19. CheBurator

    2Venger: да, схожие задачи порождают схожие решения, как правило… Целью данной статьи были пошаговые инструкции одного из методов привязки номенклатуры…

    Reply
  20. maljaev

    Сhe Burashka, если ты к своему просмотру изображений прикрутишь еще эту вещь http://infostart.ru/projects/1747/ то круче решения для 1С 7.7 не найдешь наверное. 🙂 А вот вопрос о том, как хранить картинки — спорный, т.к. в некоторых случаях (УРБД) картинки лучше хранить в базе, а не в файлах.

    Reply
  21. CheBurator

    2Maljaev: cgc, за ценныую ссылку.. прошла мимо меня

    Reply
  22. dmv78

    Обмен при УРБД, обработка FTP — обмена, когда надо обновит каталог картинок! А хранить картинки на форме при наличии 22 000 наименований позиций, база может стать неподъемной!

    Reply
  23. CheBurator

    невтыкнул… это про что? тут как раз картинки нигде в базе не храняться…

    Reply
  24. Alexin

    Все хорошо, _no.bmp отображается, но вот только не понятно как загружать картинку для товара?

    Reply
  25. CheBurator

    (24) «…в качестве имени картинки используется код номенклатуры из справочника товаров.»

    «…изображения товаров будем хранить в отдельной папочке типа КаталогИБIMAGES.DIR»

    Reply
  26. Enya_06

    …все сделала как написано..но что то не получаеся????? папка IMAGE.DIR должна содержать файл no.bmp?????

    Вылазиет ошибка

    _имТовар.Загрузить(_глПутьКартинок+»_no.bmp»);

    {Справочник.Номенклатура.Форма.Модуль(14)}: Общая файловая ошибка при доступе к C:Программы1СБазыОсновнаяIMAGE.DIR\_no.bmp

    Reply
  27. Ёпрст

    (26) Вам же полный путь до файла картинки написан

    «C:Программы1СБазыОсновнаяIMAGE.DIR\_no.bmp»

    соответственно файло «_no.bmp «

    Reply
  28. sergin

    А что надо сделать, чтобы картинки выводились не по Коду, а по Артикулу?

    Простите, может это глупый вопрос, но у меня не выходит. С кодом все работает отлично, а с Артикулом нет 😥

    Reply
  29. novinnik

    Сделал все как написано, скинул пару файлов *.png (00000047.png) в папку IMAGE.DIR но при открытии данных кодов в справочнике номенклатуры вывод картинку _no.bmp

    Reply
  30. CheBurator

    (29) Формат PNG штатно 7.7 не поддерживается, в примере вставлен, так сказать, на будущее. Так что картинки в формате jpg размещать придется… Если очень критично и до зарезу надо в png — то придется допрограммить немного…

    Reply
  31. novinnik

    разместил в jpg, все равно отображается только пустая картинка (_no.bmp)

    Reply
  32. westDimon

    не могу понять 😳 , виставь плиз весь прогр. модуль.

    Reply
  33. CheBurator

    (32) что именно непонятно?

    Reply
  34. westDimon

    (33) при исп. примера появляются ошибки, виставь плиз весь код

    Reply
  35. CheBurator

    код ошибки? — скорее всего недословно скопипастили…

    Reply
  36. kitaecina

    Не могли бы ответить копипастеру о том, как можно вывести в печати прайс-листа эти картинки?

    Reply
  37. CheBurator

    (36) как обычно.. вставляешь объект «картинка» и при выводе назначаешь на объект текущую картинку.. что не получается?

    Reply
  38. kitaecina

    Я слабый специалист, как вставить картинку в печатную форму, чтобы её вывело на печать? нельзя ли поподробнее …

    P.S. Ваш метод понравился и желание большое настроить для использования у себя, хотелось бы самому…

    Reply
  39. CheBurator

    создаешь печатную форму типа

     Таб = СоздатьОбъект(«Таблица»);
    Таб.ИсходнаяТаблица(«Спецификация»);

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

    ИзображениеЗагрузить(Таб.ТекущийОбъект)

    .

    в коде пишешь функцию:

    Функция ИзображениеЗагрузить(Куда)
    Куда.Загрузить(ТекущийФайлС);
    Куда.РежимРисования(3);
    КонецФункции //ИзображениеЗагрузить()

    .

    перед выводом секции печатной формы определяешь содержание глобальной переменной ТекущийФайлС — должна содержать полный путь к файлу изображения.

    Reply
  40. kitaecina

    Забыл уточнить, применяю для ТиС 960

    Так вот вопрос и возникает как определить перед печатью путь к файлу картинки,

    ТекущийФайлС= _глПутьКартинок+ТекЭлем.Код+_глИерархияТиповКартинок.Получить(«»+_ТипКартинки<<?>>);

    {}: Переменная не определена (_ТипКартинки)

    При проверке модуля обнаружены синтаксические ошибки!

    Понимаю что неправильно делаю что-то, а не могу понять что…

    Reply
  41. CheBurator

    (40) тебе система написала: переменная не определена. ищи

    Reply
  42. kitaecina

    Спасибо, все получилось…

    Reply
  43. Yuvilon

    Спасибо, тема супер, оч помогла!!!

    Reply
  44. Yuvilon

    Что-то не соображаю, я новечек сдесь, и не представляю как описть эту функцию для отображения в подборе!! Оч буду рад в Помощи!!

    Reply
  45. sanich67

    Всё сделал, получилось очень красиво

    вот только сохраненный прайс с картинками при открытии картинку искажает

    Reply
  46. sanich67

    Yuvilon,

    ты сделал то что хотел?

    Reply
  47. pinachet

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

    Reply
  48. asverus

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

    Прошу продолжения банкета на предмет прикрепления нескольких изображений.

    P.S. — это вообще вторая инструкция, которая запустилась и заработала; и нормально заработала только эта… возможно, платные модули, но честно говоря — уже натыкался на то, что и за деньги получаешь дохлого кота в мешке и ничего не вернешь. вставил в ТиС 7.7

    Для программера и знатоков — проблем конечно нет, но для средних пользователей с «интуицией» вполне; для новичков — конечно непонятно будет что куда вставлять.

    Спасибо.

    Reply
  49. ideapromotion

    Как скачать можно это решение?

    Reply
  50. adm1nb3k

    Вопрос. Тут описано как сохранить фото. А есть ли обратный способ, то есть загрузить в каталог IMAGE.DIR? Спасибо.

    Reply
  51. piloturs

    (49) меню файл броузера, сохранить как: «[ОБУЧАЛОВКА] Каким макаром к номенклатуре привязать картинку.htm»

    Reply
  52. CheBurator

    (50) есть. Смотри мою обраьотку распихивания картинок по номенклатуре.

    http://infostart.ru/public/15239/

    Reply
  53. adm1nb3k

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

    Reply
  54. CheBurator

    (53) видимо, не позволяет…

    Reply
  55. etmarket

    Нравится самобытность автора. Я не намекаю на неграммотность. Сам люблю оригинальные решения. Данный топик и приведенный код обилует подобными решениями. Подчеркнул для себя много полезного. Спасибо!

    Reply
  56. CheBurator

    (55) ну хоть кому-то еще 7.7 пригодилась…

    у меня этих всяких форм/обработок по манипуляции с картинками — вагон и тележка.

    есть даже подбор в документ поступления не по списку товаров, а по картинкам…

    Reply

Leave a Comment

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