Подбор товаров с остатками и ценами для розница 2.2 (Расширение)




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

58 Comments

  1. Vlx

    Замедления по какой причине наблюдаются:

    1) Из-за того что обработка изменена и используется расширение

    2) Из-за того что появились дополнительные отборы данных в запросе

    Reply
  2. coolseo

    (1)

    3) Из-за постоянных левых соединений с таблицами остатков и цен при прокрутке динамического списка

    Reply
  3. Vlx

    (2) Я наблюдал замедления динамических списков во внешней обработке. Если обработку внести в конфигурацию, то замедлений не было.

    Может с расширением то же самое?

    Reply
  4. coolseo

    (3) Нет, замедления есть везде при расширении или переносе в типовую.

    Reply
  5. user603532_fan_club_chelsea

    а как внести эти изменения в код. как разрешить изменения в расширении77

    Reply
  6. coolseo

    (5) Нужно добавить расширение в конфигурацию, зайти в конфигуратор и открыть модули форм измененных обработок «ПодборТовара» и «РМКУправляемыйРежим» и там изменить РезультатПоискаЦены = Справочники.ВидыЦен.НайтиПоНаименованию(«ВАШЕНАЗВАНИЕЦЕНЫ»); на ваше название розничной цены.

    Reply
  7. user603532_fan_club_chelsea

    ну я менял там. у меня чет на справочникНДС ругается.

    Reply
  8. coolseo

    Скриншот приложите

    Reply
  9. user603532_fan_club_chelsea

    вот приложил

    Reply
  10. user603532_fan_club_chelsea

    (8) не пойму… почему на совместимость ругается? или это из-за того что справочник ндс не идет?

    Reply
  11. user603532_fan_club_chelsea

    в основной конфигурации тип у объекта СправочникНоменклатураРеквизитСтавкаНДС — СправочникСсылка.СтавкиНДС

    а в расширении тип у объекста

    СправочникНоменклатураРеквизитыСтавкаНДС — ПеречислениеСсылкаСтавкиНДС

    Reply
  12. user603532_fan_club_chelsea

    режим совместимости я снял. теперь остается с ндс разобраться

    Reply
  13. user603532_fan_club_chelsea

    кароч я в свойствах реквизита где «ТИП» галочку снял. и заработало. Этот реквизит сильно влияет???

    Reply
  14. user603532_fan_club_chelsea

    по сути, у меня только в РМК при поиске товара должны были появиться эти самые колонки же?

    Reply
  15. coolseo

    (14) Да, только в подборе

    Reply
  16. user603532_fan_club_chelsea

    Ошибка создания набора данных «НаборДанныхДинамическогоСписка»

    по причине:

    Ошибка при исполнении запроса набора данных

    по причине:

    {(30, 44)}: Не задано значение параметра «ВидЦены»

    И ЦеныНоменклатурыСрезПоследних.ВидЦены = <<?>>&ВидЦены.

    с чем это связано?

    Reply
  17. coolseo

    (16)В модуле форм расширения не указали какой вид цены отображать

    &НаСервере
    Процедура Расш_ПодборТоваровПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    РезультатПоискаЦены = Справочники.ВидыЦен.НайтиПоНаименованию(«ВАШЕНАЗВАНИЕЦЕНЫ»);
    Товары.Параметры.УстановитьЗначениеПараметра(«ВидЦены», РезультатПоискаЦены);
    КонецПроцедуры
    Reply
  18. annex3103

    В РМК при открытии поиска появляется только колонка Артикул.

    В документах подбор с ценами и остатками.

    Reply
  19. coolseo

    (18)Какая версия розницы?

    Reply
  20. user603532_fan_club_chelsea

    (19) Розница 2.2.1 для Казахстана.

    если я убираю полностью условие про «видцен» в конструкторе динамического списка. убираю весь ваш код в модуле.

    просто получается добавляю цену условием задаю СправочникНоменклатура-номенклатураценаСрезПоследних-ссылка-номенклатура

    тогда перестает ругаться и отображает цену.это вообще правильно так делать? почему не присваивает значение параметра не понимаю.

    можно оставить ваш код в модуле удалив в скобках «видЦены». тоже работает вроде.

    Но при прокрутке потом начинает ругаться пишет «Обнаружено дублирование ключевых значений в колонке ссылка»

    Начинают дублироваться данные в колонках. что не так вообще не вкуриваю. Вроде только что-то путное выходит, как снова ошибка…

    Reply
  21. annex3103

    Розница, редакция 2.2 (2.2.6.28)

    Reply
  22. coolseo

    (21)Не получается эмитировать проблему.

    (20) Про розницу для Казахстана ничего не знаю. Если работает без параметра моего, не используйте его.

    Reply
  23. user603532_fan_club_chelsea

    (22) а вы знаете «справочник.Дополнительные реквизиты» где могут использоваться? «Обнаружено дублирование ключевых значений в колонке ссылка» — исправилось. когда убрал условие «справочник.Дополнительные реквизиты» и прилагающие к нему муть… поставил галочку в дополнительно «Без повторяющихся».

    все сразу заработало. вроде всю необходимую информацию выводит. список номенклатуры полный.

    Не критичны же мои действия?!

    Reply
  24. coolseo

    (23) Дополнительные реквизиты в номенклатуре, если вы их не используете то все хорошо.

    Reply
  25. user603532_fan_club_chelsea

    (24) в подборе РМК это не надо. ну и хорошо, раз не критично.

    Reply
  26. user603532_fan_club_chelsea

    а вы с редактированием «шапки» чека/х-отчета не сталкивались? не в курсе, как можно убрать номер чека из х-отчета.

    Reply
  27. annex3103

    В режиме РМК все работает, но только с скрытым деревом папок и отключенными галочками показывать остатки и цены, а по иерархии хотелось бы выполнять поиск.

    Reply
  28. dimmat

    Установил расширение другого автора для отображения остатков и цен в справочнике «номенклатура» — остатки не отображаются совсем.

    Как ваше расширение работает? Если у меня две организации и соответственно два склада, какие остатки будет показывать?

    Reply
  29. coolseo

    (28) Здравствуйте, показывает остатки и цены которые вы установили руками в коде.

    
    &НаСервере
    Процедура Расш_ПодборТоваровПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    //Радченко М.В. от 16.08.2017 устанавливаем параметр. В динам. списке добавил колонки Количество, Цена. Про прошения за гавнокод
    РезультатПоискаЦены = Справочники.ВидыЦен.НайтиПоНаименованию(«ВАШЕНАЗВАНИЕЦЕНЫ»);
    Товары.Параметры.УстановитьЗначениеПараметра(«ВидЦены», РезультатПоискаЦены);
    //Радченко М.В. от 16.08.2017 устанавливаем параметр. В динам. списке добавил колонки Количество, Цена. Про прошения за гавнокод
    КонецПроцедуры

    Показать

    Для двух организаций нужно дорабатывать расширение.

    Reply
  30. chingis.quiz

    Привет! подключил расширение, но нужных колонок не появилось ( это может быть из-за того что в базе 2 ИП?

    Reply
  31. coolseo

    (30) Добрый день. Мало данных для анализа ошибки.

    Reply
  32. Axe

    Как работает расширение ? Это какое-то дополнение ? Конфигурацию не изменяет ? Обновления будут приходить в типовую розницу ?

    Reply
  33. coolseo

    (32) Не изменяет типовую конфигурацию, обновления будут работать.

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

    Reply
  34. ssn5810

    хороший подбор товаров, если добавить выбор вида цен, вообще будет супер…..

    Reply
  35. coolseo

    (34) Да, вы правы. Обязательно сделаю.

    У кого как работает расширение? Тормозит подбор? Может кто переписал запрос так что не тормозит?

    Reply
  36. ssn5810

    и с характеристиками не работает — пустая таблица….

    Reply
  37. coolseo

    (36) И не будет, если только изменить запрос.

    Reply
  38. afxnano

    В подборе РМК нет артикула, нажимаем показать дерево появляется артикул пропадают остатки и цены. с чем это связано? розница 2.2.8.29

    Reply
  39. coolseo

    (38)Потому что запрос работает только со списком.

    Reply
  40. Glav

    Добрый день

    Розница, редакция 2.2 (2.2.9.18)

    В РМК при «показать информацию» или «показать дерево»

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

    Reply
  41. coolseo

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

    Reply
  42. Glav

    Добрый день

    при использовании RLS — ошибка «У пользователя недостаточно прав на исполнение операции над базой данных «

    Reply
  43. coolseo

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

    Reply
  44. Glav

    РЛС — по магазинам

    Ваша обработка показывает общие остатки по всем магазинам

    Соответственно, при наложенном ограничении получаем ошибку

    Reply
  45. coolseo

    (44) Понятно. Вам придется самостоятельно изменить запрос в расширении чтобы «заработало»

    Reply
  46. Glav

    Вы не могли бы подсказать — что изменить ?

    или за плату допилить для нас

    Reply
  47. coolseo

    (46) К сожалению, я не могу подсказать вам что нужно изменить, а так же не буду «допиливать».

    Но есть огромное количество желающих помочь здесь — https://infostart.ru/project/

    Reply
  48. opus70

    вопрос с характеристиками дружит ?

    Reply
  49. coolseo

    (48) Нет

    Reply
  50. Vegner

    Добрый день.

    А поиск по наименованию или артикулу как то оптимизирован?

    Reply
  51. coolseo

    (50) Здравствуйте, нет изменений

    Reply
  52. ivanmotyan

    Здравствуйте. Вариант для 2.2.11 стоит ждать?

    Reply
  53. Dwiss

    не отображает наименование в списке подбора РМК, если включена иерархия или цены и количество, выбор товара вслепую( автор я так понял не собирается ни чего переделывать.

    Reply
  54. user622591_serenia2110

    добрый день, подскажите для розница 2.3.1.30 версия будет?

    Reply
  55. coolseo

    (54)Здравствуйте, к сожалению у меня нет возможности проверить на 2.3.1.30

    Reply
  56. user622591_serenia2110

    можем предоставить доступ

    Reply
  57. coolseo

    (56) Попробуйте сами

    Reply
  58. aleksandr_leiman

    (54)Для адаптации на релиз 2.3.1.30:

    в новом релизе не используется справочник «ДоговорыПлатежныхАгентов», вместо него теперь «ДоговорыКонтрагентов».

    Поэтому в расширении удалить справочник «ДоговорыПлатежныхАгентов», и заимствовать «ДоговорыКонтрагентов»..

    В расширении в справочнике «Номенклатура» удалить реквизит «ДоговорПлатежногоАгента», заимствовать «ДоговорКонтрагнта»

    В форме обработки «ПодборТоваров» расширения для динамического списка «ПодборТаблицаНоменклатуры» в настройке списка в запросе также соответственно изменить договорПлатежногоАгента на договорКонтрагента.

    Reply

Leave a Comment

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