Формирование прихода по реализации




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

27 Comments

  1. CheBurator

    Можно распределять приходы с разными ценами в разные дни? делает ли автоматом сборку «расходных» накладных за период и консолидирует по возможности под них закупки..?

    задача вообщем-то не сильно сложная, гораздо интереснее было бы обеспечить получение «требуемой» науенки при условии невозможности изменения входных и выходных цен… ;-))

    Reply
  2. Murka

    Понравилось…

    Reply
  3. CheBurator

    Где ответ на мой вопрос? 😉

    Reply
  4. O-Planet

    Да они как бы не в тему. Просто надо взять и посмотреть.

    Reply
  5. Некоммуникабельность

    :-((( У меня не получается! Что я делаю не так?

    Деление на 0

    — Выполнено…

    Не забудьте проверить и провести сформированные документы!

    Reply
  6. CheBurator

    > Да они как бы не в тему. Просто надо взять и посмотреть.

    вопросы в тему!

    .. еслисначала юзать а потом читать — то сильно дорого получится…

    Reply
  7. O-Planet

    Что за конфигурация? УСН, Типовая??? если УСН, то проверяется счет МХ.2, если типовая, то смотрится оборот 41-го. Правильно укажите склад, контрагента… А вообще, там описание имеется.

    Reply
  8. Некоммуникабельность

    «Те товары, остатки по которым окажутся отрицательными, войдут в сформированные документы поступления».

    А разве можно в типовой бухгалтерии отгрузить товар, которого нет на складе? У меня и накладная не проведется…

    Reply
  9. O-Planet

    Это целая наука. Кто ее не разумеет, тому и ента обработка ни к чему

    Reply
  10. kivduts

    Клёва ещё бы по минусам считала ваще было бы супер

    Reply
  11. SM_2008

    «Обработка распространяется бесплатно. Вы можете использовать ее в коммерческих целях..»

    У меня нестандартаня конф ТиС, поэтому пишет ошибку-переменная не определна. Хотела открытьи исправить-просит пароль.

    Где его взять?

    Хотелось бы как-то все-таки посмортреть разработку.Такая обработка нужна.

    Не могу посмотреть-покуа-«минус»

    Reply
  12. O-Planet

    Вообще, оно для Бухгалтерии, а не для ТиС, поэтому, не подойдет даже с паролем.

    Reply
  13. Alkima

    вот нашелся бы добрый человек, который бы сделал нечто подобное для Бухии (Украина)….

    Reply
  14. tsyri

    если необходимо месяц делить на периоды и делать приходы то после первого сформированного прихода выдает ошибку, что номер не уникален, так же выводит позиции с нулевыми ценами

    Reply
  15. O-Planet

    (14) Возможно, что-то не так с базой. Скорее всего, у Вас сбиты номера в документах по причине чьей-то любви нумеровать все вручную. Можно сделать перенумерацию, как вариант.

    Reply
  16. tsyri

    Деление на 0

    Док.Записать();

    {ФОРМИРОВАНИЕ ПРИХОДА ПО РЕАЛИЗАЦИИ.ERT(176)}: Номер не уникальный! Первый приход формируется нормально, но при втором формировании прихода за месяц выдает ошибку. Номера здесь ни при чем, делала перенумерацию, тогда пишет выполнено деление на 0 и все позиции с нулевыми ценами

    Reply
  17. O-Planet

    «выполнено деление на 0» — на какой строке? Т.е., какой номер в скобках? Про номера — точно они. Много раз с таким сталкивался. Если бы посмотреть Вашу базу, то нашел бы. Впрочем, добавил в обработку проверку на уникальность номера. Качайте, проверяйте. Если все зарабортает, то значит, виноваты были номера документов, и у Вас они сбиты.

    Reply
  18. CheBurator

    деление на ноль, типовые причины:

    — пустая строка в тч дока;

    — не задана единица измерения;

    — в единице измерения Кф = 0;

    Reply
  19. CheBurator

    для «облегчения» ситуевины в неуникальными номерами: создавай эти доки с префиксами, меньшими чем алфавитные буквы, типа «/», «!»,»+»… Заодно по этим номерам будет «видно» нужные доки

    Reply
  20. elya_wira

    мне оч. понравилось. спасибо

    Reply
  21. O-Planet

    мне тоже очень понравилось 😉

    Reply
  22. ost.a

    А для 8. … есть такая?

    Reply
  23. Душелов

    Есть, выкладывал кто-то подобное.

    Ссылочкой не поделюсь.

    Reply
  24. O-Planet

    Надо будет сделать. Уже неоднократно замечаю, как досужие товарисчи быстренько воплощают проверенные идеи.

    Reply
  25. Abadonna

    Эх, Планет, мне бы твои проблемы 😉 Делаю именно приходы под реализацию, но т.к. фирм много (своих) еще надо и найти по КАКОЙ именно есть остаток со всеми вытекающими :))))

    Reply
  26. jbi

    Очень полезная вещь, спасибо Вам огромное 🙂

    Reply
  27. Фред

    Спасибо! Работает нормально 7.7 Бухгалтерия…На УСН не пробовал

    Reply

Leave a Comment

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