Рабочее место менеджера по продажам с учетом аналогов




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

42 Comments

  1. CXY

    Например, в автобизнесе, где все запчасти к автомобилям маркированы по артикулам (спец. кодам). Аналоги зависят от страны-изготовителя, например. Есть целые каталоги соответствий аналогов.

    Reply
  2. CheBurator

    Я, конечно, в 8-ке нуль, но, по-моему, есть штатный справочник аналогов для номенклатуры в типовой УТ…? городить для этого спец.табличную часть..эээ.. как-то мне не комильфо..?

    Reply
  3. CXY

    Штатного справочника аналогов для номенклатуры в типовой УТ, к сожалению, нет. Иначе именно с ним я бы и работал (это было бы значительно проще, чего уж там)… Кстати, почему обязательно пользователю самому надо заполнять аналоги? Это вполне может сделать небольшая обработка, нужен только исходный список (по автобизнесу например он есть и мы его-то и используем). Тестировался этот механизм на базе номенклатуры, имеющей около 50000 наименований, поэтому и реализован он только на запросах.

    Reply
  4. udjii

    Каждому свое — в некоторых случаях (к примеру крупная огранизация поставщик) действительно покажется это не нужным, тем более у них наверняка есть УПП, в котором этот справочник есть (в УТ этого справочника нет, я его сам «перемещал» из УПП) — но в маленьких организациях номенклатуры немного, но за счет огромного числа поставщиков — количество аналогов не так уж мало — тем более не редки случаи, когда в интернет магазине одно, а в базе другое, так, что кому-то эта обработка может и понадобится.

    Reply
  5. sergey9999_1

    автор пишет : «необходимо внести изменения (очень небольшие) в справочник Номенклатура. А именно — создать табличную часть Аналоги, внести туда реквизиты Артикул (как строка длины 25) и Номенклатура (как СправочникСсылка.Номенклатура). В справочнике создать вкладку Аналоги (см. изображение 2).» как это все сделать в конфигураторе?. помогите скринами.

    Reply
  6. CXY

    (6) Прикладываю файл-инструкцию. Там сама инструкция и скрины.

    Reply
  7. Lubanya

    Не открывается в 11.0.5.4

    Reply
  8. CXY

    (8)Обработка сделана для УТ 10.3.

    Reply
  9. bonick_007

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

    Reply
  10. CXY

    (10) Бог в помощь. Если возникнут вопросы — обращайтесь.

    Reply
  11. arktika1

    Скажите а аналог видит другой аналог если он прописывался с одной стороны, т.е если мы прописали что что товар № 1 = товару № 2, будет ли видно при выборе товара № 2 что он аналог товара № 1, при этом отдельно не прописывали что товара № 2 = товару № 1.

    Reply
  12. arktika1

    подскажите а как правильно её запустить в базе.

    Reply
  13. CXY

    (13)Инструкция уже изложена мною в (7). Отвечая на (12) скажу, что нет, не будет видно. Связано это с тем, что например для запчасти японского производства китайская является аналогом (дешевым), а вот для китайской японская — нет. Таким было требование заказчика. Если необходимо, можно в принципе сделать спец. обработку для того, чтобы аналоги учитывались с обеих сторон…

    Reply
  14. arktika1

    Спасибо за ответ

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

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

    Еще интересует параллельно возможность залива аналогов из Эксель, конечно есть вероятность не схождения по названиям, но это уже отдельная тема.

    Reply
  15. CXY

    (15) Для этого надо эту обработку повесить при вводе аналога в карточке. Т.е. как только вводится аналог в карточку по товару, программно сразу же вводится в карточку аналога обратный аналог. Да делается в-общем то достаточно быстро, в течение вечерка…

    Reply
  16. arktika1

    Было бы очень удобно если бы такая функция появилась, при этом если бы можно было бы её включать и выключать.

    Спасибо за ответ.

    Reply
  17. lorddeart

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

    Reply
  18. CXY

    (18)Артем, я проверил обработку, реквизиты Единица измерения и Цена выставляются, причем не только при выборе основного товара, но и аналогов. Вам надо проверить такие моменты у себя: 1) В карточке выбранного товара должны быть проставлены единицы измерения, там их несколько. 2) Вы в самой обработке должны выставить цену (проставить галочку), по которой будете выбирать и заносить товар в документ. Список цен там в обработке внизу справа.

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

    Reply
  19. lorddeart

    (19) Спасибо за ответ. При добавлении товаров в чек еще почему-то пишет {Документ.ЧекККМ.Форма.ФормаДокумента(309)}: Значение не является значением объектного типа (Коэффициент)

    СтрокаТабличнойЧасти.Коэффициент .

    По коду вроде все Ок. Непойму пока.

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

    Reply
  20. CXY

    (20)Для автоматического внесения реквизита Размещение в Заказе покупателя необходимо скачать обновленную версию обработки, поскольку я там внес необходимые изменения, а также внести исправление в модуле документа Заказ покупателя в функции ЗаполнитьТабличнуюЧастьИзПодбора() так, как показано на рисунке (внести одну строчку, она выделена). Собственно, это все…

    Reply
  21. lorddeart

    Не пойму цена и единица в чеке все равно не выставляется. А еще фильтр по наличию каждый раз приходится перещелкивать. Почему-то при изменении строки поиска фильтр не срабатывает. И в аналогах не показывается цена. Есть идеи?

    Reply
  22. CXY

    (22) Идеи есть всегда, Артем.

    Итак, цена и единица измерения у меня выставляется. Для того, чтобы понять, что у Вас не так, мне необходим Ваш файл конфигурации (формата CF).

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

    А вот чтобы в аналогах показывалась цена, сделайте следующее. Зайдите в конфигуратор, откройте обработку, зайдите в модуль формы. Найдите в куске кода выделенную строчку. Так вот, Вам нужно заменить код типа цен, который там стоит, на свой код (например тот, который соответствует розничной цене). Сохраните обработку и пробуйте…

    Reply
  23. lorddeart

    Спасибо. Завтра проверю. Я писать в 1С недавно только начал, пока не доходит быстро) Буду разбираться.

    Reply
  24. arktika1

    Здравствуйте очень понравилась Ваша обработка «Рабочее место менеджера по продажам с учетом аналогов»

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

    Спасибо буду ждать Вашего ответа.

    Александр

    Reply
  25. CXY

    (25)Здравствуйте, Александр.

    Если Вам это нужно не сильно срочно (в течение 2-х недель), тогда не вижу никаких причин Вам отказать. Мой почтовый адрес cxy_cxx@rambler.ru

    Фильтр по товарам на основании их свойств — хотелось бы поподробнее, что именно Вы хотите.

    Reply
  26. agarkin

    Удобная вещь — наличие чека ККМ — очень нужно!

    Reply
  27. lorddeart

    (23)Извините, вышла задержка. Получилось проверить только сегодня. Вывод цен в аналогах работает, большое спасибо. А вот вывод цены при подборе в чек найти так и не смог. Ссылку на полную конфигурацию высылаю вам на почту cxy_cxx@rambler.ru. Если у вас будет время посмотреть буду очень благодарен.

    Reply
  28. CXY

    (28)Для того, чтобы выводилась цена, необходимо скорректировать процедуру ОбработкаПодбора в документе ЧекККМ в модуле ФормаДокумента таким образом, как это показано в прилагаемом мною файле. И тогда все будет хорошо 🙂

    P.S. Файл открывайте в 1С — там текст процедуры…

    Reply
  29. lorddeart

    (29)Огромное спасибо! Все работает.

    Reply
  30. ozaka
    Reply
  31. CXY

    (31)Для того, чтобы Вам помочь, мне нужен файл конфигурации формата CF. Мой ящик cxy_cxx@rambler.ru

    Просто дело в том, что решение этой задачи может лежать не только в тех процедурах, которые Вы мне представили.

    А с файлом *.cf мне гораздо быстрее получится разобраться…

    Reply
  32. CXY

    (31)Отвечаю. Для того,чтобы решить проблему, надо вставить строчку, которую я выделил в тексте. Собственно, это как бы всё…

    Reply
  33. ozaka

    CXY СПАСИБО ВАМ ОГРОМНОЕ ЗА ПОМОЩЬ!

    Как хорошо что есть такие люди как вы, которые берутся помочь новичкам! 🙂

    Reply
  34. arktika1

    Скажите на сколько Ваша обработка способна решать проблему скозных аналогов

    Мне кажется что нет смысла обединять почти похожие аналоги, он либо является аналогом, либо нет

    если у него есть схожие свойства то лучше при не нахождении аналога предложить поиск по похожим свойствам номенклотуры. Но важно что бы при прописывании А = Б и Б = С сразу прописывалось что и С = А

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

    а это большой объем работ

    Скажите у Вас реолезован такой функционал?

    можноли увидеть при прописывании А = Б и Б = С что сразу прописывается и С = А

    и если у Вас отбор по свойствам что бы найти схожие товары не являющиеся аналогами если нужного аналога нет.

    Reply
  35. CXY

    (36)Функционал сквозного прописывания аналогов в разработке на сайте я не ставил, хотя понимал что рано или поздно такой вопрос будет стоять. Но реализовать его можно достаточно просто. Например, в карточке товара А ставим аналог А=Б. При нажатии кнопки Записать или ОК прорамма ОДНОВРЕМЕННО зайдет в карточку товара Б и поставит там аналог Б=А. Теперь далее, мы зашли в карточку товара Б и поставили там аналог Б=С. Тогда программа в момент сохранения карточки зайдет в карточку С и проставит С=Б, и также еще один аналог С=А, затем зайдет в карточку А и проставит аналог А=С.

    Другими словами, этот механизм будет работать в момент непосредственного заполнения и сохранения аналогов. Тогда это не сильно заметно отразится на быстродействии системы… Другое дело, что не всегда этот механизм нужен, моему заказчику как раз он не понадобился. Например, для детали японского производства аналог корейский или китайский может быть, а вот для китайского товара деталь из Японии аналогом не является (оригиналом)…

    Свойства товара это стандартный механизм УТ, и он должен работать, его функционал я не ограничивал.

    Reply
  36. Kamik

    Функционал сквозных аналогов есть в конфе Рарус Авто. Там реализовано на регистре сведений. Реализовали эту идею в УТ10 примерно за 4-5 часов, вкл. вычищение багов. Только в этом случае прописывание аналогов через загрузку не столь тривиально.

    Reply
  37. Spacer

    Хорошая обработка. Спасибо. Как раз то что я искал.

    Правда я ее частично переделал. У меня аналоги хранятся в регистре сведений,

    а не в табличной части элемента справочника.

    Reply
  38. MrFlanker

    Согласен с (39) менять справочники не хорошо. Уж лучше засунуть в регистр сведений. А еще у аналогов должны быть приоритеты продажи. (Я вот например не люблю продавать аналоги товаров взятые на комиссию, или просто некоторые бренды хочется продавать только как резерв). Короче нужен приоритет продажи.

    А еще бывает что А заменяет Б, а наоборот нет….. это тоже как-то надо учитывать.

    Reply
  39. lexuslam

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

    Reply
  40. CXY

    (41) смогу Вам помочь только с 22 апреля, сейчас пока в отпуске, пишу с планшета. Если же время не позволяет, то помочь Вам может любой сведущий в 1с, даже начального уровня…

    Reply
  41. lexuslam

    (42)

    так что на счет помощи? 319540205icq lexuslam skype

    Reply
  42. CXY

    (43)Встретимся в скайпе.

    Reply

Leave a Comment

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