Загрузка начальных остатков взаиморасчетов с партнерами из файла Excel для конфигурации ERP




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

16 Comments

  1. svetak

    Добрый день. Купили обработку. Для ERP 2.4.5 той же обработкой пользоваться?

    Reply
  2. svetak

    Добрый день еще раз. Детали к моему письму выше. Релиз ERP 2.4.5.135.

    Создает документ ввод начальных остатков, контрагента ищет — договор НЕ ищет.

    Я не понимаю, как правильно в формате excel назвать поля договора. По номеру и дате — как указано у вас в комментариях — не ищет, а создает новый договор.

    Типовой ввод остатков даже договора с расчетами «По договору» требует сгенерить сами расчетные документы, а этого ваша обработка не умеет делать.

    Или умеет, но не эта?

    Смотрите скриншот.

    Reply
  3. Hokum

    (2)

    Если требуется указать договор как расчетный документ , то в файле excel в поле «Объект взаиморасчетов» надо указать слово «Договор», а в номере и дате расчетного документа указать дату и номер договора.

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

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

    Если все равно не получается, то я проверю как работает для ERP 2.4.5.135, возможно там какие-то нюансы.

    Reply
  4. svetak

    Добрый день. Я так и сделала, в файле указала слово договор, в отдельных полях номер и дату. При загрузке он мне создал новый договор, ранее созданный с теми же номером и датой не нашел. Все равно создает новые договора

    Теперь по поводу объекта расчетов., посмотрите скриншот внимательно. на поля документа ввода остатков.

    раньше, если в договоре стоял вид расчетов «По договору» — он сам объект расчетов записывал как договор. Сейчас он записывает как объект расчетов сам договор, и дополнительно требует документ расчетов в отдельном поле. Обработки, которая генерит документы расчетов (как в УПП была встроенная в документе ввода остатков) — тут нет. Если допишите, буду благодарна и вам доплачу. Сама не программист.

    Reply
  5. Hokum

    (4) Ок, я проверю в ближайшее время работу в версии 2.4.5.135

    Reply
  6. svetak

    Добрый день. Не получилось проверить?

    Reply
  7. svetak

    Добрый день. Уточнения по задаче. До редакции 2.4.2 в документе ввод остатков по взаиморасчетам тоже было поле Расчетный документ, но его можно было оставлять пустым для договора с детализацией расчетов «по договору». При проведении в соответствующие регистры записывался в качестве документа сам документ ввод начальных остатков.

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

    На ИТС есть статья об этом.

    Так что Андрей, чтобы ваша обработка была востребована в новых релизах, ее надо подправить. И продавать дороже-))

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

    Нам нужно уже очень быстро, вы сможете поправить?

    Reply
  8. Hokum

    (7) Проверил, всё работает и для 2.4.5.135

    Какой «Тип операции» документа?

    Было бы хорошо прикрепить сюда файл , откуда загружаются остатки (Наименование контрагента можно удалить, ОКПО изменить на любое другое, остальное не трогать)

    Reply
  9. svetak

    Добрый день.

    Для любого типа операции. Например, начнем с ввода остатков задолженности клиента.

    1. Открываю обработку.

    2. Эксельный файл создаю из шаблона вашей же обработки «Сформировать шаблон для заполнения»

    3. Поля заполняю, как написано у вас в примечаниях в шаблоне.

    4. Подгружаю заполненный шаблон, нажимаю загрузить файл.

    5. Переходим на вторую закладку — из файла не подставляется дата платежа. Для проверки прямо в обработке ставлю ее вручную.

    6. Нажимаю создать документ.

    Документ создается без установленных галочек ОУ и БУ, ставим вручную — открывается табличная часть, в которой видно что расчетный документ (который должен быть типа Реализация клиенту) — пустой. Без него документ не проводится. В версиях до 2.4.2 с пустым полем проводилось.

    Прикрепила файл со скриншотами с порядком действий и файл загрузки.

    Что вы имеете в виду «изменить ОКПО» — у вас ни в обработке, ни в файле загрузки нет такого реквизита. Я использовала наименование и ИНН, находит. Странно, что если в наименовании хоть одна буква не совпадает — то по ИНН не ищет.

    Я сейчас для написания файла со скриншотами «прогнала» еще раз, только открыла БД на другой платформе. Не знаю, это помогло или нет — договоры начал находить, и даже создал расчетные документы. Только для типа операции Задолженность клиенту создал документы Приобретения у поставщика. Должен был реализация клиенту. Ну и даты платежа не подставляет.

    Reply
  10. svetak

    Добрый день.

    На загрузке с реальными контрагентами при считывании данных из эксельного файла в табличную часть обработки база падает с ошибкой с записью дампа. Скажите, пожалуйста, встречалась ли уже у кого-то такая ошибка? Если да, при каких условиях она появлялась?

    Reply
  11. svetak

    Добрый день еще раз. Разобрались с падением базы — падала всегда если строк в файле больше 10. Исправили ошибку — в этой процедуре, смотреть скрин

    Reply
  12. human_new

    (11)Так если переделывать обработка достойная. Дописывать конечно приходится, но основной объем работы вы проделали. Кстати лучше перевыложить обработку, одного скрина явно недостаточно, чтобы исправить зависания

    Reply
  13. Hokum

    Доработал под версию 2.4.5, теперь создает первичные документы, проводит ввод остатков. Проверил во всех четырех режимах, проводит документы без проблем.

    У меня загружается без ошибок с количеством строк в файле гораздо больше 10. Возможно не дружит с какой-то версией экселя. И необходимо, что бы файл загрузки не был открыт в этот момент в экселе.

    Reply
  14. svetak

    Добрый день. Как мне скачать актуальную версию?

    Я бы купила заново, если она исправлена, но смущает наименование файла для скачивания «Загрузка начальных остатков взаиморасчетов с партнерами из файла excel для конфигурации ERP 1.1»

    Это точно новая версия выложена?

    Reply
  15. Hokum

    (14) могу на почту прислать, киньте почту в сообщении или сюда

    Reply
  16. svetak

    Спасибо. skuv@list.ru

    Reply

Leave a Comment

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