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




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

58 Comments

  1. Signal

    Автор, доработайте пожалуйста для Ут 10.3.1.17

    Reply
  2. Широкий

    Добавил под 8.0

    Reply
  3. Одинец

    Очень итересно, но как быть с этим:

    {Форма.ФормаОтчета(285)}: Ошибка при установке значения атрибута контекста (Текст): {(226, 1)}: Недопустимое поле для группировки «Содержание»

    <<?>>ОплатаПоставщикам.Содержание,

    ПостроительОтчета.Текст=ТекстЗапроса;

    Reply
  4. Широкий

    Поправил ситуацию со строками неограниченной длины в табличной части документа.

    Убрал из доступных полей реквизиты с типом Хранилище Значения.

    У реквизитов табличной части убрал вложенные реквизиты с типом Строка неограниченной длины.

    Reply
  5. Широкий

    Странно … все качают — а отзывов нет …

    Никому не пригодилась что ли?

    Reply
  6. Поручик

    Почему не пригодилось? Ща подзаточим и будем юзать.

    Reply
  7. molot

    Хорошо!

    Сортировку добавь в настройки — будет еще лучше.

    Reply
  8. Широкий

    Добавил сортировку по реквизитам шапки

    Reply
  9. imsoftware

    Обработка просто супер! Однозначно +1

    Reply
  10. Широкий

    Если отчет пригодился и понравился — не стесняйтесь плюсовать рейтинг … вам может быть и все равно , а мне приятно..

    Reply
  11. PowerBoy

    А скриншоты добавить?

    Reply
  12. Yexel

    Клёво! Я в восторге!

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

    Вот тогда будет просто СУПЕР!

    Reply
  13. Широкий

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

    Reply
  14. trolja

    Вот бы еще в отборе можно было бы как в «выбранных полях» указывать конкретный товар. Получится СУПЕР Универсальная штука.

    Reply
  15. bogdan51

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

    Reply
  16. skutuz

    Блин, при открытии вешает эску, затем ошибка и прога схлапывается 🙁

    Reply
  17. Широкий

    (skutuz) Подробности напиши… какая конфигурация , обработка под 8.0 или 8.1?

    Reply
  18. Альберт_Уфа

    мне нравится. Спасибо!

    Reply
  19. serezhenko

    Не увидел «суммирование по числовому типу табличных частей»

    Reply
  20. Широкий

    «Не увидел «суммирование по числовому типу табличных частей»»

    И все же оно там имеется

    Reply
  21. Avatar

    и я не увидел «суммирование по числовому типу табличных частей» — в коде вроде проверки есть, но в подвал суммы по числовым полям таки не выводятся.. (8.1 УТ 10.3.3.3)

    Reply
  22. Широкий

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

    Reply
  23. Avatar

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

    но как удобный функционал суммирование по выводимым конечным (к примеру СуммаДокумента) числовым полям (Общие ИТОГИ)

    было бы очень удобно.

    Бухгалтера регулярно занимаются копированием реестра в Excel и суммированием по колоноке.. жалко их 🙂

    Есть реализация в http://infostart.ru/projects/1684/, но там не универсально (только по СуммеДокумента).

    Reply
  24. Широкий

    Вопрос для тех кто пользуется моим отчетом:

    Формируете ли вы отчет в разрезе нечисловых полей табличной части?

    Reply
  25. Широкий

    Прикрутил ОБЩИЕ ИТОГИ в отчете под 8.1.

    Под 8.0 этого нет — лень платформу ставить.

    Reply
  26. Avatar

    Огромное спасибо!

    Теперь самое оно — Жаль что больше одного плюса не поставишь 🙂

    Формируете ли вы отчет в разрезе нечисловых полей табличной части? — У нас в практике не встречается

    Как идеи к развитию отдельная галочка в верхне части формы «Н/п» автоматом добавляет слева колонку номер по порядку

    (Когда бухгалтера пару распечаток между собой сверяю им проще сорентироватся — типа «глянь 38 строчку».

    И еще рядышком галочку «расчитывать ширину колонки по содержимому».

    Хотя, такие мелочи уже каждый под себя добавить может.

    Reply
  27. Широкий

    Для того чтобы сделать такую «мелочь» как «н п/п» придется переписать код по выводу результата построителя запроса..

    Авто расчет ширины колонок не будет точно — не нравится мне эта фишка (выглядит не бе не ме).. максимум что могу сделать — это запоминание установленных пользователем размеров колонок..

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

    Reply
  28. Широкий

    Обновил обработку под 8.0 — туда тоже добавил общие итоги

    Reply
  29. Asdam

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

    Поддерживаю, что «Н/п» и «расчитывать ширину колонки по содержимому» нужны, бухи попросили.

    Reply
  30. sersaz

    Респект!

    Reply
  31. assol

    Обалденная обработка!

    Спасибо огромное!

    Reply
  32. matros71

    Обработка Отличная! Ещё бы группировка по полям документа… Типа общий итог и подитоги… Проще говоря из пачки документов выделить отдельные пачки 🙂

    Reply
  33. mishau

    Я бы сделал отбор по табличной части. Например, по конкретному товару в приходных накладных.

    Reply
  34. Широкий

    А если несколько табличных частей? Градировать отбор — типа это распространяется на шапку документа — а этот общий?

    Reply
  35. grigr

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

    (допустим нужно быстро найти все документы НачислениеЗП, по данному сотруднику и тп)

    Reply
  36. MariP

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

    Reply
  37. azhdan

    Очень зачетная обработочка…

    Reply
  38. cheri

    Нужная обработка! Спасибо! +

    Reply
  39. podsolnuh

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

    Reply
  40. KSy

    Полезная вещица:) +1

    Reply
  41. Solo1

    Супер! Спасибо огромное!

    Reply
  42. Hron

    Спасибо, очень помогло, вещь! Особенно понравилась группировка табличных частей документов по заданным реквизитам с выводом итогов 🙂

    Reply
  43. vedvd1

    Отличная вещь, одна из самых лучших!

    Reply
  44. alexch8

    Спасибо, пригодилась. Перебрал несколько аналогичных обработок, остановился на этой.

    Reply
  45. multilab

    Просто, универсально и полезно! Спасибо!

    Reply
  46. jack_kkm

    Можно добавить возможность формировать реестр по нескольким видам документов (например, ПТУ + доп. расходы)?

    Reply
  47. Широкий

    В этом отчете нет

    Reply
  48. jack_kkm

    Для юзверей реестр оказался бесполезен, т.к. хотят несколько видов документов сразу. Обычный реестр из УТ удовлетворил пользователей, более сложные вопросы решаются через консоль отчетов.

    Reply
  49. igo-osetro

    Хорошая обработка! автору спасибо, но без доработок не обошлось.

    Reply
  50. Slavez

    Спасибо! Пользуемся под БГУ 8.2. Очень клёво, всё работает. Бухи правда теряются и путаются в таком количестве галочек, но это их проблемы.

    Reply
  51. kkk

    обработка хорошая! автору спасибо

    Reply
  52. Tlik

    То что нужно, вот только как ее привязать в БП 2.0 во внешние отчеты?

    Открывается только через файл «открыть!

    Reply
  53. alexism

    Спасибо, Буду тестировать обработку. Надеюсь, что поможет в реальных задачах.

    Reply
  54. Dethmond

    Спасибо за обработку, нужная вещь

    Reply
  55. AKV77

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

    Reply
  56. daryz

    А для Комплексной 1.1 подойдет?

    Reply
  57. Широкий

    (57) Конфигурация не имеет значения

    Reply
  58. ge_ni

    Вариант (под 8.1) При попытке открыть отчет тупо завис в толстом клиенте на 8.3 на процедуре » ДобавитьСтрокуВПоляНастройкиОтчета(…». Всё закончилось сообщением «Недостаточно памяти»

    Reply

Leave a Comment

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