Форма товарно-транспортной накладной для типовой бухгалтерии и для УСН.




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

22 Comments

  1. victuan

    Обновил архив. Файл TTNPrint.efd был поврежден

    Reply
  2. q_xpress

    Victuan, огромное СПАСИБО! Отличная обработка! 5+!

    Reply
  3. TIG-PROGRAMMIST

    спасибо что без ключей выложил 😉

    Reply
  4. victuan

    Всегда пожалуйста!

    Reply
  5. panok90

    спасиб, посмотрю

    Reply
  6. Tormoz

    Единственная обработка, которая «встала» ровно на мою конфигурацию. И … такая обида — разрыв страницы стоит посередине первого листа!!! Как бороться, кто-нибудь знает?

    Reply
  7. victuan

    To Tormoz: таков стандарт этой формы…

    Однако, разрывы страниц можно убрать.

    Способ 1 (для программистов): в конфигураторе в модуле обработке закоментировать строки — Таб.НоваяСтраница();

    Способ 2 (для пользователей): после вывода на экран печатной формы — в верхнем меню: Вид — Только просмотр, Таблица — Убрать перевод страницы (курсор должен предварительно находится в ячейке под разрывом страницы)

    Reply
  8. Paul_72

    Прекрасная внешняя обработка! Легла ровно, только чуть увеличил рамер полей ГосНомер Автомобиля и ГосНомер прицепа!

    Респект разработчику огромный!

    Reply
  9. BaShaKo

    Вещь, естественно, хорошая и необходимая — как дополняющая «пробел» в типовой конфигурации.

    Но, вот, мелочи…

    Грузополучатель всегда = Плательщик, т.е. всегда «он же». А если НЕ «он же» ?

    Reply
  10. victuan

    (9) Учту

    Reply
  11. BaShaKo

    (6)+(10)

    Действительно, перенос на другую страницу идет при КоличествоСтрок() > 1.

    Конечно, (6) Tormoz, обидно!

    Но ведь реально на первой странице можно поместить и 2, и даже 3 позиции товаров !

    Может, (10), подправить строку 213

    Код
    Если КоличествоСтрок = 1 Тогда

    Показать полностью

    на

    Код
    Если КоличествоСтрок <= 2 Тогда

    Показать полностью

    или даже

    Код
    Если КоличествоСтрок <=3 Тогда

    Показать полностью

    А если на принтере пойдет все-таки перенос, то, может, "Параметры страницы…" нам немного помогут ?

    Reply
  12. victuan

    Учту, но не сейчас

    Reply
  13. olgec

    классно, спасибо

    Reply
  14. irina_mayer

    Здорово! Спасибо за труд! Отдельное спасибо BaShaKo за совет

    Reply
  15. dsniki

    стремно иметь 29 + …… Спасибо

    Reply
  16. Elenabess

    Выручили, спасибо. Только по правилу заполнения ТТН сумма должна быть без НДС

    ( немного исправила, отдельное спасибо за эту возможность). Но Вы не бухгалтер, поэтому претензии не к Вам.

    Reply
  17. marinochka1979

    А как же втроенные справочники водителей и автомобилей, все время по новой набирай?? И вообще она данные не запоминает, и если надо продублировать — опять по новой набирай 😥

    Reply
  18. victuan

    (17) Да именно так. В обработке реализована только печатная форма, а не хранение необходимых настроек.

    Возможно, в последствии обработка будет мною доработана.

    Reply
  19. mirkomp

    огромное СПАСИБО! Отличная обработка! 5+!

    Reply
  20. chaos42

    Спасибо огромное. Такой вопрос. А запоминание настроек трудно сделать, если самому? Так все шикарно

    Reply
  21. victuan

    (20) Думаю, что нетрудно.

    Попробуйте еще воспользоваться штатной кнопкой «Сохранить настройку» (слева вверху на форме обработки).

    Reply
  22. mikl79

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

    Reply

Leave a Comment

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