Валовая прибыль по оплате для УТ, УТП, УПП (Продолжение)




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

38 Comments

  1. SergAn

    Отчет в момент формирования сводной таблицы выдает ошибку: «Не достаточно памяти».

    Reply
  2. script

    Какой объем Вашей базы и за какой период делаете отчет? У меня на файловой в 4,5 Гб отчет работает.

    Reply
  3. SergAn

    Файловая 3,8 Гига, Комп i5 4 Гб оперативки Win 8.1 x 64. Изменение числа группировок дает туже проблему

    Reply
  4. SergAn

    Период месяц

    Reply
  5. script

    Какая конфигурация? Файл качали из этого поста или предыдущего?

    Reply
  6. SergAn

    УТ 10.3. Файл из этого поста

    Reply
  7. script

    Буду разбираться.

    Reply
  8. crashwork

    Здравствуйте. Скачал файл для УТП. Подскажите пожалуйста при построении отчета:

    Иванов

    ТоварХ Количество ед. хранения 1 Стоимость 378,37

    ТоварХ Количество ед. хранения 0,34 Стоимость 127,57

    Откуда берутся нецелые цифры единиц товара? Такое впечатление, что как будто клиент оплатил «кусочек» товара — 0,34. Мелькают цифры и в большую сторону например:

    ТоварХ Количество ед. хранения 1,34 Стоимость 507,05

    Смотрю реализацию, оплату, отгрузку, все ок. Была продана 1 позиция товара, отгрузка и оплата есть с сохранением оси времени. Почему в отчете 0,34 не могу понять?

    Reply
  9. script

    Расчитывается коэф. оплаты. Без данных сказать очень трудно но принцип следующий:

    Если одну расходную, в которой была одна строка в табл. «товары» на колич. 1 и сумму 378,37, погашали 3 платежа равными частями, тогда каждый платеж погасил 0,333333333333 количества товара и 378,73 / 3 = сумма.

    Reply
  10. script

    Добаввьте последнюю группировку «Дата закрытия» и увидите даты оплат, когда погашалась данная расходная.

    Но вообще то сумма продажи должна быть равна сумме расх. накл. Может быть вы установили какието отборы, которые приводят к ошибочному результату, который я не учел — это может быть.

    Reply
  11. script

    Перекачайте файлы. Я только что обнаружил что на инфостарте лежат не самые свежие.

    Reply
  12. crashwork

    Скачал файлы обновленные, все стало на свои места, пока очень нравится отчет. Особенно то, что после первого построения я вдруг вспоминаю, что мне нужна еще какая-то группировка в отчете или данные, повторный просчет делается налету. В отличии от громоздкого стандартного отчета.

    Reply
  13. ogre2007

    Есть управленческий учет в рублях, ходим видеть отчет в USD.

    Какой курс пересчета себестоимости партии: на момент поступления или реализации?

    И вообще, корректно вести учет в рублях, а прибыль считать в USD?

    Reply
  14. script

    (13) ogre2007,

    1. На дату партии

    2. Для отчета это не важно.

    Читайте комменты и описанияе там все есть.

    Reply
  15. Bozhevilnoe

    Все хорошо, но формируется он ну оооочень долго. Тот который для УТП.

    И при изменении валюты не формирует по новому, только при первом формировании.

    Reply
  16. Deroswent

    А есть ли аналоги этого отчета для управляемого приложения. Нужно для 1С:Предприятие 8,3 Конфигурации УТ для Украины 3,0

    Reply
  17. script

    (16) Deroswent,

    Поищите здесь на сайте «Продажи по оплате» для УТ 11. Украинская УТ 3.0 является локализированным аналогом российской УТ 11 и по этому отчеты для УТ 11 должны работать и на УТ 3.0

    Reply
  18. Helper

    Попробовали отчёт на «Управление торговым предприятием для Украины» (1.2.35.1) и так и не выводятся в отчёт продажи, например, оформленные в декабре, оплаченные в январе и при этом, если период отчёта выставлен — январь. Кажется по описанию, отчёт должен был отобразить продажу декабря. Или я ошибаюсь?

    И ещё момент, если сформировать отчёт в валюте USD, а потом выбрать, например, валюту EUR и снова сформировать отчёт, то данные так и остаются в USD. Только если выйти из отчёта, снова запустить, выбрать валюту EUR, сформировать — в таком случае дынные оказываются сформированы в EUR.

    Reply
  19. YurokB

    Добрый день. Скачал отчет запускаю за месяц через 3 часа ожидания темпдб достиг 50гб место на винте кончилось база сломалась. Делал в УПП

    Reply
  20. script

    На больших базах есть проблема. Запрос распределения оплаты на продажи не оптимальный.

    У моих клиентов проблем с ним нет — там файловые базы 6-7 ГБ.

    А переделывать сейчас нет времени.

    Reply
  21. script

    (18) Helper,

    Попробовали отчёт на «Управление торговым предприятием для Украины» (1.2.35.1) и так и не выводятся в отчёт продажи, например, оформленные в декабре, оплаченные в январе и при этом, если период отчёта выставлен — январь. Кажется по описанию, отчёт должен был отобразить продажу декабря. Или я ошибаюсь?

    Именно так и должен работать.

    И ещё момент, если сформировать отчёт в валюте USD, а потом выбрать, например, валюту EUR и снова сформировать отчёт, то данные так и остаются в USD. Только если выйти из отчёта, снова запустить, выбрать валюту EUR, сформировать — в таком случае дынные оказываются сформированы в EUR.

    Это я проверю.

    Reply
  22. YurokB

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

    Reply
  23. script

    (22) YurokB,

    «Один и тот же запрос выполняется миллион раз»

    Это Вы, как говорится гоните. В отчете нет выполнения запросов в циклах, с этим все нормально.

    «в запросах по регистрам нет дат начала запроса»

    А вот то, что есть обращение запросом к регистру «взаиморасчеты с контрагентами» без ограничения по периоду — это да — есть.

    В этом и есть вся проблема.

    Нужно это переделать но пока не знаю как.

    Не понятно, как ограничить период. Если по периоду отчета, то мы не получим реальных оплаченных продаж.

    Иными словами, получим продажи по которым были оплаты в указанный период.

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

    В общем если реально решать такую задачу, то получения данных об оплатах решается не просто.

    Может кто подскажет решение — буду благодарен.

    «В общем извините, но отчет туфта полная, не советую не кому его качать.»

    Ну это ваше мнение и оно не есть истиной. У меня этим отчетом пользуются клиенты с файловыми базами 6-7 ГБ.

    На скулях -это были бы базы в десятки гигобайт. У моих клиентов, этот отчет на таких базах, и при нормальном железе формируется 2-3 мин.

    Ну а если в целом, то этот момент обязательно нужно оптимизировать — но пока не знаю как.

    Reply
  24. user605403_thetimour

    Добрый день, все все прочитал, что смог понял. Однако требует уточнения следующий вопрос по работе отчета: Попадут ли в отчет те оплаты по заказам, реализация которых прошла в другом периоде, раньше? Пример:

    30.12.2015 — Продажа 1 (реализация товаров и услуг)

    01.01.2016 — Оплата 1

    Если период — январь 2016

    Reply
  25. user605403_thetimour

    Скачал файл, попробовал запустить с параметрами по умолчанию и периодом за 2 недели. Выдает ошибку. Пробовал запускать несколько раз.

    Текст ошибки: {ВнешнийОтчет.script_ВаловаяПрибыльПоОплате.МодульОбъекта(584)}: Ошибка при вызове метода контекста (Выполнить)

    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпановкиДанных, Настройки,,,Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));

    по причине:

    Ошибка компоновки макета

    по причине:

    Ошибка генерации макета

    по причине:

    Ошибка получения информации набора данных

    по причине:

    Ошибка в запросе набора данных

    по причине:

    {(65, 31)}: Поле не найдено «ПродажиСебестоимость.НДС»

    ИНАЧЕ ПродажиСебестоимость.<<?>>НДС * (КурсыВалютУпр.Курс * КурсыВалютОтчета.Кратность) / (КурсыВалютОтчета.Курс * КурсыВалютУпр.Кратность)

    1С:Предприятие 8.2 (8.2.19.130)

    Конфигурация: «Управление торговлей», редакция 10.3 (10.3.23.3)

    Reply
  26. script

    (24) user605403_thetimour,

    Попадут ли в отчет те оплаты по заказам, реализация которых прошла в другом периоде, раньше? Пример:

    Да попадут. именно для это отчет и делался.

    По поводу ошибки проверю

    Reply
  27. user605403_thetimour

    Вот уже несколько дней прошло как я сижу с неработающей обработкой (текст ошибки выслал выше).

    Сколько еще дней необходимо ждать?

    Reply
  28. user605403_thetimour

    Короче, спустил деньги впустую. Высланная обработка не работает. Разработчик написал «посмотрю». Представитель support’a запросил выслать информацию, после чего вообще не реагирует. Развод чистой воды, рекомендую всем ничего здесь не брать.

    Reply
  29. script

    Обновил файл Валовая прибыль по оплате для УТ 10, УПП.

    Исправил ошибку:

    {(65, 31)}: Поле не найдено «ПродажиСебестоимость.НДС»
    ИНАЧЕ ПродажиСебестоимость.<<?>>НДС

    Проверял на УТ 10.3.16

    Reply
  30. script

    Обновил файл Валовая прибыль по оплате для УТ 10, УПП.

    Исправлены обнаруженные ошибки.

    Проверка работоспоособности проводилась на релизе УТ 10.3.37.3

    Reply
  31. Helper

    (21)

    Именно так и должен работать.

    Но не работало.

    (29)

    Обновил файл Валовая прибыль по оплате для УТ 10, УПП.

    Для УТП файл не обновляли случайно?

    Reply
  32. script

    29.09.2016 — Обновлен файл для УТ 10.

    1. Исправлена ошибка расчета суммы продажи с НДС.

    Ошибка приводила к тому, что программа, к сумме продажи с НДС еще раз добавляла НДС, а колонка «сумма продажи без ндс» выводила сумму с ндс.

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

    Reply
  33. script

    (31) Helper,

    Все работает именно так. У Вас, скорее всего, в договоре выставлено: «Вести взаиморасчеты» = «По договору в целом». Поставьте «по заказам»

    Reply
  34. realmrak

    Увидел две проблемы (отчет для УТП):

    1. Не учитывает начальный остаток долга по в/р — база не с нуля, а внесены остатки на начало года. В итоге показывает оплаченную продажу за первый месяц, хотя это всего лишь закрытие «начального» долга, а продажа будет оплачена позже.

    2. Судя по тексту, отчет должен показывать частично оплаченные продажи, но он этого не делает (даже в тексте есть расчёт коэффициента оплаты, но условием <> 1 отсекаются документы, не оплаченные полностью).

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

    Reply
  35. script
    коэффициента оплаты, но условием <> 1 отсекаются документы, не оплаченные полностью).

    Задача именно так и ставилась. Только полностью оплаченные продажи.

    Не учитывает начальный остаток долга по в/р — база не с нуля

    Вот это не понял.

    Reply
  36. Mikov_Evgeniy

    (29) В отчете для УТП такие же ошибка, на сегодня. Прошу тоже сделать корректировку

    Reply
  37. namazi74

    спасибо за такой глобальный отчет! сам делал, но никак не получалось отловить все платежи за отгрузки прошлых периодов. ваш проверяю — пока нареканий нет

    Reply
  38. ilyinaka

    Здравствуйте! Спасибо за отчет! В целом всё ок, но есть проблемка )

    В столбцах Себестоимость без НДС и Себестоимость с НДС — одинаковые значения. Столбец Себестоимость НДС — пустой.

    Проверила, ндс по себестоимости товаров есть.

    Кто сталкивался? как исправили?

    Reply

Leave a Comment

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