Отчет по продажам с себестоимостью, наценками, рентабельностью (по регистру бухгалтерии) для БП 3.0




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

20 Comments

  1. Neznayka

    Доброго времени!

    Через файл-открыть, открывает.

    При попытке добавить во внешние отчеты, ошибка:

    Невозможно подключить дополнительный отчет из файла.

    Возможно, он не подходит для этой версии программы.

    Метод объекта не обнаружен (СведенияОВнешнейОбработке)

    Проверяли на релизе 3.0.49.28 и 3.0.50.21

    Спасибо

    Reply
  2. kg2

    Доброе время! Отчет доработал . Теперь можно подключать как внешний отчет.

    Reply
  3. Montecrizto

    Ошибка на предОпределенный элемент справочника СтатьиДвиженияДенежныхСредств РозничнаяВыручка

    В конфигураторе проверил, элемент есть. на другой базе запустил отчет — работает. Странно…

    Reply
  4. kg2

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

    Reply
  5. Montecrizto

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

    Reply
  6. user644074_moollik

    Жаль, что только по 41 счету себестоимость берет «ЦенаЗакупиБезНдс». Можно добавить 43 счет, чтобы так же себестоимость готовой продукции учитывалась при расчете «НаценкаЕдБезНдс» и «Рентабельность»??? Было бы очень хорошо!

    Reply
  7. kg2

    Я посмотрю.

    Reply
  8. kg2

    В отчет попадают проводки (Себестоимость продаж) ДТ 90 .02.1 — КТ любой корреспондирующий счет. 41, 43, 10 . Сейчас проверил. все работает.

    Reply
  9. logdog

    Наменклатура написано в одном из вариантов

    Reply
  10. logdog

    и не хватает отборов по номенклатуре и контрагентам.

    Reply
  11. kg2

    Добрый день!

    Отбор по номенклатуре и контрагентам устанавливается в настройках отчете . Вкладка «Отборы» добавить отбор. Выбираете контрагент или номенклатуру . Проверил работает.

    Reply
  12. kg2

    (9) Ок. Исправлю.

    Reply
  13. logdog

    (11) неудобно, что нужно выбирать значение = номенклатура, а только потом, выбирать саму номенклатуру.

    Reply
  14. iva-74

    Добрый день

    1С:Предприятие 8.3 (8.3.12.1529) будет работать?

    Reply
  15. kg2

    (14) Добрый день! Да, будет работать на 1С:Предприятие 8.3 (8.3.12.1529) проверил.

    Reply
  16. kermzyxer

    Отборы не то что не удобно, но и не всегда работает. Добавил контрагента. Приходится еще раз выбирать что именно мне нужно в значениях. Ладно выбрал, открыл. Потребовался договор, его нет, ладно попробую Документ.Договор. Открываю значения, нет выбора типа и видны ТОЛЬКО ДВА договора. Открыл (через изменить). Один договор одного контрагента, второй другого. В отчете таких нет. Откуда взял непонятно. Совсем выкинул отборы. Добавляю только договор. Вижу те же два договора. Никаких выборов типа нет, возможность выбрать другой договор, нет. Выбрал Документ.Грузополучатель, контрагенты открываются нормально, без вопросов о типе. Неудобно выбирать дважды контрагента и что за фокус с договорами. Посмотрите пожалуйста. В целом отчет нравится, но это здорово портит.

    Reply
  17. kg2

    (16) Хорошо, посмотрю .

    Reply
  18. user1227361

    Добрый день. Заинтересовался вашим вариантом отчета. Можно ли его приобрести каки-либо привычным способом? (за рубли)?

    Конфигурация 3.0.70.61. Могу забросить на карту

    С ув.

    Reply
  19. user1284974

    Добрый день! Подскажите почему не считает со ставкой НДС20, НДС18 все показывает, а после перехода на НДС20 нет.

    Reply
  20. kg2

    (19) с 24.06.2019 внесены изменения в алгоритм , ставка 20% корректно отражается в отчете.

    Reply

Leave a Comment

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