Продажи товаров по отгрузке




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2018-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='\

21 Comments

  1. z4211485@yandex.ru

    Спасибо ! То что надо )))

    Reply
  2. samamoiloff

    Если в табличной части Реализации есть несколько строк с одинаковой Номенклатурой, то при объединении таблиц Движений по бух.счетам и Табличных частей документа возникает увеличение себестоимости ( во столько раз, сколько одинаковых строк по Номенклатуре, если 2 строки, то в два раза себестоимость увеличивается). Такое бывает, когда бухи ставят разную цену на один и тот же товар. Вероятно нужно при связывании этих таблиц, указывать не только «ПО Движ.Субконто1=ТЧ.Номенклатура», но и Движ.Количество=ТЧ.Количество, хотя не знаю, при использовании учета по Партиям, проводки по количеству разделяются на несколько или нет, если разделяются, то фокус не пройдет.

    Reply
  3. bezuh

    Искал такой отчет!

    И нашел!

    Огромное спасибо за хорошую работу!!!

    Reply
  4. abonement

    Отчет очнь понравился!!!!!!!Только можно вопросик:а как внести еще одну колонку,чтобы прибыль считалась?

    Reply
  5. Bux2

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

    Reply
  6. Константин С.

    >>>Такое бывает, когда бухи ставят разную цену на один и тот же товар.

    Да заметил такое, но это крайне, крайне редное явление.

    >>> а стоимости продажи единицы товара нет

    ну это показалось лишнее.

    А так, загляните в «Настройки», там есть закладка «Пользоательские поля» ну и добавив туда «Выражение» и такой формулой: Выручка / Количество получите нужную вам стоимость проданной единици)))))

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

    Reply
  7. tossik

    Спасибо! Очень помог ваш отчетик. Только если в документе «Реализация товаров и услуг» в ценах и валютах установлен флаг «сумма вкл.НДС», то колонка Вашего отчета «Сумма продажи» заполняется с НДС, а нужно без НДС, раз себестоимость выводится без НДС. Или я просто не разобралась с настройками Вашего отчета. Некоторые отгрузочные накладные у меня были введены с флагом «сумма вкл.НДС», пришлось их перебить вручную, прежде чем воспользоваться Вашим отчетом.

    Reply
  8. VasilyErmak

    http://infostart.ru/projects/1953/?p=1#comm19

    Здесь без перечисленных ошибок, но за деньги.

    Reply
  9. VasilyErmak

    И не по одному документу «Реализация товаров и услуг».

    Имеет статус 1С:Совместимо.

    Reply
  10. looxxx

    Этот поновее будет http://infostart.ru/projects/2706/

    но тоже за деньги

    Reply
  11. delat

    чудесно

    Reply
  12. IP43

    Писал нечто подобное под 77, не хотелось под 8-ку переделывать, поискал, и к радости нашел этот отчет.

    Reply
  13. IP43

    Начались розничные продажи, а данный отчет это не учитывает, придется доделывать переделывать 🙁

    Reply
  14. Поручик

    В БП 2.0 тоже работает.

    Только потребовалось допилить для вывода показателя эффективности продаж, как в УТ 10.3

    Reply
  15. dmitish

    Работает не совсем корректно если включен партионный учет.

    Reply
  16. migdal

    Мне отчет очень понравился, реально «то, что надо» !!! Но все-таки, уважаемый автор, нельзя ли объяснить или прямо четко по пунктам указать, как сделать так, чтобы показывалась ЦЕНА ПРОДАЖИ. Из (6) не очень понятно. Заранее благодарен. Можно ответить в личку.

    Reply
  17. dopolnenia

    Очень хороший отчёт, автору большой респект

    Reply
  18. darin44

    Мне отчет очень понравился, реально «то, что надо» !!! Но все-таки, уважаемый автор, нельзя ли объяснить или прямо четко по пунктам указать, как сделать так, чтобы показывалась ЦЕНА ПРОДАЖИ. Из (6) не очень понятно

    Reply
  19. Гость

    Спасибо за обработку, пригодилась

    Reply
  20. RPV

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

    Жаль, что с тех пор как samamoiloff написал это замечание прошло уже 3 года, а автор не исправил этот косяк.

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

    Reply
  21. lady_lace@mail.ru

    Добрый день, хорошая обработка, для быстрого сбора данных к отчету очень пригодилась.

    Reply

Leave a Comment

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