ТиС: Ведомость по отрицательным (минусовым) остаткам ТМЦ




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

23 Comments

  1. Поручик

    Вообще-то за отрицательные остатки положено 3.14zditь ржавой лопатой, так как это говорит о:

    1. снятом контроле за остатками,

    2. блудливых ручонках юзеров, распроводящих доки поступлений-перемещений.

    3. толпоопстве руководителя, глбуха, админа, не следящими за правами доступа юзверей.

    4. ……..

    Reply
  2. jk3

    (1) Да кто ж спорит, только вот практически в каждой базе ТиС есть такие косяки, и чем оперативнее их выяснять (допустим, запуская отчет каждую неделю), тем легче вставить люлей тем, кто накосячил

    Reply
  3. Altair777

    (2) Восстановление последовательности все и так выявит 🙂

    Reply
  4. vovan519

    (3) Абсолютно верно. Но речь об оперотивности и об удобстве. Выявив в течении дня отрицательные остатки, вставив люлей, исправив и включив на ночь востановленние последовательности мы получим НА УТРО РЕЗУЛЬТАТ отличающийся от просто ночного востановления последовательности.

    Reply
  5. Altair777

    (4) разумно

    Но есть несколько «но» 🙂

    1) Если запускать этот отчет только за текущий день, то как проконтролировать изменения задними числами?

    2) Есть возможность автоматического выбора начала анализа с позиции последовательности?

    3) Если надо будет, то еще придумаю 😉

    Reply
  6. jk3

    (3) ну да-да, только все ли двигают эту самую границу последовательности?

    Большинство просто не знают что это такое и для чего нужно, игнорируют предупреждение в отчетах.

    Или как вариант: попробовали восстановить последовательность, оно заткнулось и больше не стали пробовать — и так ведь работает

    Вариант 2: пару лет работали и не двигали ГП, теперь уже поздно пытаться двигать, т.к. восстановление последовательности переносит ТА на границу последовательности, а магазин работает каждый день 🙂

    Reply
  7. jk3

    (4) да, кстати, можно и так

    получается как просмотр предварительного результата, восстановится последовательность или заткнется ночью

    Reply
  8. jk3

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

    наверное добавлю 2 выбора начальной даты:

    1) дата запрета редактирования

    2) дата границы последовательности

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

    Reply
  9. Altair777

    (7) вот-вот 😀

    но последовательность может заткнутся не только из-за отрицательных остатков по товарам. А и из-за отрицательных остатков на счетах/кассах (только не спрашивайте меня зачем в последовательности есть такие документы 🙂 ).

    Смотря какие документы входят в последовательность и сколько вообще есть последовательностей.

    Поэтому если делать, то уже делать с учетом всех нюансов учета.

    Reply
  10. Altair777

    (8) Дата запрета редактирования тоже может быть разной.

    По разным видам документов и по разным наборам прав/ролей.

    Например, администратор БД может изменять любой документ.

    И это правильно! 🙂

    Reply
  11. Altair777

    +(10) в начале должно было быть (8 )

    Reply
  12. jk3

    (9) насчет нюансов — это отчет для типовой ТиС, и imho основная причина затыков восстановления основной последовательности — это отсутствие остатков ТМЦ

    Reply
  13. jk3

    (10) тоже самое, в типовой ТиС одна дата запрета редактирования, а администратор тоже может наделать косяков

    а вообще основная идея — это это сканировать периоды (например, по месяцу), начиная с самого первого дока в базе и если минусов нет, то двигать дату запрета редактирования, чтобы отрицательные остатки и не могли появится

    Reply
  14. Altair777
    Reply
  15. Altair777

    +(13) Из-за этого — минус

    Reply
  16. Altair777

    +(14)

    упс…. Эти ошибки были из Украинской ТиС

    Reply
  17. jk3

    (14) в принципе, я могу сделать так, чтобы из отчета не было вызовов к глобальным функциям, включив их в модуль, но смысла в этом не вижу, т.к. запрос ориентирован именно на ту структуру регистров ОстаткиТМЦ и РезервыТМЦ, которые есть в типовой ТиС

    (16) то-то же

    Reply
  18. Altair777

    (17) Можно и адаптировать под украинские регистры.

    Украинских пользователей много….

    Если Вам лень, могу и я сделать. А если не лень, могу дать необходимую информацию 😉

    Reply
  19. jk3

    (18) мда, посмотрел я эту типовую ТиС для Укранины….

    печальное зрелище, чего стоит только регистр РезервыТоваров без измерения Фирма 🙁

    Так что Altair777, хочешь, делай для украинских пользователей и выкладывай, они оценят. Я для Украины заморачиваться не буду.

    Reply
  20. Altair777

    (19) Все слышали? Я первый застолбил 🙂

    А насчет недостатков украинских конфигураций все претензии фирме «1С» в Москве 😉

    Она же отдала из разработку «ABBYY Ukraine».

    Reply
  21. bes-kkm

    Если честно у меня эта обработка не заработала.

    Reply
  22. jk3

    (21) А можно поподробнее, что вы понимаете под «не заработала».

    Если за выбранный период в базе нет отрицательных остатков, то она и не покажет ничего.

    Это очень хорошо!

    Reply
  23. Lenston

    Может минусов нет, вот и не заработала:)

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

    А бывает и такое чудо, когда есть ЦБ и РБД и там и там умудряются провести один документ, но по причине префикса уникальность не нарушается, а только сползают остатки в минус.

    в больших конторах такое отследить проблематично сразу.

    А вот данным отчетиком легко:)

    Reply

Leave a Comment

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