Обработка "ПродажаСебе"




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

17 Comments

  1. AvalonE2008

    Вещь хорошая и нужная. Но есть одно маленькое но…Представь у меня одна фирма_1 продает товар конечному потребителю, а фирма_2 и фирма_3 являются поставщиками товаров для фирмы 1. Вот и было бы неплохо чтоб происходил анализ продаж за день и перепродажи происходили по фирмам_2 и фирма_3 (на фирму_1).Ведь, согласись не факт что именно у фирма_2 окажется нужное количество товара? Возможна такая ситуация что у одной фирмы товара не будет вообще, будет у другой, или что товар надо взять с обоих фирм, так как не хватает товара по каждой отдельно взятой. Вот эти маленькие но…Сам писал такую для 1С 8.1.

    Reply
  2. pk3-20

    (1) В моем случае в течение дня товары в розницу продаются от Фирмы_2 (поставщика), иначе к концу дня остатки на складе могут стать неактуальными. И непосредственно в момент продажи кассир видит остатки на складах «поставщиков». А обработка потом просто собирает товары в Реализацию Фирме_1 и подменяет фирму в РознПродажах на нее же.

    Как вариант в моем случае если бы было 2 фирмы, сделать кнопку в РознПродаже, анализирующую остатки и проставляющую нужную фирму «поставщика» в самом документе (если хватает у одной) или добавляющую второй документ (если на складах одной фирмы не хватает). А собирать товары из РознПродаж в реализации от поставщиков обработка все равно будет по факту.

    Reply
  3. rvkiselev

    В документ «Продажа собственной фирме» втыкаешь процедуру заполнения ТЧ по нужным видам документов и все. Одна кнопка добавляется. Работает уже в десятке контор… Плюс за смелость

    Reply
  4. alexei_k

    (3) Мало заполнить шапку и ТЧ. 😐

    Если все происходит в одну и ту же «рабочую дату», как у нас, то нужно еще перетасовать время у некоторых видов доков. Я в в самый верх дня поднимаю доки типа поступлений и инвентаризаций, затем все перемещения этого дня, затем только реализация от Фирмы_1 на Фирму_2.

    Reply
  5. V.Nikonov

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

    В любом случае требовалось приводить в соответствие Юридическую сторону собственника товара.

    В обработке использовал заполнение по данным партионного учёта, восполнял дефицит товаров СобственногоЮрЛица. Создавалась пара документов (ПоступлениеТМЦ и РеализацияТМЦ). Дополнительно потребовалось разрешить возможность перезаполнения ранее сделанных документов.

    Reply
  6. Stеls

    А обработка «Пакетный ввод документов» из штатных типовой ТиС чем не устроила?

    Reply
  7. pk3-20

    (6) ну я то свою писал под конкретные цели определенной организации, пока она с тем что требуется вроде должная справляться. Хотя вопрос о перезаполнении ранее сделанных документов уже возник — буду доделывать.

    Reply
  8. pk3-20

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

    Reply
  9. Stеls

    (9) Например. Есть Фирма1, которая занимается закупками. Есть еще фирмы 2, 3 и 4, которые занимаются продажами того, что Фирма1 закупает. Обработка «Пакетный ввод документов» как раз позволяет (режимы «Покупка у собственной фирмы» и «Продажа собственной фирме») сформировать пару документов реализация-поступление между фирмами (Фирма1-Фирма2, Фирма1-Фирма2,Фирма1-Фирма3, Фирма1-Фирма4).

    Мало того, данная обработка позволяет решить и более сложную задачу. Например, Товар1 может быть только у Фирма1, Товар2 у Фирма2, Товар3 у Фирма3, а реализацией всех товаров занимаются фирмы 2,3 и 4.

    Reply
  10. Stеls

    (9) Вы правы! Настоящий программист всегда все пишет сам.

    Reply
  11. pk3-20

    (11) Дело же не в этом. Я только недавно с этим столкнулся и пока очень поверхностно. И 1с даже как пользователь, как теперь понимаю, владею далеко не превосходно, а уж как программист и тем более. Возникла проблема, начал искать решение, нашел подобную для восьмерки. Попробовал написать для 7.7.

    Я же пишу — возможно вы правы, но обработка по-любому гибче.

    А второй момент — продажу собственной фирме пакетный ввод делает. Но у меня товары в течение дня продаются со склада Фирмы1 (просто в печатной форме принудительно стоит Фрма2). И вних после Реализации-Поступления надо еще изменить «Фирму» на Фирму2. Плюс в (4) написал, что еще Реализация должная разбиваться на 2 части по знач. основного свойства, и думаю это не последнее изменениие. Если пакетный ввод это все делает — прошу прощения, был неправ.

    Reply
  12. pk3-20

    (11) Дело же не в этом. Я только недавно с этим столкнулся и пока очень поверхностно. И 1с даже как пользователь, как теперь понимаю, владею далеко не превосходно, а уж как программист и тем более. Возникла проблема, начал искать решение, нашел подобную для восьмерки. Попробовал написать для 7.7.

    Я же пишу — возможно вы правы, но обработка по-любому гибче.

    А второй момент — продажу собственной фирме пакетный ввод делает. Но у меня товары в течение дня продаются со склада Фирмы1 (просто в печатной форме принудительно стоит Фирма1). И после оформления Поступления-Реализации в розничных продажах надо заменить «Фирму» на фирму2. И в (4) написал, что уже добавилось деление Реализации по знач. основного свойства на 2 документа. Если штатная все это делает — прошу прощения, был неправ.

    Reply
  13. Stеls

    (13) Фирму… к сожалению штатный «Пакетный ввод документов» не меняет, правда в этом и нет никакой необходимости, если изначально ставить ту фирму, от имени которой и идет реализация…

    Насчет «деление Реализации по знач. основного свойства на 2 документа» — этого штатная тоже не делает, но и смысл этого пока не понятен…

    Reply
  14. pk3-20

    (14) У той фирмы на складе по всем позициям номенклатуры 0 штук. Товар появляется на складе только после оформления Поступления-Реализации. А насчет деления — бухгалтерии надо, причем надо сильно как я понял, у них свои заморочки.

    Reply
  15. CheBurator

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

    Reply
  16. cronys

    помогла когда появилась ещё одна фирма, еслиб не эта штука головника бы было.

    Reply
  17. balabani

    Взаиморасчёты с контрагентами Розница

    Reply

Leave a Comment

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