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




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

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

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

<?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='\

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 не будет опубликован. Обязательные поля помечены *