Реализация/Перемещение товаров на основании поступления товаров для Управления торговлей 11




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

36 Comments

  1. Поручик

    Добавлен выбор соглашения с клиентом и вида цены при создании реализации

    Reply
  2. alone_d

    как сделать чтобы цена для реализации автоматически заполнялась из табличной части поступления. Цена поступления у нас в любом случае цена продажи. И т.к цены все время меняются цену поступления заполнять нет смысла

    Reply
  3. DimanYa

    Обработка супер, всем рекомендую

    Reply
  4. alone_d

    Спасибо, хорошая обработка.

    Reply
  5. Поручик

    (2) Только сейчас увидел. Попозже сделаю.

    Reply
  6. DimanYa

    Обнаружена ошибка при создании документа «перемещение товаров и услуг». Если в документе поступления есть одна и та же позиция, но в каждой строчке стоит разное количество. Пример: Строка 1 — Нож — 7 шт, Строка 2- нож — 12 шт. То при создания перемещения в табличной части будут следующие строки: Строка 1 — нож — 19 шт, Строка 2 — нож 19 шт. Реализается создаётся без проблем

    Reply
  7. Поручик

    (11) Это уже ваши проблемы. Сами следите за заполнением исходных документов.

    Reply
  8. Поручик

    Добавлен вариант для УТ 11.0.7.8

    Reply
  9. svcoopers

    После последнего обновления УТ будет работать?

    Reply
  10. AlexO

    (16) да, для 11.0.7.13 тестировалось? а то там изменений много….

    Reply
  11. Поручик

    (16)(17) Скачайте да посмотрите сами.

    Reply
  12. Klondaik

    Спасибо за обработку. Очень помогла! С ее помощью разобрался как перепроводить документы из управляемой формы.

    Reply
  13. ulovka

    В релизе 11.0.7.13 при формировании документов по некоторым позициям увеличивается количество товаров. Некорректное заполнение количества происходит и в расходной накладной и в перемещении.

    Reply
  14. Поручик

    (21) Может быть. Заполнение идёт исходя из количества товаров на складе. Финансирование доработки решит проблему.

    Reply
  15. Поручик

    Обновление

    [+] Исправлены некоторые ошибки для обработки релизов УТ 11.0.7.8 и позднее.

    [+] Учтены требования локализации.

    Версия обработки для УТ 11.0.7.2 и ранее не поддерживается, оставлена для любителей старья антиквариата.

    Reply
  16. 1C82

    Спасибо за работу! Уважаю ! Мало специалистов такого уровня выкладывающих свои обработки бесплатно !

    Reply
  17. ZhokhovM

    11.0.8.11

    ошибочка вышла:

    {Форма.Форма.Форма(253)}: Слишком много фактических параметров
    УсловияПродаж = ПродажиСервер.ПолучитьУсловияПродажПоУмолчанию(НовыйОбъект.Партнер, ТекущаяДата(),,, Истина, Истина, Истина);
    Reply
  18. Поручик

    (25) Значит, для управления торговлей 11.0.8.11 нужен свой вариант.

    Reply
  19. Поручик

    (25) Добавлена обработка для Управления торговлей 11.0.8

    Reply
  20. nton

    Офигеть! Почему для такой стандартной в прошлых версиях функции надо писать внешнюю обработку!?! Почему её нет в стандартной поставке?!

    Reply
  21. Поручик

    (28) Сам не понял. Логику 1С тут трудно понять. В УТ 10.3 мы такую операцию очень часто проделывали, товар пришёл и быстро ушёл в том же составе.

    Reply
  22. ov1

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

    Кто-нибудь пробовал?

    Reply
  23. Поручик

    Существует. Курочьте конфигурацию, если есть способности.

    Reply
  24. Поручик

    Вариант для УТ 11.0.8 адаптирован для использования в УТ 11.0.9

    Reply
  25. Поручик

    Что за дебилы, обязательно надо в приват переться, вопросы задавать.

    Reply
  26. Поручик

    Добавлен вариант для Управления торговлей 11.1

    Reply
  27. rasdag

    Для версии РеализацияПеремещениеТоваровОснованииПоступленияУТ11078.epf автоматом количество не заполняется во вновь созданном документе Реализация!

    Reply
  28. Поручик

    (39) Значит, нет остатков на складе. С этим вариантом я разбираться уже не буду, потому что нет базы с УТ 11.0

    Reply
  29. rasdag

    Было бы замечательно что бы документ Реализация создавалась на основе нескольких документов Поступления, при выделении этих документов в списке. Пока что для версии УТ1108, если выбрать мышкой несколько поступлении, и нажать — создать на основании — создается документ Реализация с данными только по последнему документу Поступления.

    Reply
  30. Поручик

    (41) 600 рублей и сделаю.

    Reply
  31. Поручик

    (41) Какая-то ошибка. Реализации формируются для каждого выделенного документа поступления. Сейчас проверил.

    Reply
  32. Поручик

    (41) То есть для трёх поступлений создаются три реализации. Делал несколько раз на типовой конфигурации. Где-то на вашей стороне косяк.

    Reply
  33. rasdag

    Странно. А нельзя что бы для 3-х поступлении создавалась одна реализация?

    Reply
  34. Поручик

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

    Reply
  35. Stas-ch

    В версии УТ 11.3.4 не работает авторегистрация. 🙁

    вместо ДополнительныеОтчетыИОбработки.НазначаемыеОбъектыМетаданныхПоВидуВнешнегоОбъекта теперь ДополнительныеОтчетыИОбработки.ПолучитьВидОбработкиПоСтроковомуПредставлениюВида

    Reply
  36. Поручик

    (47) Будет время, портирую под поздние релизы.

    Reply

Leave a Comment

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