Отчет по счетам-фактурам (Отчет по продажам с себестоимостью, партиями, НДС и всем остальным, что необходимо бухгалтеру)




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

24 Comments

  1. bearcat

    Полезная обработка.

    Нужно еще, чтобы слева от столбца «контрагет»

    1. был столбец «новый» , в котором бы стояли даты реализации, если за последние 12 месяцев первая реализация прошла в пределах 6 месяцев. То есть, например, отчетный месяц март 2011, значит проверяем как давно появился контрагент за посление 12 мес .Если не было по нему реализации до октября 2010 года, значит — новый.

    2. был столбец «ответственный менеджер» , в котором из справочника КОНТРАГЕНТЫ был указан менеджер, который на вкаладке как ОСНОВНОЙ менеджер

    3. чтобы был отбор по менеджерам , то есть какая рентабельность продаж по конкретному менеджеру

    Reply
  2. McLer

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

    по 1му пункту, не совсем понятно зачем знать новый или не новый контрагент?

    и алгоритм не совсем точный, а если все таки была реализация за последние 12 месяцев, но дольше чем 6 месяцев, почему контрагент новый?

    Reply
  3. bearcat

    (2) по 2 и 3 пункту поняла, сегодня скачала фойл, завтра протестирую

    по 1 пункту , ну надо так, чтобы посчитать % от продаж менеджеру, такие правила у нас.

    Если новый клиент, то для него особенные условия. А кого считать «новым» определило руководство фирмы, так оно определило: проверяется период последние 12 месяцев , в каком появился клиент, мож он был в мохнатом году, а после его забыли, а потом возобновили продажи ему, тогда он приравнивается к новому. А если была реализация в течение 12 месяцев хоть в одном месяце, то он уже не новый.

    Пример

    январ, февраль, март, апрель, май, июнь — не было реализации

    июль, авг, сент, окт, нояб, дек — есть реализация — НОВЫЙ

    или

    январ, февраль — была реализация ,

    март, апрель, май, июнь — не было реализации

    июль, авг, сент, окт, нояб, дек — есть реализация — СТАРЫЙ

    а почему 6 мес?

    потмоу что в течение этих 6 мес рентабельность должна быть не ниже установленной нормы, тогда будут повышенные проценты.

    Вот так все сложно.

    Вручную проверять каждого клиента за последние 12 месяцев «новый» он или «не новый» весьма муторно, мягко говоря.

    Я понимаю, что это специфическая просьба, вряд ли кому еще понадобится, потому попросила на «авось».

    Если это сложно сделать, то, конечно нет вопросов, буду дальше выборку делать вручную.

    Reply
  4. McLer

    (3)

    ВЫБРАТЬ
    Контрагенты.Ссылка,
    ВЫБОР
    КОГДА ВложенныйЗапрос.ПоследняяДатаПродажиОт6До12мес ЕСТЬ NULL
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК Новый
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК ПоследняяДатаПродажиОт6До12мес,
    РеализацияТоваровУслуг.Контрагент КАК Контрагент
    ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    ГДЕ
    РеализацияТоваровУслуг.Проведен
    И РеализацияТоваровУслуг.Дата >= ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -12)
    И РеализацияТоваровУслуг.Дата <= ДОБАВИТЬКДАТЕ(&Период, МЕСЯЦ, -6)
    
    СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслуг.Контрагент) КАК ВложенныйЗапрос
    ПО Контрагенты.Ссылка = ВложенныйЗапрос.Контрагент
    ГДЕ
    Контрагенты.Покупатель
    И (НЕ Контрагенты.ПометкаУдаления)

    Показать

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

    Его так же можно включить и в мой отчет, но я этого делать не буду, а любому прогеру это не проблема.

    Вообще советую держать программиста в штате;) или хотя бы обращаться в фирмы франчи 1С. работать бы начали эффективнее. ИМХО.

    Reply
  5. forurchik

    Отличный отчет. мне очень понравился .насчет франчайзи. у нас их тяжеловато нормальных найти. пара всего есть нормальных. и все остальные шарлотаны…

    Reply
  6. a31
    McLer пишет:

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

    Вообще советую держать программиста в штатеsmile;) или хотя бы обращаться в фирмы франчи 1С. работать бы начали эффективнее. ИМХО.

    Спасибо, работает, правда почему то показывает рентабельность 100% хотя у нас 100% и не пахнет…

    Reply
  7. gorloom99

    А что вывести список не то что надо?

    Reply
  8. orsprog

    Отчет на основание документов СФ, Реализация товаров и услуг, докуметов Поступления товаров и регистра партии товаров показывает информации о покупателях, продаваемых партиях, ставках НДС постуления и продажи, высчитывает % рентабельности. А на бухгалтерии он будет работать?

    Reply
  9. McLer

    (8) Нет этот отчет для конфигурации УТ 10.3, будет работать на комплексной и упп (скорее всего).

    Reply
  10. rodoz32

    А себестоимость как можно посмореть?

    Reply
  11. Nado2010

    проверял на упралвнеии строительной организацией… и на бухгалтерии предприятием 2,0. очень хороший отчет… большое спасибо автору

    Reply
  12. McLer

    (11) Nado2010, нравится, не забываем ставь плюсы 😉

    Reply
  13. Artemuch2

    Оличный отчет для использования в 1С предприятие Управление Торговлей 8, как раз такого отчета нехватало в типовом функционале 1С Предприятие Управление Торговлей 8, присоединяюсь ко всему вышесказанному, также хотелось бы более широкую описательную часть в настройке по отчету и возможность использования в 1С предприятие Бухгалтерия 8.

    Reply
  14. нинас

    Будет ли работать в комплексной автоматизации?

    Reply
  15. mistermp3

    Интересно, данный отчет работает в режиме расширенной аналитики учета затрат (РАУЗ) в управлении производственным предприятием (УПП)? Известно, что стандартный отчет «Валовая прибыль» не работает, т.к. нет себестоимости с точностью до документа реализации. Есть конечно описание, КАК сделать так, что бы увидеть в нем себестоимость, но там столько танцев с бубном, что проще или самому сделать отчет, или с этого же сайта инфостарт скачать. Конечно, себестоимость будет корректна только для прошлого месяца, где она полностью сформирована, но и ладно.

    А как этот отчет себя ведет при РАУЗ?

    Reply
  16. McLer

    (15) mistermp3, нет не работает в РАУЗ, данные отчет предназначен только для партионного учета.

    Reply
  17. mistermp3

    понятно. так и предполагал

    Reply
  18. tiger8123

    Отчет не показывает партии произведенной продукции, только поступление товаров.

    Reply
  19. McLer

    (18) tiger8123, данные берутся из регистра партий. В которой в свою очередь есть документ «партии». Если в отчете отображается не так как этого Вам требуется, то это не в отчете проблема, а в программе, почему она для произведенной продукции подменяет документ партии. А должна ли? (риторический вопрос)

    Reply
  20. tiger8123

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

    Reply
  21. sphomin

    А как в отчет добавить поле СФ полученный по документу Поступление — покопался в настройках — ничего не получилось 🙁

    Reply
  22. McLer

    (21) sphomin, отчет такую информацию не выводит. Без доработки не обойтись.

    Reply
  23. Biochemist

    Обнаружил, что отчет не работает с импортируемым товаром, сумму он считает в разных валютах, а рентабельность, как их разность. Так, товар, поступивший по 100 у.е. с ценой в реализации 10000 руб. будет иметь рентабельность 9900. Это нужно сиправлять, иначе для импортеров, ведущих партионный учет в УПП в разрезе ГТД отчет не актуален.

    Reply
  24. McLer

    (23) Biochemist, спасибо за замечание. Пяовится свободное время поправлю отчет.

    Reply

Leave a Comment

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