Перенос данных между табличными частями одного документа




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

26 Comments

  1. AActor

    гууууд=)

    Reply
  2. ghostishe

    Ага. Давно хотел сделать…

    Reply
  3. hame1e00n

    Зачем же скриншот такой тяжелый? ох-ох-ох… 😉

    Reply
  4. ghostishe

    аа, BMP’шник. сорри =)

    Reply
  5. Поручик

    Спасибо, пригодится как-нибудь.

    Reply
  6. Yashazz

    Уж давно есть такие…

    Reply
  7. ghostishe

    я на инфостарте не нашёл такие…

    Reply
  8. gutentag

    (7) Рекомендую посмотреть обработки таб.частей от e.kogan — много полезных и дельных вещей ❗ http://infostart.ru/profile/41675/

    Reply
  9. ghostishe

    (8) Спасибо, но иногда проще за 6-7 минут написать свою обработочку из 25-30 строк, чем тратить время на поиск.

    Reply
  10. ghostishe

    (8) Кстати, на http://infostart.ru/profile/41675/ есть что-то подобное, боле универсальное, но куча настроек. Там для продвинутых пользователей так и написано. Надо указать в настройке этот же документ и тп… А тут все просто… Все в пределах одного документа…

    Reply
  11. Одинец

    Для реквизита «ТабличнаяЧасть», тип данных «Строка» — длины — 20 явно не хватает, желательно увеличить до 100 хотя бы, чтоб вмещались длинные названия таб.частей (напр. «ДоговорыНаВыполнениеРабот» или «ДополнительныеНачисления»)

    Reply
  12. ghostishe

    Ок, уже заметил. 20 явно маловато. Ща исправим…

    Reply
  13. tatushka

    Скажите пожалуйста, а как можно не перенести данные в другую табличную часть, а добавить? То есть у меня в табличной части «Начисления» уже есть данные, мне нужно туда же перенести данные из табличной части «Дополнительные начисления».

    Reply
  14. ghostishe

    (13) Пока никак. Если хотите, могу добавить, это недолго… Попробую в течение часа.

    Reply
  15. ghostishe

    (13) Добавил. Пробуйте. Сам не проверял, если что — пишите.

    Reply
  16. tatushka

    Попробовала. Получилось. Спасибо! Но у меня осталась маленькая проблема. Дело в том, что я перекачиваю начисления из старой Clipper’овской программы. И, видимо, это моя тактическая ошибка — я переношу начисления и в ТЧ Начисления, и в ТЧ Дополнительные начисления (я их также добавила в разные ПВР — Основные и Дополнительные). Теперь,после использования Вашей обработки, я имею все виды начислений только в одной табличной части — Начисления, причем те, которые были в Дополнительных начислениях, перенеслись без названия. Понятно, почему. Видимо, мне изначально нужно было все виды начислений определить только в одном ПВР. Сейчас уже поздняк метаться, поскольку начисления закачаны с января, и база просто огромная. Че-то я вся в растерянности… Извините за женские сентенции. За обработку однозначно большой жирный плюс.

    Reply
  17. ghostishe

    (16) Да, в документе начисления зарплаты на обеих закладках есть «начисление» — ПВР. Только на закладке осн. начисления тип ПВР «основные», а на закладке доп. начисления — тип ПВР «дополнительные». Так что тут ничего не поделаешь. разные типы данных.

    Reply
  18. ghostishe

    (16) Могу, например, прописать однозначное соответствие для переноса ПВР, если это поможет. То есть при переносе поля «ВидРасчета», если ВидРасчета = «Х», то в новой ТЧ ВидРасчета = «Y». Нужно?

    Reply
  19. tatushka

    (18) Я думаю, мне проще будет перенести мои виды начислений из ПВР «Дополнительные начисления» — в ПВР «Основные начисления». Тогда со спокойной душой применю Вашу обработку.

    Reply
  20. sparta178

    У меня не получается в УПП переносить из вкладки услуги во вкладку товары в док-те поступление товаров и услуг((( . Пишет :

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

    ЭтотДок[Строка.ТабличнаяЧасть].Загрузить(ТЗ);

    ПОМОГИТЕ ПЛИЗ

    Reply
  21. sparta178

    У меня не получается в УПП переносить из вкладки услуги во вкладку товары в док-те поступление товаров и услуг((( . Пишет :

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

    ЭтотДок[Строка.ТабличнаяЧасть].Загрузить(ТЗ);

    ПОМОГИТЕ ПЛИЗ

    Reply
  22. ghostishe

    (21) А у меня получается. Какой релиз?

    Reply
  23. soleveig

    в УПП не получается релиз Управление производственным предприятием, редакция 1.2 (1.2.31.1) 1С:Предприятие 8.1 (8.1.13.41)

    Reply
  24. soleveig

    получилось,спасибо

    Reply
  25. taelita

    пользуюсь очень часто) спасибо)

    Reply
  26. yalo

    полещная вещь, использовала несколько раз

    Reply

Leave a Comment

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