Корректировка движений регистратора




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

15 Comments

  1. yuraos

    ЭХ!

    ЛЮБЛЮ Я ЗАПИСЫВАТЬ ПЕРВЫЕ ПОСТЫ К СТАТЬЯМ!!!

    А ПОЧЕМУ ???

    —————————————————-

    А ПОТОМУ, ЧТО:

    1) Можно смайлов в пост без извратов навставлять.

    2) По спаму рассылаемому сайтом по мэйлу можно подумать — что Я АВТОР ПУБЛИКАЦИИ.

    —————————————————-

    а на будущее — изменять первый пост со смайлами не советую,

    красота проподает — смайлики не отображаются.

    😀 💡 ❓ ❗ 😉 👿 😥 😳 :{} 😎 😮 🙁 🙂 😐

    Reply
  2. yuraos

    Плюс автору за интересное интерфейсное решение.

    Один раз меня угораздило в документе «КорректировкаЗаписейРегистров» под УПП-1.2

    откавычить все регистры накопления в форме настроек просмотра движений…

    …в общем после этого я так больше так никогда уже не пытался делать.



    надеюсь эта обработка при установке флага «без движений» так себя не ведет.

    Reply
  3. yuraos

    (2)

    PS:

    а все-таки, что будет если бух перепроведет документ с подправленными движениями?

    Reply
  4. kapustinag

    (3)

    Хм, это вопрос для проверки базовых знаний, или…?

    Естественно, введенные вручную правки движений при этом пропадут. При перепроведении ведь сначала движения удаляются, а потом заново формируются.

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

    Reply
  5. yuraos

    (4) kapustinag, … нет — это вопрос для поддержания разговора…

    Reply
  6. yuraos

    (4)

    При перепроведении ведь сначала движения удаляются, а потом заново формируются.
    

    это не совсем так, но как правило так.



    и в связи с этим при такой правке движений документа возникает нехорошая ситуация:

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

    и случайное перепроведение

    (без специально предпринятых мер по защите откорректированных движений от изменения)

    приведет к … сами знаете к чему.

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

    не смогут перепровести документ (если на то будет «решение»).

    Reply
  7. Shrek2015

    да… изменение учетной политики и потом перепроведение… будет айс 🙂

    Reply
  8. teller

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

    Reply
  9. yuraos

    (8) teller, согласен.

    Есть тот же самый документ «Корректировка записей регистров».

    там можно отсторнировать имеющиеся движения документа и заново сформировать новые.

    Reply
  10. PanteleevDV

    Ну чтож, я тоже как автор хотел бы немного сказать.

    Да, я согласен что изменение движений опасно, так как при перепроведении документа движения восстановятся.

    Но бывают нетиповые ситуации которых в нашей работе достаточно, ну вот к примеру:

    условие раз: Есть типовой документ который имеет в своем составе и нетиповые реквизиты и не типовые движения.

    условие два: Этот документ завязан с какой то последовательностью (Проведение по партиям).

    условие три: Период закрыт.

    надо изменить нетиповой реквизит, а так же движения по нетиповому регистру.

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

    А можно по другому, открыть типовую обработку «Групповая обработка справочников и документов», изменить реквизит, далее открыть эту обработку (или подобную), поменять интересуещее движение и вуаля все на месте.

    К слову типовая обработка: «Групповая обработка справочников и документов» тоже позволяет менять реквизиты без перепроведения (но ни кто же не говорит что движения уедут после перепроведения). Так что обе эти обработки могут друг друга дополнять.

    Reply
  11. ediks

    (10)Из года в год повторяются такие обработки и снова возникают бурные споры зачем это нужно. В данном случае повторюсь (copy-paste из своего комментария к аналогичной обработке Корректировка движений регистров без перепроведения документов (с возможностью выгрузки в документ «Корректировка записей регистров»)):

    Лучше было бы, если бы эта обработка создавала документ «Корректировка записей регистров». Тогда снимается множество проблем:

    1) С исходным документом можно делать все, что угодно.

    2) Видно что сделано и кого надо подвешивать за всякие места.

    3) Всегда можно отменить сделанное без всяких проблем.

    В этом виде обработка опасна своей неочевидностью.

    Reply
  12. rus128

    (1) не «проподает», а «пропАдает»…

    Reply
  13. Loader_1C

    (12) rus128, да это робот, или шалун набирает посты.

    Reply
  14. Loader_1C

    Он таких сообщений по многим комментариям оставил, вроде и по делу, а приглядишься — спам.

    Reply
  15. yuraos

    (12) (13) (14)

    rus128, Loader_1C,

    прикалывайтеся-прикалывайтеся (если заняться нечем)!

    для кого шаловство, а для кого проверка:

    остался один серьезный баг в функционале сайта или нет.

    Reply

Leave a Comment

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