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




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

26 Comments

  1. allexor

    Нужная вещь…

    Reply
  2. Поручик

    Нужная-то может быть, но не для юзеров. Они же в ступор впадают от таких умных слов: источник, приёмник, соответствие.

    Reply
  3. e.kogan

    (2) Да уж. Проверено на собственном опыте 🙁 Юзеру нужна кнопка типа «ПЫЩЬ!» — тогда он счастлив.

    Reply
  4. anig99

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

    Reply
  5. bidond

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

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

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

    Только это лишние движения…

    Reply
  6. marina-daniel

    Посмотрела, очень нужная вещь. Спасибки. +++++++

    Reply
  7. lama100

    Применимо только если нужно перенести достаточно большую табличную часть. А до полного счастья еще очень далеко, не хватает удобства и возможностей:

    1. заполнять списки соответствия реквизитов шапки, добавляя их по одному в 2 списка — это издевательство. Нельзя сделать автоматическое заполнение списков совпадающими реквизитами?

    2. соответствие табличных частей — то же самое. Зачем их заполнять вручную? пусть заполняются по умолчанию совпадающими табличными частями.

    3. как уже писали (5), жалко что нельзя выбрать уже существующий документ (но пусть останется возможность создать новый).

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

    Reply
  8. rasswet

    (7) присоеденяюсь.

    а идея отл! однозначно+

    Reply
  9. Solo1

    Класс! Пусть не очень удобно, но хоть что-то, а то вручную формировать передачу материалов в эксплуатацию и требование-накладную из авансового отчета — это ужас! Спасибо.

    Reply
  10. alteregoatg

    Плюсанул, а рановато!))) надо было из Поступления перенести данные в Оприходование, данные перенес все, только Сумма (регл.) не заполнилась, соответственно, документ НЕ ПРОВЕСТИ, следовательно, операция бессмысленна… (платформа 8.1 — УТ 10.3)

    Reply
  11. Ehwaz

    Не работает при заполнении доверенности на основании реализации

    Reply
  12. itek.09

    пригодилась

    Reply
  13. elena_77

    Спасибо. Плюс++. Пригодится.

    Reply
  14. Likusia

    Спасибо, помогло! Нужно было заполнить документ Поступление из переработки на основании Передачи товаров ++

    Reply
  15. nick_e

    !!! ))

    Reply
  16. AlexO

    (11) а названия полей совпадают? ибо по полям идет основная постановка сответствий ))

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

    Reply
  17. ASoft

    Отличная идея. Спасибо и конечно плюсую.

    Reply
  18. gala2009

    это то, что я ищу! скачаю и опробую, результатом поделюсь

    Reply
  19. razrazraz

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

    Reply
  20. Alex1Cnic

    Планируется обновление обработки и добавление некотрых функций

    Reply
  21. Alex1Cnic

    Наконец-то руки дошли….

    Итак какие новшества (18-07-2013):

    1) Добавление версии обработки для платформы 1С 8.2

    2) Доработка самой обработки: появилась новая функция автоматического соответствия реквизитов и табличных частей при выборе вида документа-приемника

    Reply
  22. nkp14108

    Хорошая идея, но не хватило функционала.Поэтому чуть исправил(прости) и посмотри результат.

    Reply
  23. Voyr

    Вот спасибочки! Спасли израненный мозг 🙂

    Reply
  24. CratosX

    БП 2.0:

    Не удалось сформировать внешнюю печатную форму!

    Поле объекта не обнаружено (СсылкаНаОбъект)

    Подключил как внеш.печатную форму. По правилам бухи, внешняя печатная форма обязана иметь реквизит СсылкаНаОбъект

    Reply
  25. Odinsov

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

    Reply
  26. makas

    Вопрос: на основе документа «Списание с расчетного счета» можно получить «Поступление товаров и ecku@ с таблицей «Услуги» и/или «Агентские услуги» ?

    Reply

Leave a Comment

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