Универсальная обработка для сортировки табличной части документа.




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

32 Comments

  1. Арчибальд

    В понедельник посмотрим… Условно плюс (чтобы легче найти потом)

    Reply
  2. Ёпрст

    Нафик оно надо ?

    Reply
  3. Tatitutu

    Идея есть. Но сырая.

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

    выбираю +Наименование (товар) , -Количество, +Цена — не взлетает

    если после того как открылся документ, поменять порядок сортировки и нажать «Сортировать» — ошибка «документ заблокирован» — не проверки на открытие формы документа

    кнопки «очистки» документа, объектов — нет

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

    Совет. Добавь на форму — ТЗ и по кнопке «Анализировать» формирую ТЗ как (копию табличной части документа) и если понравится то можно и сохранить сам документ.

    Reply
  4. Tatitutu

    (2) прикладное программирование наверное.

    Единственное применение — это вывод «красиво или как надо буху» на печать

    (1) добавь кнопку печать из модуля выбранного документа.

    Reply
  5. CheBurator

    > Главное отличие данной сортировки — то, что можно выбрать не только Табличную часть документа, но и представляется возможным отсортировать по реквизитам справочников входящих в ТЧ.

    — ха! у меня это тоже можно — и даже больше! можно сортировать и по реквизиатм, которые перечисления, счета…

    .

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

    Reply
  6. WiseSnake

    Ба знакомые все лица… Написал все таки, молодец… Поставил бы плюс, за то что все таки прислушался к людям, но Ish_2 уже тебе поставил за меня плюс, сам знаешь где…

    P.S. Тока я все равно не могу придумать применения сортировке строк в документе. У меня куча организаций и все без этого как то живут. А если как в (4) «это вывод «красиво или как надо буху» на печать», то это внешняя печатная форма решает проблему… как то так…

    Reply
  7. Ish_2

    (6) Ага. Плюс зачтен.

    Я тоже сомневаюсь в практическом применении. Но тут дело принципа.

    Арчибальд,Чебур, Craig пишут на одну и ту же тему.

    Договорились мерять каждую обработку в «плевках Чебура» или в «плевкачах».

    Обработка Чебура идет за 1 «плевкач».

    Если обработка Craig будет более 0.5 плевкача — то это успех.

    Reply
  8. Ish_2

    Скачал . Посмотрел.

    Только без обид . Никак . Т.е. — 0(ноль) плевкачей.

    Посмотри обработку Чебура и все поймешь.

    Reply
  9. Craig

    (2) вопрос уже не в том что надо или не надо, хотелось по изгаляться с сортировочкой…

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

    (5) А какие могут быть проблемы у меня в обработке, если будут в ТЧ перечисления и счета???

    (8) обид не каких нет, зато могу смело кулаком в грудь стучать что делал сам :-Р. На все про все убил наверное часа 2-2,5

    Reply
  10. Craig

    (8) Я в конец растоптан((( По совету решил сравнить обработки.

    Обработка Чебуратора – прописывать новую внешнею печатную форму к документу, который возможно ты один раз воспользуешься – думаю это перебор, мысль хорошо, работает, здорова, но что то не то. Смотрел на бух ред 4.5 релиз 7.70.478, документ «перемещение материалов» выскочила ошибка «КолвоРеквизитовТЧ = Метаданные.Справочник(вид).Реквизит(); { UNISORT.ERT(276)}: Поле агрегатного объекта не обнаружено (Реквизит)» при открытии реквизитов справочника. Документ винить не могу так как моя обработка восприняла этот документ нормально… В моей обработке есть возможность учесть несколько параметров для сортировки. Раскусить в чем суть перечислений и счета я не смог.

    Обработка Арчибальда – принцип простой, но самое главное эффективна. В отличие от моей и обработки Чебуратора в ней отсутствует возможность сортировки по реквизиту справочника

    Оценивая метод написания – моя обработка уступает Вашим, но может все таки мне дробную часть плевка Чебуратора дадите!?

    Reply
  11. Ish_2

    (10) Давайте так — не в ошибках дело . Есть у Чебуратора , есть у Вас.

    (При выборе в Бухии 4.5 Вида документа «Выписка»

    и конкретного документа , нажмите кнопку «Анализировать» Выскочит :

    Есть табличка

    ТаблСорт.УстановитьЗначение(к,йй,ТекСправочник2.ПолучитьАтрибут(Колоночка)+Переодический);//

    {D:1BASE77ТЕРМОРОС1SBDBEXTFORMSPRNFORMSSORTIROVO4KA.ERT(100)}: Неверное имя атрибута

    У Вас много ошибок ! Долго писать.

    Чего я ждал ?

    Во-первых , универсальности : чтобы обработка запускалась и автономно и как внешняя печатная форма.

    Во-вторых , интерфейса : кнопка «Анализировать» с выводом сообщения «есть табличка» смотрится как прикол.

    Кнопки «верх», «вниз» лучше делать без заголовков с пиктограммами и располагать сверху (обычный подход).

    Нельзя удалить строку в таблице значений .

    В таблице значений тоже лучше использовать пиктограммы , чем текст «Не учитывать».

    В-третьих , как быть с перечислениями ?

    Явно поспешное решение с опубликованием. Поэтому и 0 плевкачей.

    Reply
  12. CheBurator

    (10) документ «перемещение материалов» выскочила ошибка «КолвоРеквизитовТЧ …»

    спсб, посмотрю, бухии под рукой толковой не было…

    .

    что мне конкретно в этой «не нравится» — сильно много кнопочечек и телодвижениечечечек… 😉

    Reply
  13. Rusk51

    (12 )личку читаем?

    Reply
  14. Rusk51

    хлопцы ,кто не спит ,есть работа с оплатой.РЕАЛЬНАЯ!включитесь 254232902

    Reply
  15. Rusk51

    аська

    Reply
  16. fishca

    (14) стукнул, а в ответ тишина 🙂

    Reply
  17. CheBurator

    (10) ошибочку поправил, перезалил — проявлялась только если в ТЧ дока есть неопределенные реквизиты…

    Reply
  18. CheBurator

    914) ну я обычно с 01-до 03 не сплю.. а вы где?

    Reply
  19. Craig

    (11)

    1.Я изначально и не хотел делать через печатную форму, так как у меня практически нет таких документов.

    Удалить из таблицы значения можно по

    2. А разве то что мы вытворяли тут не есть большой прикол!? просто забыл убрать это сообщение 🙂 Кнопочки, хм … не вопрос подправим

    Удалить?! А тут Вы не правы, я убил не мало времени на это, по кнопке «Выбрать объект» можно убрать лишние параметры путем отмены галочки:) пиктограммы — тоже не вопрос подправим…

    3. Объясните пожалуйста, а лучше на примере о каких перечислениях Вы и Чебуратор говорите?! Что то я догнать не могу…

    Вы правы, я 8 документов Выписка протестировал прежде чем она появилась…

    Как со временем свободней станет — подправлю все Ваши замечания

    Reply
  20. Craig

    Я понял о каких перечислениях вы говрите…!

    Reply
  21. Ish_2

    (19) Ответ по 3 пункту оставим Чебуру. Скажу вот о чем .

    Обработка эта практического интереса для применения иметь , конечно, не будет . А раз так , то критерии оценки другие , более высокие : не в плюсах , а в плевкачах.

    Оценивается подход и техника исполнения.

    Автор должен чем-то удивить. А ошибки — Бог с ними.

    Чебур удивил . Именно такой реализации при продуманном интерфейсе я во всяком случае еще не видел.

    Craig не удивил . Обычный подход , интерфейс продуман слабо.

    Виноват . Это всего лишь пристрастный взгляд .

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

    Посмотрел. Плюс оставляю. Однако ж прислушаться к замечаниям по интерфейсу и юзабельности следует (т.е. в плюсе все еще значительная доля аванса). Тема-то, конечно, ичерпана, но довести дело до конца необходимо!

    Reply
  23. Craig

    (21) (22) Угу, пасиб за комментарий, самого тема зацепила, обязательно доведу до логического конца, на счет интерфейса согласен потратился, не терпелось поделиться… обратил особое внимание на реквизиты справочников, у меня они не выделены, их очень легко спутать со ТЧ… тоже этот момент не продумал

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

    (23)Вот чтобы не путались, думается, в ТЗ на форме должны быть три колонки: реквизит ТЧ, атрибут реквизита, способ сортировки.

    Reply
  25. CheBurator

    (23) смотри у меня как обозначены реквизиты — сразу понятно какой реквизит что из себя представляет…

    ..имхо основной недостаток твоей обработки — сильно много кнопочек и действий.. 😉

    Reply
  26. Craig

    (24) А атрибут взять только по первой строке!? а может лучше через функцию выводить в форме, как текст?!

    Reply
  27. Craig

    (25) Исправлюсь, я хотел, чтоб было по больше функциональности, получился перебор. Вот только чего я понять не могу — почему перечисление тоже идет по коду 11, как справочник!? как то не логично…

    Reply
  28. CheBurator

    > почему перечисление тоже идет по коду 11,

    ну не знаю… у меня все правильно работает 😉

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

    (11)ТипЗначенияСтр не пробовал ;))

    Reply
  30. Ish_2

    (29) Я здесь. Чего звал по (11) ?

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

    (30) Очепятка. В (27) речь про код 11 идет, я его и загнал в скобки… :))

    Reply
  32. Craig

    (29) Вот Этой строкой я выбираю справочники:

    Если ТипЗначения(ТА.ПолучитьЗначение(1,N)) = 11 Тогда

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

    Reply

Leave a Comment

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