<?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='\
Идея интересная, но я ожидал большего!
1) Сделай более понятную и наглядную инструкцию (лично я довольно долго думал над тем, что ты имеешь в виду «К обработчику события «ПриСменеСтраницы», панели «ПанельТовары», подключаем созданный из пункта 10 обработчик.»)
2) Модуль не дописан — дерено формируется, но работать с ТЧ из дерева нельзя, следовательно использовать его можно для «посмотреть»…это я могу и в отчете сделать. Хотелось бы иметь полный функционал (добавлять строки, изменять данные) Дерева. В этом случае сама ТЧ использовалась бы чисто для хранения данных (ее можно было бы даже скрыть вовсе и работать чисто с деревом).
3) добавь в Cf-ку один док с реализованным механизмом (для наглядного примера).
(1) mzelensky,
ок, в планах есть, только времени нету 🙂
Согласен с (1) просто посмотреть в виде дерева — не интересно. Хотелось бы полную работу с деревом — добавление, редактирование и удаление подчиненных строк…
(4) Strange Device,
Редактирование строк поддерживается. Остальное в планах.
тема нужная.
с позволения, добавлю ссылку на аналог:
отчет так себе. не оченью…. но может кому пригодится…. пробовал на управлении зарплатой
Мой аналог, теме крестик, для 8.2 видимо тоже придется подумать, динамический список не очень подходит для использования визуализации в табличной части.
(6) (8) У вас представлены куски, как из таблицы получить дерево. Я предлагаю универсальное готовое решение ( модуль, класс). И считаю главной фишкой модуля, это работа обработчиков табличного поля табличной части.
(9)ну чтож, раз уж критикуете, обработчики, это как раз не универсальное решение, например в РЖД, в их генподряной организации, где работает все, а не модуль, что я представил, тоже используются обработчики, там ОЧЕНЬ большие объемы данных и пересчет я не представил, т.к. это частный случай.
к вопросу о критике, мне, как профессионалу, в общем — то, все равно что у вас там за «фишки», было интересно решение в принципе, ничего интересного, касаемо тематики, не нашел, судя по всему работаете недавно, и оригинальных решений немного.
Думаю сообществу более интересны универсальные «высушенные» тексты, ваш вариант интересен как пример не более.
(10) Sintson
После заявлений
[quote] мне, как профессионалу [/quote]
мне с Вами общаться не интересно.
Я предложил решение, кому интересно тот найдёт то что ему нужно.
Доработать конечно надо, но идея очень интересная.
покажите в статье алгоритмы, не вынуждайте людей скачивать. пока минус за ваш труд.
(14) Rustig, (15) Rustig, Рекомендую внимательно прочитать публикацию, подумать, скачать приложенные файлы, потом думать и изучать, изучать и думать. Если не понятно обратиться за помощью.
хорошая идея, теперь хочется самой такое реализовать
Как сделать груперовку по 2м колонкам?
добавил строку в список груперовок ничертане работает.
Процедура ИнициализироватьДеревоТовары() Экспорт
СтруктураПараметров = Новый Структура;
СписокГрупп = Новый СписокЗначений; //Список имен колонок группировки
СписокГрупп.Добавить(«Товар»);
СписокГрупп.Добавить(«Количество»);
Читать публикацию надо повнимательней. Хорошая идея. Огромное спасибо!
Есть аналог под управляемые формы?
(20) Manticor,
нет, делалось под обычные формы. Можно попробовать переделать под УФ, скорее всего сильно переделывать не придется.
У вас если в дереве находишься на элементе подгруппы (не на групповом элементе), и переходишь на закладку в таблицу документа (Товары), то визуально таблица (Товары) обнуляется… — как это исправить?
(22) Ответил в личку.
Документ «Таблица_ПФ1»
вкладка «оборудование_материалы»
1) при переходе между вкладками таблица и дерево, если курсор пользователя находится на ветке дерева (не на узле), то таблица обнуляется — как исправить?
2) как в групповое поле (по которому формируется дерево ) добавить группы согласно иерархии справочника номенклатуры. т.е. чтобы дерево группировало не только по названию группы в которой находится товар (по наименованию товара, из колонки категория товара, в будущем будет не строка а справочник категория товара ) из колонки товар но и по группе в которой находится товар
например группа
оборудование и материалы
кабельно проводниковая продукция
кабель
Средства защиты
шланг
Электро-техническое оборудование
муфта
—-
как можно делать какие-либо действия над элементом дерева? копировать, перемещать, редактировать, переименовывать, удалять, чтобы они отображались в таблице?