Печать таблицы для 7.7




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

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

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

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

    Всегда не хватало нечто подобного ) Ток руки не доходили ))

    Reply
  2. Арчибальд

    Была бы платформа проставлена в анонсе — поставил бы плюс…

    Reply
  3. Natalia

    (2) Действительно…. Поправила.

    Reply
  4. Арчибальд

    (3) Я надеялся еще и на «7.7» в скобочках в названии…

    Reply
  5. Natalia

    (4) это уж наверное лишним будет, если в каждом названии цыфирки )))

    Reply
  6. sound

    на 7-ке юзал подобную вещь, не знаю что функциональнее, т. к. 7-кой уже не занимаюсь и вашу тоже не смотрел

    http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3307

    или

    http://pcwin.ru/show-ili_download/

    Reply
  7. Арчибальд

    (5)Поверьте мне, не лишнее…

    Reply
  8. Natalia

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

    Reply
  9. CheBurator

    вот еще что может пригодится: http://infostart.ru/projects/942/ — весьма выручает!!! а то на отчет уходит 20 минут и 2 часа на вывод…

    Reply
  10. Natalia

    (9) Бегло глянула, пока с передачей параметров некогда разбираться

    Насколько поняла — обработка предоставляет интерактивный инструмент просто чтобы сформировать сводные данные и не морочиться с их выводом в таблицу. У меня чуть не то. У меня просто хорошо отлаженная глобальная функция. Так чтобы и по тексту можно было просто расставить ПечатьТЗ() — для отладки — и просто поанализировать таблички. И так чтобы из этого «приличная для автоматической» печатная форма получалась, «почти как настоящая».

    Вызов просто ПечатьТЗ(ТЗ) для любой таблицы или ПечатьТЗ(Контекст) для документа. Остальные параметры вызова необязательные, по умолчанию те которые удобнее всего.

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

    Эта разработка удобна именно легкостью и отсутствием интерактива ))

    Reply
  11. CheBurator

    (10) да все именно так, каждый инструмент хорош на своем месте

    Reply
  12. ADirks

    А вот ещё вариант http://www.infostart.ru/projects/1635

    Reply
  13. Natalia

    (12) В «запасниках» собственных разработок — аналогичные имеются.

    «Многоуровневая группировка ТЗ (в результате получается дерево)»

    Своя такая тоже есть. На скриншоте как раз такой пример.

    Забавно было изобрести такое самостоятельно, а потом на инфостарте найти чье-то совершенно аналогичной структуры, за разницей названий колонок и прочими мелочами. В тот случае — сделала для себя «объединенный вариант» из своего и «не своего» решения, оптимальный по скорости построения и удобству использования применительно к своим задачам. Сейчас это тоже всего лишь одна глобальная функция ))

    Reply
  14. ADirks

    Я вообще-то имел в виду РедакторТЗ 🙂

    Т.е. некий инструмент, аналогичный представленному, предназначенный в основном для отладки.

    Кстати, почему-то все для отладки делают именно печать ТЗ, а не показ на форме. Почему интересно?

    Reply
  15. Natalia

    Не всегда показ на форме удобно

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

    Reply
  16. ADirks

    Ну так в том то и дело, что РедакторТЗ в отличие от ТЗ.ВыбратьСтроку(…) можно показывать немодально. Собственно, от того и сделано было, что ТЗ.ВыбратьСтроку(…) достало своей тупостью, а выводить в печатную форму мне почему-то и в голову не пришло 🙂

    Reply
  17. JohnyDeath

    Я тоже обычно в ТП на форме результат вывожу. 😉

    Reply
  18. Natalia

    (17) Как отладочное и на форме — куда ни шло, если одно окошко.

    Если отлаживаешь какие-нибудь бухитоги в рекурсии и нужно видеть все результаты — то ТП на форме маловато будет. К тому же это форма, печатная форма. Я ей настолько широко пользуюсь……. Если прописать ПечатьТЗ() в глобальнике в обработке ячейки таблицы — то не вижу необходимости в ТП на форме, не сравнить по удобству.

    Отладка

    Авто-печатная форма отчета когда лень рисовать, а хочется, чтобы не криво

    Авто-печатная форма документа (не поймут ведь если ТП на форме 🙂 )

    Часто выручает, даже если на ходу нужно сварганить перенос из базы в базу или сравнение данных двух баз — в одной базе выбрал что нужно и сохранил mxl, в другой прочитал mxl и что нужно с ними сделал…

    Reply
  19. GenTay

    Только я не понял куда прописать процедуры из обработки ПриОткрытии() и Сформировать(). Или там оставить?

    Reply
  20. Natalia

    Никуда их не нужно писать

    ПечатьТЗ() в глобальник

    Таблицу — в общие

    Для эстетов — что-то вроде

    Если ТипЗначенияСтр(Расшифровка) = «ТаблицаЗначений» Тогда

    ПечатьТЗ(Расшифровка);

    И все ))

    А дальше использовать «по вкусу»

    Все остальное — это всего лишь демо-пример

    Reply
  21. pma

    Я делал подобное. Мне показалось удобнее выводить прямо в Excel

    Reply
  22. Natalia

    Зачем прямо в Excel?

    В 1С- есть красивый механизм расшифровок, который в Excel работать не будет. Формат таблицы такой, что в Excel вручную сохраняется с минимумом проблем — т. е. правильные выравнивания и т.д.

    На уникальность идеи этой разработки — не претендую, думаю много кто такое делал. И еще много у кого руки не доходили ))

    Reply
  23. pap

    для отладки выводил ТЗ на форму, а печать думаю будет лучше, надо попробовать.

    Спасибо.

    Reply

Leave a Comment

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