Документ ТТН. Регистрация ТТН в отдельном журнале, учет товарно-транспортных накладных и простое редактирование ТТН




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

22 Comments

  1. Yuranix

    А представьте маслозавод, который отгражает по 20-30 фур ежедневно, а если потом еще надо внести изменения в ТТн, да еще и создать например одну ТТн на основании двух-трех накладных? Не всегда ведь удобно заново забивать в стандартную обработку ТТН всё? И можно отследить, когда, что и кто вез… Иногда это полезно, иметь такой журнал документов. А по поводу справочника водителей — в нашем случае я это думал, но не стал делать, потом будут сложности с обновлением конфигурации…

    Reply
  2. sevipa

    есть еще один очень важный

    Reply
  3. sevipa

    есть еще один очень важный момент в том, кто формирует эти документы, и кто потом и что с ними делает… поясню: если сформировать кучу ТТН, то потом вполне вероятно возникнет необходтмость сформировать накладные по отгрузкам контрагенту за период… я говорю так потому что у себя сделали подобную вещь, пользуемся с января, кроме того реализовали тот ньюанс, что по каждой поставке может быть свой договор и свои цены, поэтому для автоматизации заполнения при подборе учли и это… если кому интересно, подам в студию….!

    Reply
  4. sevipa

    а по поводу ввода водителей… их берем из справочника физлиц, в которой организовали отдельную группу

    Reply
  5. e.kogan

    Скриншот хорош.

    Reply
  6. Душелов

    (7) Ага… И единицы измерения

    Reply
  7. Yuranix

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

    Reply
  8. Yuranix

    Люди, ну не забывайте про плюсы :-[ А то скачать что нужно, а не получается… Поможите, кто чем можите 🙁

    Reply
  9. Одинец

    В файле поставке — один документ в котором все реквизиты строчные!! Автор — сделай файл поставки чтоб реквизиты ТВОЕГО документа ссылались на соответствующие объекты конфигурации…

    Reply
  10. ulen

    (14) Полегчало?

    Reply
  11. Yuranix

    (16)Ну как тебе сказать )))

    Reply
  12. ulen

    (17) Тьфу ты мой же комент…

    я это маньяку адресовал…

    Reply
  13. Blade Runner

    спасибо, порадовали наполнением справочника в пятницу 🙂

    автор, для Украинской конфигурации пойдет?

    Reply
  14. Yuranix

    (19)А вот это не могу сказать…скачай, попробуй…

    Reply
  15. HitGroove

    Судя по скрину все ручками забивать нужно….. Да и вариант использование документа в качестве регистратора ТТН, по моему мнению не очень уместно, т.к. регистратором в любом случае выступает реализация, а кто возил прекрасно можно научить запоминать рег сведений!!!! Так что автор, + тебе за твой труд и убитое время! А лучше сделай печ. форму для реализации и добавь рег сведений!

    Reply
  16. zaika

    (21) Можно поподробнее про регистр сведений?

    Reply
  17. HitGroove

    Можно! http://v8.1c.ru/overview/InformationReg.htm — это общее по регистрам сведений! А вообще измерение регистратор (реализация), ресурсы данные кто возил, и т.п.

    Reply
  18. Svetik83

    А для УправТорг 10.3.7.9 такое подойдет?

    Reply
  19. Ivas

    хорошая обработка. Для торговля 8.1 случаем нет такой?

    Reply
  20. Deniz200

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

    Reply
  21. ketr

    а для 2.0 есть такое? Плюс ТТН чтобы нового образца? Если нет — сколько будет стоить сделать?

    Reply
  22. Yuranix

    хех… сколько вопросов ) только ребят, я соскочил с ЭсКи ) Только для себя веду теперь, ИП УТ )Так что вопросы типа сколько стоит и сделай — не в тему, голова уже забита не тем, да и мало что помню с прошлой работы

    Reply

Leave a Comment

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