Подсистема: История изменений реквизитов объекта, в том числе табличных частей. 1с 8.2.




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

15 Comments

  1. dyak84

    Автор подскажите пожалуйста если просто сменю сортировку в табличной части ваша обработка покажет изменения. Предусмотрена ли выгрузка создаваемого регистра в другую базу(с практики размер етого регистра может может составлять 60 и более ГБ). Зарание спасибо за ответ.

    Reply
  2. allert73

    нет не покажет т.к. номер строки это поле табличной части.

    Насчет 60 ГБ для того чтобы регистр достиг подобных размеров записывать изменения придется очень долго.

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

    В данной выложенной подсистеме подход совершенно другой. Здесь при внесение изменений в объект в регистр сведений записывается только информация о том у какого документа, коркой именно реквизит был изменен, ну и естественно автора(виновника) изменения и время когда данной действие было произведено. Создается одна запись в регистре с неопределенными типами измерений, которая хранит в себе ссылки на объекты базы, т.е. 5 текстовых полей не более 50 ти символов. Это занимает очень мало места и легко обрабатывается в дальнейшем.

    Reply
  3. qvvert

    А можно 8.1 приложить? заранее спасибо

    Reply
  4. allert73

    (3) qvvert, Извиняюсь что ввел в заблуждение заголовком статьи(заголовок я исправил). к сожалению подсистемы написанной под 8.1 нет. Но вы можете создать у себя аналогичные подписки на события и скопировать туда тексты модулей Важно!!!(копирование объектов копи псейтом целиком из дерева конфигурации, может привести к повреждению конфигурации, поэтому копируйте только текст модулей).

    Также рекомендую вам перейти на 8.2. конвертация данных не займет много времени и в большенстве случаев проходит безболезненно. Кроме того(если ваш случай окажется болезненным), после конвертации можно включить режим совмещенности с кодом работающим только на 8.1, до того как куски будут скорректированы, что позволит не прерывать работу системы. А возможность проводить динамические обновления вас приятно обрадует

    Reply
  5. _Ramzes

    Подскажите пожалуйста, чем ваше приложение лучше решения, которое предлагает Бизнес Плюс?

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

    Reply
  6. allert73

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

    Reply
  7. neon57

    А как насчет очистки истории по периодам?

    Reply
  8. allert73

    (8) neon57, Добавил в версию 2.

    Reply
  9. sergey301

    А чем данная разработку лучше подсистемы версионирования в БСП?

    Reply
  10. allert73

    Тем что в моей подсистеме не полная сохраняется верися объета в виде XML файла переведенного в двоичные данные. А сохраняются только значения и только измененных реквизитов. А это в свою очередь облегчает анализ внесенных изменений и не приводит к неоправданному(из за обилия не нужной информации) разрастанию базы.

    Reply
  11. BurSer

    Сделайте, пожалуйста, чтобы можно было включать только новые, или только удалённые, или только изменённые строки. И краткую форму истории изменений (только кто , когда и % изменений).

    Reply
  12. Kott01

    Поправьте пожалуйста: вместо hystory_2.cf скачивается hystory_3.cf, а hystory_2.cf не нашел. Нужно было для УТ 10.3

    Reply
  13. progaoff

    Подскажите, эту подсистему можно интегрировать, с конфигурацией Салон красоты???

    Reply
  14. bsa1968

    Не планируете добавить фиксацию изменений Констант, чтобы т.с. было «все в одном флаконе»?

    Reply
  15. nordcomp

    Спасибо. Использовала вашу конфигурацию на Платформе 8.3.10 для УПП 1.3+СРМ. Заменила некоторые вещи. Код очень понятный и читабельный.

    Отказалась от записи новых документов и справочников, а так же запись при каждом проведение тоже переделала (нас интересуют только изменения, которые меняются, те теперь при проведение он смотрит, был ли документ до этого проведен или нет). Пользователям более читабельно и информативно, чем Журнал регистрации и проверка отчетов)))

    Reply

Leave a Comment

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