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




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

19 Comments

  1. владимирп

    Идея очень понравилась. Попробую, будет ли работать на УПП. Если да, то ей цены не будет.

    Reply
  2. WKBAPKA

    (1) владимирп,

    +1 идея хорошая

    Reply
  3. ИльяЕвгеньевич

    идея хорошая, только я не понял она по 1 регистру только различия выводит?

    Reply
  4. catena

    (1)Будете тестировать, посмотрите, плиз, регистр ПартииТоваровНаСкладах (бух/упр не важно) — что-то они там намудрили в проведении, копаюсь пока. Остальные регистры должны работать.

    Reply
  5. catena

    (3)Надо по всем сразу? Надо подумать, как это по-человечески скомпоновать на форме.

    Reply
  6. alekseies

    Идея хорошая. используем на УПП.

    Reply
  7. Збянтэжаны Саўка

    Идея хороша! +!

    Вот здесь:

    Процедура ЗаполнитьСписокНажатие(Элемент)
    СписокДокументов.Очистить();
    
    ИмяРегистра = ВыбранныйРегистр; //<— а если не выбран )
    
    ТекстЗапроса = «ВЫБРАТЬ Документы.Ссылка ИЗ («;
    Для Каждого Документ Из Метаданные.Документы Цикл
    Если Не Документ.Движения.Содержит(Метаданные[ТипРегистра][ИмяРегистра]) Тогда
    

    Показать

    Ошибка при не выбранном регистре:

    {Форма.Форма.Форма(89)}: Получение элемента по индексу для значения не определено

    Если Не Документ.Движения.Содержит(Метаданные[ТипРегистра][ИмяРегистра]) Тогда

    надо проверять на заполнение ВыбранныйРегистр )

    а лучше в ПриОткрытии() вставить:

    ТипРегистраПриИзменении(Неопределено);

    Reply
  8. bigono

    идея хорошая.

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

    переделал на один макет выводит — мне стало удобней

    Reply
  9. AlexO

    Неодназначная публикация.

    С одной строны — красивенько, живенько, по-женски, даже розовые цвета не остались за кадром.

    С другой — а зачем видеть изменения, если все равно не знаешь, «как слово наше отзовется» («Нам не дано предугадать, Как слово наше отзовется (с)«).

    В каких регистрах что будет — так есть кнопка «Движение документа по регистрам», там все движения для однотипных документов одинаковые.

    Что «вот ничего нет в поле регистра — а вот теперь будет количество 3» — тоже невнятно как-то, для чего такое нужно.

    (1) владимирп,

    Если да, то ей цены не будет.

    «Ты знаешь, почему Джо называют «неуловимым»?

    — Никто не может поймать?

    — Нет, просто …..»

    Ваш ответ?

    (8) bigono,

    а документов очень много — решил год перепровести.

    … и увидели бессвязное нагромождение цифр из документов за год в одном месте. И что дальше с ними делать будете? Какой анализ проводите, вывод сделаете?

    «Как много цифр у нас за год накопилось»? 🙂

    Reply
  10. bigono
    … и увидели бессвязное нагромождение цифр из документов за год в одном месте. И что дальше с ними делать будете? Какой анализ проводите, вывод сделаете?

    «Как много цифр у нас за год накопилось»? 🙂

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

    нашёл — перемещение.

    Reply
  11. AlexO

    (10) bigono,

    т.е. вам просто нужно было найти «нетипичный» документ, который сделал проводки по выбранному регистру?

    Reply
  12. catena

    (7)Действительно, исправлю.

    (8)Ну, мне было удобнее каждый документ отдельно.

    (9)Чем не угодил вам розовый цвет? 🙂

    Когда мне реально пригодилось — были документы Амортизация на 60 тыщ строк. Надо было у десятка ОСов сменить некоторые параметры. Вот и оценивали — можно ли просто перепровести или заморачиваться индивидуальной правкой регистров.

    А так реализация была развлечением, отдыхом от работы. Интересно было попробовать динамическое формирование элементов форм.

    Зачем выложила? Честно? Пополнить баланс $m — у меня рабочий аккаунт с которого тяну обработки по запросам коллег 🙂

    Reply
  13. AlexO

    (12)

    А так реализация была развлечением, отдыхом от работы.

    ну вот на эту причину я вас и выводил 🙂

    Ибо сразу видно назначение данной обработки )))

    Reply
  14. AlexO

    (12)

    Зачем выложила? Честно?

    ну на это можно и плюс поставить.

    А также — за оправданное применение розового цвета с учетом целевой аудитории )))

    Reply
  15. catena

    (14)Спасибо 🙂

    Reply
  16. AlexO

    (15)

    так а что будет

    …если в микроволновку положить яйцо?

    Вареное? :))))

    Reply
  17. catena

    (16)

    О, сколько нам открытий чудных

    Готовят ….

    опыт, сын ошибок трудных

    ….

    😉

    Пробуем, наслаждаемся.

    Reply
  18. b-dm

    Здравствуйте. А для 8.2 и 8.3 не делали?

    Reply
  19. catena

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

    Reply

Leave a Comment

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