Ошибки партионного учета (для Украины)




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

21 Comments

  1. Romarius

    В таком случае лучше прописать контроль партий при копировании

    Reply
  2. dobraleks

    (1) над этим уже задумался, вот решил год закрою и сделаю условие такое.. 🙂

    Reply
  3. stagov

    «…Кому помогло не поскупитесь поблагодарить «+ «….»

    а кому это может помочь???

    в смысле — этот список ошибок.

    Reply
  4. stagov

    а таблицу значений создать ???

    загнать туда доки с багами, с возможностью открыть и т.д….

    Reply
  5. dobraleks

    (3) если вам не подходит, это не значит что другим не нужно..

    на каждый товар найдется свой покупатель…

    Reply
  6. stagov

    ага навоз то же селяне покупают поля удобрять… это к тому, что «на каждый товар найдется свой покупатель…»

    мне больше нравится девиз «сделай как я, сделай лучше меня…»

    Reply
  7. dobraleks

    (6) «Сделай как я» -это так ….

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

    Я правильно понял Вас??

    Reply
  8. stagov

    1.Бух.учет для Украины от захода не позволяет делать подобные вещи «копировать строки в документах, но забывают перещелкивать партии. Вот и получается что на елементе может висеть 2 ,а то и 3 «партии по умолчанию», или партия принадлежит другому елементу справочника»

    2.Если это все таки возможно…

    Пример. предприятие с оборотом 300 доков в день. штат операторов-менеджеров набивающих доки.

    КАК вашим отчетом можно это исправить???

    Вы представляете сколько на это нужно времени??? При вышеуказанном объеме.

    см. п.4

    Reply
  9. dobraleks

    (8) че вы мне будете расказывать что «невозможно», возмите последний релиз бухни для Украины (на данный момент если вы в курсе 277) и смодулируйте ситуацию!! например на доке операция №5…

    Если вы не знаете, то это уже другой вопрос..

    У меня бухи (их больше 18), хитрые и «умные», они еще и не такое умудряются сотворить..

    Данный отчет реализован пока именно как «ошибки партионного учета» , а если позволит свободное время далее в планах реализовать именно ИСПРАВЛЕНИЕ АВТОМАТОМ..

    P/S/ Вы хоть пробовали у себя запускать??

    на ваш 2 пункт, хороший совет дал (1), себе с нового года буду реализовывать чтоб не было подобных ситуаций..

    Reply
  10. v.l.

    Всем: Ну и чего ругать? Это же не очередной перенумератор.

    Reply
  11. stagov

    я даже в курсе, что Выпущен релиз 7.70.015 конфигурации » Торговля+Склад для Украины». и релиз 7.70.031 конфигурации «Бухгалтерия + Торговля + Склад + Зарплата + Кадры для Украины».

    Отчет запускал и в ООО «Добро» и еще в 20 базах — никакого результата.

    а что такое «…например на доке операция №5… »

    пытался нагло допустить подобную ошибку — не дает данная процедура накосячить

    Процедура ИзмТМЦ()

    Если ТМЦ.Выбран()=1 Тогда

    глУстановкаБазЕд(Контекст,ТМЦ);

    // если партия этого ТМЦ уже есть, не будем ее трогать

    Если Партия.Выбран() = 1 Тогда

    Если Партия.Владелец <> ТМЦ Тогда

    глПолучитьПартиюПоУмолчанию(Партия,ТМЦ);

    КонецЕсли;

    Иначе

    глПолучитьПартиюПоУмолчанию(Партия,ТМЦ);

    КонецЕсли;

    УстЦенаБезНДС();

    ИзмЦенаБезНДС();

    КонецЕсли;

    КонецПроцедуры

    или

    Обнаружены одинаковые ТМЦ (партии) в строках 1 и 2

    Reply
  12. stagov

    еще пока ни кто и не ругал.

    Reply
  13. dobraleks

    (11) пример допускания наглой ошибки!.

    только что взял 277 демку и тупо допустил ошибку следующим образом.

    1. Запустил отчет понятно что ошибок нету.

    (рис1.) (рисунки смотри выше 3,4 и 5 миниатюры).

    2. Док операция №5. Добавляю стоку Дт 201 Главный магазин- Авансовый платеж — партия по умолчанию (партия принадлежит авансовому платежу).

    3. Добавляю еще одну проводку по Кт 201, Главный магазин-Авансовый платеж-партия по умолчанию. (партия принадлежит Авансовому платежу), !!!! Потом меняю авансовый платеж на «АРЕНДУ»»» партию не перещелкиваю. (рис2)

    4. Запускаю отчет, внизу сообщает что партия по Умолчанию в аренде принадлежит Авансовому отчету!!

    (рис3.)

    Показал чтоб было видно Дт и Кт, также само происходит когда копируют строки например по Дт201, Тмц-поменяли, а партию забывают перещелкнуть, вот и получаются такие ошибки.

    Reply
  14. stagov

    «Очень часто бухи любят копировать строки в документах,….»

    копировать строки в документах и проводку в Операции это принципиально разные вещи по ходу

    По терминам в документе операция копируется не строка а проводка.

    Reply
  15. dobraleks

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

    Вывод один. Проблема такая бывает, решать ее как то надо, а кто как копирует это уже второстепенное.. 🙂

    Reply
  16. stagov

    Я улучшил Вашу обработку и если Вы не против (т.к. интерфейс и часть кода Вашего создания) — могу выложить.!?

    Reply
  17. dobraleks

    да без проблем! одна голова хорошо а 2 лучше..

    За идею хотя б поблагодарили.. 😉

    Reply
  18. stagov

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

    Reply
  19. dobraleks

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

    вопрос не в том хорошие спецы или нет, а в человеческом факторе..

    Reply
  20. stagov

    Я еще более апгрейдил Ваш отчет.

    Если есть возможность — проверьте функциональность кнопки «Выполнить»

    http://infostart.ru/public/64439/?PAGEN_1=1#comm345021

    Reply
  21. tmm

    Как бы ещё научиться в нём работать.

    Reply

Leave a Comment

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