Номенклатура (Расширенная форма списка) и Корзина [Расширение]




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

48 Comments

  1. orfos

    Очень круто! Я все думал как можно на практике использовать расширения. Оказывается можно такие интересные вещи делать. Мне кажется такая корзина будет актуальна для управления торговлей и розницы.

    Reply
  2. dmt

    Гм. А есть реальные пользователи которым данный подбор оказался удобен?

    Reply
  3. mkostya

    Понравилась, жаль что у нас УТ 10.3

    Reply
  4. the1

    Реально, выглядит очень круто!

    Reply
  5. masterkio

    Если кто не видел советую посмотреть доклад по УНФ 16

    УНФ 1.6

    Мне очень понравилась подача материала.

    Reply
  6. mrXoxot

    (1) orfos, (5) masterkio,

    Да, идея и часть реализации взято именно из УНФ 1.6.

    Они придумывают прикольные штуки.

    Поэтому захотел их задумки реализовать и в БП3.

    Reply
  7. mrXoxot

    (3) mkostya, (4) the1,

    Спасибо!

    Reply
  8. Bassgood

    Выглядит симпотично! 🙂

    Reply
  9. VodoleyPlus

    Хочу такую для Розницы

    Reply
  10. kuzyara

    Похож на UI/UX Яндекс.Маркета, и это здорово!

    Reply
  11. ako

    Будет ли работать в УТ 11?

    Reply
  12. mrXoxot

    (11) ako,

    Нет. Это расширение для БП3.0

    Планы по другим конфигурациям есть, но сроки не определены.

    Reply
  13. ako

    (12) Жаль! Самое то для УТ 11.

    Reply
  14. proger1c81

    Хорошая идея. У меня все юзеры всегда хотят в одном окне видеть остатки по каждому складу. Я бы добавил на эту форму две колонки с остатками: «Остаток» и «Остаток общий по компании». А также снизу нужно добавить табличную часть со складам, где будут отображаться остатки по всем складам при активизации товара в основной таблице.

    Reply
  15. MaxS

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

    Сделал расширение для УТ 11, чтобы как в УТ 10.3 отображались бы картинки и остатки в форме списка номенклатуры. Но расширение зависит от версии конфигурации.

    Reply
  16. AndyKKKK

    (15) MaxS, Где можно посмотреть? Публикация есть?

    Reply
  17. _KaA

    А чем эта форма отличается от формы номенклатуры в УНФ? Ну кроме того. что ее вынесли в обработку?

    * имеется в виду есть ли какие то дополнительные плюшки?

    Reply
  18. mrXoxot

    (17) _KaA,

    Функциональность как в УНФ.

    Новые плюшки пока не добавлял.

    Reply
  19. tumr

    (17) _KaA

    Reply
  20. HDRX

    Очень

    Reply
  21. pro1c@inbox.ru

    Мне нравится!

    Reply
  22. OlegBog1971

    Разработка хорошая, но есть пару пожеланий:

    1. Добавить на форму выбор организации, по которой показываются остатки

    У нас в конфигурации несколько организаций, а склад для них один.

    Когда открываем справочник Номенклатуры, то видим остатки по организации, которая установлена как основная.

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

    2. Очень не хватает отбора документов по конкретной номенклатуре

    Выбрал товар, нажал на кнопку и появился список документов, в которых фигурирует данный товар.

    Reply
  23. mrXoxot

    (22) OlegBog1971,

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

    Первое пожелание хорошее — постараюсь реализовать.

    По второму можно чуть больше и подробнее?

    Что-то типа списка документов, в котором присутствует данная номенклатура? Кажется, это будет очень тяжелый отбор для списка. Отчет такой сделать проще.

    Reply
  24. OlegBog1971

    по второму … предлагаю сделать так же как вы сделали в «Контрагенты (расширенная форма списка)», где есть кнопка в виде гиперссылки «Документы»

    Reply
  25. hotey

    (12) +100 за такую же для УТ 11!!!

    Reply
  26. mrXoxot

    Друзья!

    Я планирую начать заниматься расширением для УТ11.

    Кто хочет помочь, то как бы вот. Помочь автору с расширением.

    Reply
  27. hotey

    (26) «помог». 🙂 Когда примерно ожидать расширения?

    Reply
  28. mrXoxot

    (27) hotey, спасибо!

    Всем остальным кто помог тоже спасибо!

    Сроки пока назвать не готов. Начать разрабатывать прототип планирую в эти выходные. А там как пойдёт.

    Reply
  29. mrXoxot

    Добавил в расширение управление отбором по организации.

    Остатки по номенклатуре теперь можно смотреть в разрезе организаций.

    Также, выбранная организация передается в документ, созданный через корзину.

    Reply
  30. webresurs

    Добавить в панель документ Требование-Накладная так же просто как и в расширение Контрагента?

    следует добавить новую команду с кодом:

    СоздатьДокумент(«СчетНаОплатуПокупателю»);

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

    Или есть особенность?

    Reply
  31. mrXoxot

    (30) webresurs,

    Здесь немного сложнее.

    Посмотрите как сделано в форме документа СчетНаОплатуПокупателю()

    В расширении переопределено событие ПриСозданииНаСервере(), где загружается переданная номенклатура.

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

    Reply
  32. webresurs

    (31) не понял, но попробую.. )))

    Reply
  33. kentman

    (28) Привет. Подскажи пожалуйста, ты еще не сделал расширение для УТ 11?

    Reply
  34. mrXoxot

    (33) kentman,

    Я в процессе. Думаю, скоро будет готово.

    Reply
  35. mrXoxot

    (1) orfos, (11) ako, (16) AndyKKKK, (25) hotey, (33) kentman,

    Расширение для УТ 11 готово!

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

    Reply
  36. brrart

    (35) А для Розницы 2.2 ждать?

    Reply
  37. mrXoxot

    (36) brrart,

    Пока не знаю.

    Reply
  38. mrXoxot

    Обновил расширение до версии 1.3

    Исправлена ошибка — использовалась неправильная дата для определения остатков номенклатуры.

    Reply
  39. mrXoxot

    Обновил расширение.

    В новой версии поддерживается работа с Бухгалтерия 3.0.44

    Reply
  40. wumka

    Спасибо большущее за работу.

    Очень нравится работать с корзиной, производительность повышается. Печалит только одно: нет возможности создать из Корзины счёт от Поставщика.

    Зачастую сначала создаётся Счёт от Поставщика, уже на его основании — Поступление от Поставщика. Тем, кто ведёт в программе счета от Поставщиков, было бы очень удобно заполнять их из Корзины.

    Reply
  41. mrXoxot

    (41) wumka,

    Спасибо за оценку! Очень приятно.

    Про счет поставщику записал пожелание.

    Reply
  42. user695247_acido86

    Здравствуйте. Очень полезное расширение! Но вот незадача, при обновлении с ERP 2.2.2.x на 2.2.3.x перестали открываться счета и создаваться заказы клиентов, пришлось удалить расширение. Прикладываю ошибку.

    Reply
  43. mrXoxot

    (43)

    Добрый день, Ярослав.

    Эта ошибка исправлена в новой версии расширения.

    Кстати, это публикация расширения для Бухгалтерии.

    А Вам нужно — http://infostart.ru/public/517821/

    Reply
  44. Nicrus

    А ЭТО РАСШИРЕНИЕ ДЛЯ КАКОЙ 1С?!?!?!? МОЖНО БЫЛО И НА НАЗВАНИЕ ОБ ЭТОМ НАПИСАТЬ!

    Reply
  45. user1150296

    Здравствуйте я купил вашу обработку но при подключение выдает вот такой ошибку

    НоменклатураРасширенный (1.11): Критичная: Не найден объект ФункциональнаяОпция.ИспользоватьУчетНДС

    Reply
  46. mrXoxot

    (46) Добрый день, в ближайшее время выпущу обновление

    Reply
  47. mrXoxot

    (46) Добрый день.

    Подскажите, пожалуйста, Вашу версию конфигурации?

    Вероятно речь идет об Управлении торговли?

    Если это так, то лучше вести обсуждение в этой публикации — https://infostart.ru/public/517821/

    Reply

Leave a Comment

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