Дополнение в конфигурацию "Торговля и склад" (обновление 30.11.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='\

18 Comments

  1. TrinitronOTV

    маршрутный лист полностью в ручную заполняется или как-то его создание автоматизировано?

    Reply
  2. BorisBelov

    (1) Автоматически (кнопка «Заполнить») для заданного контрагента за установленный временной интервал.

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

    Reply
  3. V.Nikonov

    Есть некоторые вопросы к методике учёта развозов…

    1) Не добавление в маршрутный лист накладных ранее включенных в развоз — ведет к проблемам в случае если в ходе предыдущего рейса не удалось доставить накладную клиенту.

    2) Рейс машины проходит мимо множества клиентов (Торговых точек), и отбирать каждого клиента думается несколько трудозатратно. Может есть смысл отбирать по списку Клиентов попадающих в какой-то район доставки? Например используя механизм свойств (создать Свойство «РайонДоставки»)?

    Reply
  4. V.Nikonov

    В частности механизм доставки в наших конфигурациях создан. При этом Клиенты (Торговые точки) сгруппированы свойствами по районам доставки и по графику доставки (дни недели доставки данному клиенту).

    Кроме того в 1с8 УТ реализован механизм Заказ-Накладная. Это позволяет разделить процесс сбора заказа и реализацию заказа через Сбор на Складе. Печатается свод заказов на клиентов попадпющих под нужные районы и срок доставки, затем начинается бор заказов и погрузка в машину. Только при сборе заказа появляется Реализация.

    В случаях недоставки клиенту накладной (по разным причинам), ставится отметка в МаршЛисте о факте доставки/недоставки.

    По результатам доставки могут возникать корректировки накладных (например клиент отказался от некоторых позиций)… Соответвенно искать нужные накладные для корректировки удобнее через МаршЛист…

    Есть ещё куча отработанных идей…

    Reply
  5. sveta210180

    при попытке создать маршрутный лист прога выдает сообщение

    спрРайоны = СоздатьОбъект(«Справочник.СвойстваДоставки»);

    {Документ.МаршрутныйЛист.Форма.Модуль(543)}: Неудачная попытка создания объекта (Справочник.СвойстваДоставки)

    Что это?

    Reply
  6. BorisBelov

    (5) Неудачная попытка создания объекта Справочник.СвойстваДоставки говорит о том, скорее всего, что в конфигурации НЕТ такого справочника по причине «не поставили галку на него при объединении конфигураций».

    Reply
  7. sveta210180

    Есть справочники :

    Виды районов доставок

    Свойства доставок

    Виды графиков доставок

    автомобили

    Reply
  8. BorisBelov

    (7) Ошибку исправил!

    Reply
  9. anisf

    «Дополнения не мешают обновлению конфигурации!» — за это отдельное спасибо

    Reply
  10. Текстовый

    попробую. что выйдет — отпишу

    Reply
  11. lemaxs

    (5) Неудачная попытка создания объекта Справочник.СвойстваДоставки говорит о том, скорее всего, что в

    sveta210180 31.10.11

    Есть справочники :

    Виды районов доставок

    Свойства доставок

    Виды графиков доставок

    автомобили

    Ответили:

    BorisBelov 03.11.11

    (7) Ошибку исправил!

    Какую ошибку??

    Reply
  12. BorisBelov

    (11) Справочник.СвойстваДоставки и Справочник.СвойстваДоставок. Была разноголосица…

    Reply
  13. lemaxs

    Цитата :

    «Сохраните вашу базу данных в архивную копию.

    2. В режиме Объединение конфигураций… Выберите скачанный файл 1Cv7.MD и отметьте «галками» документ «МаршрутныйЛист», справочники «Автомобили», «ВидыРайоновДоставок», «ВидыГрафиковДоставок», «СвойстваДоставок» и отчет «ОтчетПоМаршрутнымЛистам» (ТОЛЬКО ЭТО!).»

    А в журналы документов разве не надо добавит «Доставка» ? (поставить «галку»)

    Reply
  14. afavor

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

    Reply
  15. Bugor73

    Хорошее дополнение к торговле. Взял за основу…немного доработал под клиента..Спосибо огромное

    Reply
  16. rikony

    возьму и посмотрю

    спасибо

    Reply
  17. Black Cat

    Разработка интересная, но есть некоторые недочеты.

    1. При пометке на удалении документа «маршрутный лист» и создании нового, документы, находящиеся в помеченном на удаление, не подтягиваются в новый.

    2. В идеале нужно отбирать документы реализации не по дате создания, а по дате отгрузки. Но для этого нужно в документе реализация сделать дополнительный реквизит «Дата доставки». Может у нас такая система, но попадаются такие клиенты (особенно бюджетники), которым пакет документов нужен сегодня, а везти нужно через неделю-месяц.

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

    Reply
  18. AlexLM75

    Реализация понравилась. Взял как пример для своей обработки.

    Reply

Leave a Comment

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