Модуль "Представление табличной части в виде дерева" v1.01




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

23 Comments

  1. mzelensky

    Идея интересная, но я ожидал большего!

    1) Сделай более понятную и наглядную инструкцию (лично я довольно долго думал над тем, что ты имеешь в виду «К обработчику события «ПриСменеСтраницы», панели «ПанельТовары», подключаем созданный из пункта 10 обработчик.»)

    2) Модуль не дописан — дерено формируется, но работать с ТЧ из дерева нельзя, следовательно использовать его можно для «посмотреть»…это я могу и в отчете сделать. Хотелось бы иметь полный функционал (добавлять строки, изменять данные) Дерева. В этом случае сама ТЧ использовалась бы чисто для хранения данных (ее можно было бы даже скрыть вовсе и работать чисто с деревом).

    Reply ↓
  2. mzelensky

    3) добавь в Cf-ку один док с реализованным механизмом (для наглядного примера).

    Reply ↓
  3. boggonzikov

    (1) mzelensky,

    ок, в планах есть, только времени нету 🙂

    Reply ↓
  4. Strange Device

    Согласен с (1) просто посмотреть в виде дерева — не интересно. Хотелось бы полную работу с деревом — добавление, редактирование и удаление подчиненных строк…

    Reply ↓
  5. boggonzikov

    (4) Strange Device,

    Редактирование строк поддерживается. Остальное в планах.

    Reply ↓
  6. luns

    тема нужная.

    с позволения, добавлю ссылку на аналог: http://infostart.ru/public/16408/

    Reply ↓
  7. itek.09

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

    Reply ↓
  8. Sintson

    Мой аналог, теме крестик, для 8.2 видимо тоже придется подумать, динамический список не очень подходит для использования визуализации в табличной части.

    http://infostart.ru/public/73969/

    Reply ↓
  9. boggonzikov

    (6) (8) У вас представлены куски, как из таблицы получить дерево. Я предлагаю универсальное готовое решение ( модуль, класс). И считаю главной фишкой модуля, это работа обработчиков табличного поля табличной части.

    Reply ↓
  10. Sintson

    (9)ну чтож, раз уж критикуете, обработчики, это как раз не универсальное решение, например в РЖД, в их генподряной организации, где работает все, а не модуль, что я представил, тоже используются обработчики, там ОЧЕНЬ большие объемы данных и пересчет я не представил, т.к. это частный случай.

    к вопросу о критике, мне, как профессионалу, в общем — то, все равно что у вас там за «фишки», было интересно решение в принципе, ничего интересного, касаемо тематики, не нашел, судя по всему работаете недавно, и оригинальных решений немного.

    Думаю сообществу более интересны универсальные «высушенные» тексты, ваш вариант интересен как пример не более.

    Reply ↓
  11. boggonzikov

    (10) Sintson

    После заявлений

    [quote] мне, как профессионалу [/quote]

    мне с Вами общаться не интересно.

    Я предложил решение, кому интересно тот найдёт то что ему нужно.

    Reply ↓
  12. Nicenick

    Доработать конечно надо, но идея очень интересная.

    Reply ↓
  13. Rustig

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

    Reply ↓
  14. boggonzikov

    (14) Rustig, (15) Rustig, Рекомендую внимательно прочитать публикацию, подумать, скачать приложенные файлы, потом думать и изучать, изучать и думать. Если не понятно обратиться за помощью.

    Reply ↓
  15. sinQio

    хорошая идея, теперь хочется самой такое реализовать

    Reply ↓
  16. milliondeneg

    Как сделать груперовку по 2м колонкам?

    добавил строку в список груперовок ничертане работает.

    Процедура ИнициализироватьДеревоТовары() Экспорт

    СтруктураПараметров = Новый Структура;

    СписокГрупп = Новый СписокЗначений; //Список имен колонок группировки

    СписокГрупп.Добавить(«Товар»);

    СписокГрупп.Добавить(«Количество»);

    Reply ↓
  17. mehalyna

    Читать публикацию надо повнимательней. Хорошая идея. Огромное спасибо!

    Reply ↓
  18. Manticor

    Есть аналог под управляемые формы?

    Reply ↓
  19. boggonzikov

    (20) Manticor,

    нет, делалось под обычные формы. Можно попробовать переделать под УФ, скорее всего сильно переделывать не придется.

    Reply ↓
  20. SvetaS2014

    У вас если в дереве находишься на элементе подгруппы (не на групповом элементе), и переходишь на закладку в таблицу документа (Товары), то визуально таблица (Товары) обнуляется… — как это исправить?

    Reply ↓
  21. boggonzikov

    (22) Ответил в личку.

    Reply ↓
  22. SvetaS2014

    Документ «Таблица_ПФ1»

    вкладка «оборудование_материалы»

    1) при переходе между вкладками таблица и дерево, если курсор пользователя находится на ветке дерева (не на узле), то таблица обнуляется — как исправить?

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

    например группа

    оборудование и материалы

    кабельно проводниковая продукция

    кабель

    Средства защиты

    шланг

    Электро-техническое оборудование

    муфта

    —-

    Reply ↓
  23. SvetaS2014

    как можно делать какие-либо действия над элементом дерева? копировать, перемещать, редактировать, переименовывать, удалять, чтобы они отображались в таблице?

    Reply ↓

Leave a Comment

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