Пакетный ввод документов по реализации услуг для Бухгалтерии предприятия 3.0




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

    Прикольно, это часто нужно, но в типовой конечно много чего не хватает. Слышали про Аренда управление недвижимостью — там всё это реализовано

    Reply
  2. ryutao

    Ну, блин, вот это поделие! Вместо дополнительных свойств создаются дополнительные реквизиты, но поиск происходит по регистру сведений ДополнительныеСвойства. Смотрю, а почему не работает? Автор, Вы хоть тестили свою нетленку?

    Reply
  3. manas

    (2) Спасибо за замечание; исправил, файл обновил

    Reply
  4. СержТ

    (3) Говорите файл обновили, но файл в скачивании от 22.07.17, и он с ошибкой.

    Reply
  5. manas

    Накладка, загрузил снова.

    Могу выслать, если сообщите, куда

    Reply
  6. Andy83

    (5) и мне пришлите обновленную на carev{собака}bk.ru Пытаюсь скачать повторно (30 дней еще не прошло с момента первого скачивания), хочет списать $M.

    Reply
  7. antonsat49

    В последней типовой БП 3.0 работает?

    Reply
  8. manas

    (7) Должно работать. Проверю, напишу

    Reply
  9. antonsat49

    В Бухгалтерия предприятия (3.0.60.46) Будет Работать?

    Reply
  10. manas

    (7) Доработал, проверил на 3.0.59.45

    Reply
  11. antonsat49

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

    Reply
  12. manas

    (11) Пришлите, пожалуйста скриншоты (свойства договора и формы обработки, обе закладки)

    Reply
  13. antonsat49

    БП 3.0.61.47.

    Свойства создал по кнопке.

    Пробовал отредактировать существующий, тоже нет результата, создан новый — тоже самое.

    Также при отборе «Только основные договоры» ошибка вылетает — скрин прилагаю.

    Reply
  14. user1010691

    Добрый день.

    При тестировании обработки возникла проблема, как и antonsat49.

    Ошибка «поле не найдено «Договоры контрагентов. владелец» итд… Скриншот прилагаю.

    Не могу понять, в чем может быть проблема

    Reply
  15. manas

    (14) Мне кажется, что скриншот не тот…

    Reply
  16. user1010691

    Извините, не тот файл прикрепила.

    При тестировании обработки возникла проблема, как и antonsat49.

    Ошибка «поле не найдено «Договоры контрагентов. владелец» итд… Скриншот прилагаю.

    Не могу понять, в чем может быть проблема

    Reply
  17. user1010691

    Добрый день.

    При попытке напечатать выбранные формы (акт и счет-фактура) появляется ошибка «Ошибка отображение типов…». Не могли бы Вы подсказать, как это устранить? Принтскрин прилагаю

    Не могли бы Вы уточнить, при формировании обработкой актов и счетов не проставляется кол-во и цена. Этот вопрос не учтен данной обработкой или это можно как-то устранить?

    Заранее Вам благодарна

    Reply
  18. gala2009

    так работает обработка или нет, или частично?

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

    Reply
  19. antonsat49

    (18)У меня так ничего и не заработало, автор несколько раз высылал якобы доработанный файл, но как я понял это был один и тот же файл, скачал в пустую, лучше найти что-то другое.

    Reply
  20. manas

    (18) Работает. Отмечу только, что, как указано в описании, печать «спотыкается» на нестандартных формах, например, договор, приложение к договору, счет-фактура, УПД (алгоритмы печати для них отличаются от стандартных).

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

    Reply
  21. manas

    (19) см. (20)

    Reply
  22. antonsat49

    (21) Ок, надо проверить на текущем релизе, какую версию сервера вы использовали? У меня 8.3.12 x64.

    Reply
  23. manas

    (22) см. описание

    Reply
  24. gala2009

    опробовала обработку, спасибо, работает.

    на последних релизах ругается конечно на ставки НДС, но это поправимо

    Reply
  25. manas

    (24) Спасибо за комментарий. Как будет время (сейчас запарка с клиентами), подправлю

    Reply
  26. Sedow

    Привет.

    количество услуги можно заполнить с помощью вашей обработки?

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

    прошу разъяснить.

    Спасибо.

    Reply
  27. Sedow

    у нас по договору не одна услуга, а несколько.

    Reply
  28. manas

    (27) Надо посмотреть, давно не занимался ею.

    Reply
  29. manas

    (27) Пока можно для каждой услуги создать свой договор.

    Reply
  30. Sedow

    (29) создавать для каждой услуги — это не вариант. у нас в договоре аренды помещений указаны несколько услуг, в том числе постоянных (аренда за 1 кв.м) и переменных (отпуск воды, передача электричества и т.п.)

    Reply
  31. manas

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

    Reply
  32. manas

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

    Reply

Leave a Comment

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