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




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

31 Comments

  1. rybusha

    При заполнении по алгоритму при указании имен конкренных колонок(проверка на условие если <>0 эта колонка то тогда заполняем другую) не работает

    Reply
  2. PaNick

    А какие типы колонок и какой код?

    По идее не должно ни от чего зависеть.

    Reply
  3. Рамзес

    Очень удобная обработка, спасибо! Есть пожелание. При действии «Заполнить значением» хорошо было бы, чтобы в поле «Значение» для выбора выдавались только те типы значений, которые присущи заполняемой колонке.

    Reply
  4. Рамзес

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

    Reply
  5. provnick

    Присоединяюсь к (4) и возможно ли запоминание последнего кода и вида документа, пришлось обрабатывать несколько документов и каждый раз выбирать один и тот же вид документа и копировать один и тот же произвольный алгоритм, и подключаю через севис — подключение внешних обработок, никак не появляется, а так +

    Reply
  6. PaNick

    (3), (4), (5) — вроде все сделал

    Reply
  7. zzerro

    Попробуемс что за зверь, а пока плюс авансом 😉

    Reply
  8. zzerro

    Попробовал… При заполнении значением колонки, содержащей тип строка, дает ввести не более 10 символов…. Я так понимаю не совсем корретно определяется тип реквизита

    Reply
  9. zzerro

    А было бы вообще замечательно, еслиб еще в выборе колонки отображалось бы не имя а например синоним реквизита или колонки табличного поля, или и то и другое

    Reply
  10. zzerro

    И чтоб можно было выбрать только видимые колонки, для пользователей без полных прав (защита от дурака так называемая). А то ведь можно понаккорректировать….

    Reply
  11. Arbi

    Спасибо!

    Reply
  12. AdvP

    полезная штука!

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

    Reply
  13. zzz_natali

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

    Reply
  14. WildFire
    zzerro пишет:

    Попробовал… При заполнении значением колонки, содержащей тип строка, дает ввести не более 10 символов…. Я так понимаю не совсем корретно определяется тип реквизита

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

    Reply
  15. WildFire

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

    Reply
  16. Elaks

    Хорошая обработка. Очень помогла, но пришлось немного доработать: поставил галочку для автоматического проведения документа.

    Reply
  17. rush11

    Очень хорошо!

    Помогла нам, при разукомплектовании товаров на составные части. Сколько времени сэкономили 🙂

    Reply
  18. hmv59

    Обработка помогла, спасибо, все очень хорошо.

    Reply
  19. karbofos

    Обработку пользую постоянно. Очень полезная весч. Автору отдельный респект.

    Reply
  20. Elena_Q

    Интересная задумка, думаю, много где пригодится. Спасибо!

    Reply
  21. Acasta

    Спасибо, пригодилась!

    Reply
  22. SERJ_1CC

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

    Reply
  23. Ionmuerto

    Данная обработка подойдет к 1с 8.2 Бух предп 2.0 при конвертации? Смогу ли я с помощью обработки умножить цену на количесто и получить в 3-ю колонку Сумму?

    Reply
  24. PaNick

    Смущают слова «при конвертации». Насчет 2.0 точно сказать не могу, не проверял. Но думаю должна также подключаться и работать.

    Reply
  25. IrrI

    То, что нужно

    Спасибо!

    Reply
  26. vprus

    Спасибо! Много раз помогала.

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

    Reply
  27. esoldatov

    Отличная публикация, хочется посмотреть, а баллов не хватает, блин, что же сделать… 🙁

    Если бы сам смогу разобраться с:

    Для Каждого … Из … Цикл

    и т.д. тогда не скачивал бы…

    Reply
  28. master_yoda

    Шикарная вещь….особенно порадовал произвольный алгоритм….

    Плюс плюсевич )))

    Reply
  29. silver-747

    Супер! Очень понравилось! Спасибо 🙂

    Reply
  30. SerGam

    Очень нужная вещь, тем более с произвольным алгоритмом…

    Спасибо !!!

    Reply
  31. salo2005

    Для УПП не подходит!

    Reply

Leave a Comment

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