[БП 3.0] Заполнение табличной части "Приобретенные ценности" документа "Формирование записей книги покупок" по субсчетам 19 счета




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

9 Comments

  1. rinik88

    обработка работает, а как быть с контрагентами)? просто понятно как вы заполняете, а вот как 1с это делает? непонятно)

    Reply
  2. Alex_E

    (1) rinik88, как заполняет 1с можно посмотреть в команде заполнения, я использую свои запросы. Если Вам нужно прост заполнение по контрагенту, то напишите поподробнее, как именно это нужно сделать, добавить в эту обработку отбор в принципе несложно, уточните как именно это нужно сделать — заполнение по конкретному контрагенту, выбираемому в форме, или это может группа или список, или ещё какие-то другие критерии отбора интересуют?

    Reply
  3. rinik88

    (2) табличную часть по полученным авансам нужно заполнять по контрагентам, то есть отбору по контрагенту. а 1с я имел ввиду, что когда я отлаживал код, то видел то что судя по коду формирование таблицы значений полученных авансов формируется из временного хранилища, как оно туда попало, каким образом оно заполняется не ясно.

    Reply
  4. Alex_E

    (3) rinik88, ТО, что заполнение идёт из временного хранилища — это нормально — поскольку длительная операция, включайте отладчик и в начале процедуры заполнения точку останова, идите по шагам — увидите как что заполняется…

    Эта обработка не для НДС с авансов, хотя по этому принципу можно сделать заполнение ТЧ НДС с авансов, если Вам это нужно…

    Reply
  5. rinik88

    (4) нужно, и не только думаю мне, много организаций уплачивающих ндс, думаю для буха будет удобна такая вещь

    Reply
  6. Alex_E

    (5) rinik88, Сформулируем ТЗ. Вас не устаривает, как формируется заполнение ТЧ НДС с авансов полученным типовым механизмом от 1С.

    Нужно:

    сделать заполнение ТЧ НДС с авансов полученных, с возможностью отбора по контрагентам. Заполнение должно производиться по всем остаткам счета 62.02 выбранного контрагента, на которые не были выписаны счета-фактуры на аванс, вне зависимости от периода, в котором тот аванс был получен, или интересуют только авансы, полученные в текущем месяце?

    Следует ли учитывать способ выписки счетов-фактур на аванс, установленный для организации (на все авансы, только на не зачтенные…ну там 5 вариантов)?

    Учитывать ли ставку НДС, установленную в документах поступления денежных средств (типовое заполнение не выписывает счета-фактуры на аванс, если указана ставка Без НДС)?

    Просто так нарисовать, без уточнения этих детаей…проблематично 🙂

    Reply
  7. rinik88

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

    Reply
  8. Alex_E

    (7) rinik88, Отбор по контрагентам, и всё тут? То, что я спросил выше остается непонятным….

    Отбор по контрагентам — речь вообще идёт о заполнении?

    Reply
  9. rinik88

    (8) да, о заполнении.

    Reply

Leave a Comment

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