Реестр документов v 2




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

55 Comments

  1. CheBurator

    Положи пару картинок!

    Reply
  2. poppy

    Что интересного есть в рассматриваемой обработке по сравнению с другими существующими?

    Например, «Настраиваемый журнал документов» (UniJourn.ert) с диска ИТС умеет все тоже самое, плюс имеет много других «вскусностей».

    Reply
  3. kalipso

    Спасибо очень помогло

    Reply
  4. valent

    Спасибо!

    Мелочь, а приятно!

    Reply
  5. kalipso

    Обработка UniJourn.ert формирует реестры документов, а данная очень полезная обработка выводит строки документов по уникальному полю

    Reply
  6. Diamond

    to Чебурашка: будут

    to poppy: ну скажем проще мой отчетик по настройке, обрабатывает табличные части и это я на первый взгляд тока

    да ещё чтобы мой отчет использовать не надо покупать ИТС диск, Абсалютно бесплатно 😉

    Reply
  7. vat-74

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

    Reply
  8. vat-74

    И еще. Красивее будет ввести группировку по документу если он табличный.Т.е. в первой строке первой колонки документ, вторая колонка заполняется по табличной части документа, а сам документ в каждой последующей строке не повторяется. Ну как то так.)

    Reply
  9. CheBurator

    Ну насчет «выводит строки документов по уникальному полю» — универсальная печать документов тоже вроде такое умеет 😉

    но это я так — погундеть… 😉

    Reply
  10. CheBurator

    Бяка! 😉

    Хочется нормальные фильтры по образу и подобию МножественногоФильтра — тогда можно выбирать в реестр очень гибко!

    Reply
  11. Diamond

    to vat-74: исправил, добавил возможность группировки, зацени

    Reply
  12. Diamond

    Чебурашка а чем тебе не нравиться множественный фильтр тут??? объясни

    Reply
  13. CheBurator

    Хочу: реестр документов «поступление ТМЦ» по всем документам с кодом операции = «Купля/продажа или Поступление на отв.хранение», но кроме двух клиентов А и Б.. ну и с суммой взаиморасчетов, большей чем 200 тыс.

    …???

    Reply
  14. CheBurator

    Заметьте — я не сказал, что не понравилось, я — просто выразил свое неудовольствие куцыми возможностями фильтра. Кому -то — хватит, мне — НЕТ!!!

    Reply
  15. Diamond

    интересные идеи… но тогда прийдется отказаться от простоты интерфейса

    Reply
  16. Legin

    Хорошая вещь, понравилась…

    но есть одно маленькое предложение — добавить возможность вывода номера, даты и вида документа в отдельных колонках

    Reply
  17. merlin1975

    Можно ли добавить сортировку и по другим (свободным) реквизитам документа?

    Reply
  18. Diamond

    to Legin: предложение хорошее, более информативно получается, так и сделал

    to Merlin1975: сортируются тока по реквезиты которые выводятся, т.к. одинаковые реквизиты документов группируются в одну колонку.

    Reply
  19. DobroProd

    Было бы неплохо еще и нумератор сделать и возможность выводить как по времени создания так и по видам доков

    Reply
  20. Diamond

    to DobroProd: есть переключатели сортировать по дпте документа или по виду.

    не понял про нумераторы

    Reply
  21. dreamer_nf

    Отличная разработка, актвно используем в нашей организции. Только вот всплыл такой момент:

    добавляем фильтр например по Номенклатуре. Выбираем группу Номенклатуры (не конкретную позицию!!!) и тогда отчет не работает, так как видимо фильтр применяется только по значаению. А было бы очень удобно если бы отчет реагировал на групповые элементы справочников. Такое реально сделать ?

    Заранее спасибо.

    Reply
  22. Diamond

    Да фиг знает 🙂 , не пробовал. Надо посмотреть

    Reply
  23. Diamond

    вроде подправил

    Reply
  24. Diamond

    вроде сделал, тестируйте

    Reply
  25. RSBIR

    Молодца!

    Reply
  26. niklaz

    Обработка неплохая, только фильтр по номенклатуре действительно не работает (по другим реквизитам не проверял — расстроился сильно). Но все равно +

    Reply
  27. Yuri_Ays

    Спасибо от наших бухов!!!

    Reply
  28. rasswet

    лСтрДлина=Макс(Окр(Метаданные.Справочник(ВидСпр).ДлинаНаименования/2,0),лСтрДлина);

    {C:DOCUMENTS AND SETTINGSАДМИНИСТРАТОРРАБОЧИЙ СТОЛРЕЕСТРДОКУМЕНТОВ.ERT(898)}: Поле агрегатного объекта не обнаружено (ДлинаНаименования)

    так вот

    Reply
  29. KsenaK

    Спасибо огромное, очень хорошая и полезная обработка

    Reply
  30. alina71

    Огромное спасибо! Выручили!

    Reply
  31. prs

    Спасибо большое! То что давно нам было нужно!

    Reply
  32. AB3012

    Спасибо, очень помогла

    Reply
  33. wolder

    пасиб!

    Reply
  34. Evgeniy

    Обработка клаас, но не могу сделать фильтр по реквизиту, значение которого равно 0.

    Reply
  35. yxL

    почему-то у меня не формируется реестр, только «шапку» выводит

    Reply
  36. Lis1904

    Даже не знаю что поставить (+ или -).

    При повторном открытии отчета:

    Для Инд = 1 По Метаданные.Документ(ТекВид).РеквизитТабличнойЧасти() Цикл

    (252)}: Значение не представляет агрегатный объект (РеквизитТабличнойЧасти)

    Reply
  37. Diamond

    (37) странно, только у Вас такая ошибка вышла за несколько лет существования отчета. Конкретно что делаете?

    Reply
  38. Lis1904

    Делаю реестр документов (документ не родной, дописан для своей конфы). Первое открытие — получил реестр настроил вывод по колонкам, настроил печать. Дважды вывел на печать. Записал настройки. Решил поменять для этого же документа фильтр отбора по другому контру и на тебе «здрасьте».

    Reply
  39. Lis1904

    (38,39) Дальнейшие попытки вывести даже с записанными настройками приводили к ошибке (см. (37)). При открытии (37).

    Reply
  40. IsiKosta

    Надо бы 2 кнопочки добавить, чтобы всем видам документов галки ставить/снимать.

    Reply
  41. spbkaravan

    Обработка замечательная, но такая же ошибка выскакивает как в п.37 😥

    Reply
  42. slavyan_79

    А можно эту обработку адаптировать под торговлю и склад? потому-что в данном виде она выдает ошибку

    Reply
  43. slavyan_79

    ошибка как в п.37

    Reply
  44. Diamond

    Я бы подправил, но… уже ушел с семерки и смутно помню что я в этом отчете наваял 🙁

    Если кто-то возмется исправить и выложит у себя, я не буду против

    Reply
  45. PaRaDoX

    Суммирует реквизиты шапки по числу строк табличной части. Т.е. умножает числа шапки на количество строк ТЧ. =( Исправте пожалуйста.

    Reply
  46. leka_mari

    При попытке открыть архив пишет что «файл поврежден или имеет неизвестный формат»?

    Reply
  47. Koles

    Спасибо. Пригодилось.

    Reply
  48. platinum

    Все бы хорошо,но нет всего малости, как очищать фильтр отбора.

    Reply
  49. agrofirma

    очень неплохая вещь… только почему-то не всегда запятую в числах ставит :))

    Reply
  50. avkit

    Давно пользуюсь, очень гибкая обработка, неплохо.

    Reply
  51. Bomba1911

    Спасибо большое! То что давно нам было нужно!

    Reply
  52. vladoe

    Спасибо большое! Очень пригодилась!

    Reply
  53. Dethmond

    Спасибо за обработку

    Reply
  54. dimonsky

    Обработка отличная. Спасибо большое!

    Reply
  55. denn15

    Очень понравилась, спасибо.

    Reply

Leave a Comment

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