Перезаполнение остатков по взаиморасчетам с поставщиками УПП




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

23 Comments

  1. Sam13

    Вопрос, чем управляет флаг «Не очищать движения документов»?

    Reply
  2. Bubuyka

    Это значит, что указанные в соответствующих полях корректировки — не будут очищаться — к ним добавятся новые записи. Если галочку — не поставить — корректировки будут очищены. В описании об этом сказано..

    Reply
  3. Белка13

    Хорошая обработка, удобно! Еще бы… при задаче: «Перезаполнять данные по:»

    добавить функцию «по договорам контрагента». Вообще тогда классно!

    Reply
  4. Sema76

    Трудно будет добавить в эту обработку функционал, позволяющий вести корректировку по договорам, которые ведутся по заказам? Или это должна быть принципиально другая обработка?

    Reply
  5. Bubuyka

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

    Reply
  6. Sema76

    (5) Bubuyka, было бы интересно. У меня сейчас задача навести порядок в УПП по взаиморасчетам. Как по договорам в целом, так и по заказам. Где бы вот еще теорию почитать, чтобы понять, что сделать. Меня даже бы устроил подход, корректировать по одному контрагенту, договору, даже устроит, чтобы подобрать подходящую дату и время для корректировки по договору. Может как вариант «закрыть» существующие договора по заказам, и с чистого листа по новым (в смысле, в самой программе). Любой подход приемлем. Лишь бы постепенно привести все в порядок.

    Reply
  7. Bubuyka

    На самом деле сколько я не пыталась людей, сколько сама не думала так и не нашла пиши для ведения взаиморасчетов по заказам. Это избыточная аналитика по крайней мере в тех конторах в которых я работала. Регистры для учета взаиморасчетов по заказам используют все те же. Просто в регистрах Расчеты по приобретению и Взаиморасчетов по док расчетам заполняется еще и Заказ. Соответственно остатки превращаются в лохматый веник скрытый от глаз доблестный бухгалтерии. На самом деле самый лучший выход перекинуть остатки на новые договора, которые будут вестись по договору в целом.

    Reply
  8. Bubuyka

    Вот обработка для выправления взаиморасчетов по договорам, которые ведутся по заказам. Но еще раз обращаю внимание — что она может работать не корректно. Делала давно под спец. задачу. Но можно взять за основу сам принцип. Сильно уж не пугайтесь процентов на 90 она работает.

    Reply
  9. Bubuyka

    Обработка

    Reply
  10. Sema76

    (9) Bubuyka, спасибо!

    Буду разбираться! Думаю, результат будет. Мне это обязательно нужно сделать.

    Посмотрел «По заказам». Используются те же регистры. Можно ведь в запросе использовать поле «Сделка» для сравнения.

    Какие «подводные камни» могут быть, если применить ту же методику, что и «По договору в целом»?

    Reply
  11. Bubuyka

    (10) Sema76, да там все то же самое. Глянь в обработке. Подводные камни.. ну во-первых сложно найти человека, который сможет адекватно сказать, что да это поступление и эта платежка (по разным сделкам) так и должны висеть на остатке, а вот эти ошибочно отнесены на разные сделки, а на самом деле должны быть схлопнуты. Плюс бухгалтерия в ужасе от красноты творящейся в оборотке, по вине регистров о существовании которых они зачастую даже не подозревают. Так что мой совет — выводить оставить по всем договорам, делать их копии (только с каким -то признаком) переносить остатки на эти новые договора и вести уже в целом по договору.

    Reply
  12. Sema76

    (11) Bubuyka, нам нужно обязательно часть договоров вести «По заказам». Красноты уже много. Будем разбираться. Бухгалтера нормальные, продвинутые, несколько лет уже работают в УПП;) И не только они, но и экономисты и кладовщики, и расчетчики, короче все. Буду сообщать как развивается ситуация.

    Reply
  13. Bubuyka

    (12) Sema76, Ну в таком случае — искренне рада за тебя)) Это ОЧЕНЬ большая редкость! На самом деле если следить за этим делом — и держать руку на пульсе — то система работает четко — так что работать и по заказам вполне можно. Буду рада услышать о дальнейшей судьбе ваших взаиморасчетов!

    Reply
  14. Sema76

    (13) Bubuyka, посмотрел обработку По заказам. Пока не очень понял как она работает. Она у меня выводит Контрагентов, по которым все нормально, по которым есть проблемы не выводит, или я сам что-то путаю. Ведь для обработки по Заказам можно использовать обработку В целом по договору. Добавить Измерение Сделка. Ведь те же регистры используются:

    + Регистр накопления «Расчеты по приобретению (бухгалтерский учет)» — Регистр накопления «Расчеты по приобретению (бухгалтерский учет)»

    + Регистр накопления «Взаиморасчеты с контрагентами» — Регистр накопления «Взаиморасчеты с контрагентами»

    + Регистр накопления «Взаиморасчеты с контрагентами по документам расчетов» — Регистр накопления «Взаиморасчеты с контрагентами по документам расчетов»

    В чем отличие будет между По договору в целом и По заказам?

    Reply
  15. Bubuyka

    (14) Sema76, отличие и есть в измерении Сделка.

    Reply
  16. Sema76

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

    Для выявления проблемных договоров пользуюсь Универсальным отчетом по Регистру накопления «Расчеты по приобретению (бухгалтерский учет)». Обработка правильно создает Документ «Корректировка записей регистров». По отчету следим чтобы не перепутались заказы.

    Reply
  17. Sema76

    (15) Bubuyka, по корректировке Регистра накопления «Расчеты по приобретению (бухгалтерский учет)» Измерение «Сделка» вроде не мешает. Документ «Корректировка записей регистров» заполняется его значением. Просто, думаю, повнимательнее надо контролировать.

    Или здесь могут возникнуть какие-то ошибки?

    Reply
  18. Bubuyka

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

    Reply
  19. elisabet

    (17) Sema76, регистр расчетов по приобретению как раз отвечает за зачет авансов. Если в предоплате была указана сделка, и отгрузка произведена без сделки, то аванс не захлопнется. Еще там есть немаловажный признак — дата операции. Так вот — корректировка долга его заполняет. Даже при наличии задолженности! в результате, долг, образованный через корректировку долга не захлопывается при оплате.

    Reply
  20. Bubuyka

    (19) elisabet, Если есть задолженность — то в корректировке долга надо указать документ расчетов. Тогда все нормально будет закрываться. (Если конечно договор ведется по документам расчетов). С корректировкой долга вообще надо аккуратно.. Там шаг влево шаг вправо и можно такие взаиморасчеты получить что мама не горюй.

    Reply
  21. webcisp

    {Форма.Форма.Форма(275)}: Ошибка при вызове метода контекста (Записать): Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!



    может это ошибка потому что я использую один документ корректировка регистров по приходу и расходе ?

    Reply
  22. SvVolkova

    УПП ред.1.3.122.3

    {ВнешняяОбработка.ПерезаполнениеОстатковПоВзаиморасчетам.Форма.Форма.Форма(396)}: Ошибка при вызове метода контекста (Записать)

    НЗДанные.Записать();

    по причине:

    Запись не верна! Поле «Валюта» должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский учет); Номер строки: 20)

    Reply
  23. Bubuyka

    (22)

    Возможно у вас на одном из счетов завис остаток, в котором ошибочно (например бух. справкой) указали валюту и теперь обработка пытается честно эту проводку сторнировать. Проверьте остатки по оборотке в разрезе валют по «не валютным» счетам.

    Reply

Leave a Comment

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