Внешний отчет "Анализ продаж" (валовая прибыль) для конфигурации "Бухгалтерия предприятия, ред. 2.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='\

34 Comments

  1. Maddy18

    А мне понравился 😀 , Только вот параметр УчитыватьКорректировки я бы вынес пользователю.

    Reply
  2. simargle

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

    Reply
  3. Tota

    Можно было бы вынести параметр: учитывать или не учитывать закрытие месяца.

    Reply
  4. segen

    Пожалуй лучшее решение из бесплатных аналогов. Автору плюс.

    Reply
  5. LN

    Что-то у меня странное скачалось. Файл «анализ» без расширения. Я попробовала ему присвоить расширение epf, он не открывется. zip та же история. Подскажите, пожалуйста, что делать?

    Reply
  6. simargle

    (5) LN,

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

    Т.к. это внешний отчет, то расширение файла должно быть erf. Попробуйте установить такое расширение.

    Reply
  7. LN

    Спасибо. Теперь открылся. Век живи, век учись.

    Reply
  8. segen

    По поводу работы отчета. Никто не сталкивался с ситуацией, когда в БУ прибыль считается правильно, а в НУ отчёт показывает какие-то дикие цифры?

    Reply
  9. simargle

    (8) segen, У меня подобной ситуации не было. А какие именно колонки отображают такие цифры по БУ? Пробовали смотреть ОСВ данные НУ, там все нормально отображается?

    Reply
  10. segen

    (9)

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

    Reply
  11. simargle

    (10) segen,

    Если можно — прикрепите скриншот здесь, в комментариях. Т.е. неправильные данные отображаются в колонке «Валовая прибыль НУ»?

    Reply
  12. segen

    (11)

    simargle пишет:

    Т.е. неправильные данные отображаются в колонке «Валовая прибыль НУ»?

    Поняли правильно.

    Reply
  13. segen

    Еще пожелание автору: добавить возможность детализации по номенклатуре, тогда отчет вообще стал бы волшебным.

    Reply
  14. dakinder

    только у меня себестоимость нереально считает?

    Reply
  15. simargle

    (12) segen,

    Попробуйте использовать редакцию отчета, прикрепленную к данному комментарию.

    Reply
  16. simargle

    (13) segen,

    Я согласен, что вывод анализа продаж был бы удобнее в разрезе конкретной номенклатуры. Но это невозможно по причине следующих ограничений типовой конфигурации:

    1. В стандартном плане счетов не предусмотрено субконто «Номенклатура» на счете «Себестоимость продаж» (90.02). В результате получить корректную себестоимость(с учетом корректировок, которые делает закрытие месяца) не представляется возможным.

    2. Также отсутствует аналогичное субконто на счете «Налог на добавленную стоимость» (90.03).

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

    Reply
  17. simargle

    (14) dakinder,

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

    Reply
  18. segen
    simargle пишет:

    (12) segen,

    Попробуйте использовать редакцию отчета, прикрепленную к данному комментарию.

    Эта версия отчета прибыль по налоговому учету считает правильно, спасибо.

    Reply
  19. simargle

    (18) segen,

    Пожалуйста.

    Reply
  20. wolfalan

    Лучший отчет!!! Просмотрел несколько аналогов только время потратил(((

    Reply
  21. RPV

    А чтоб еще обработка учитывала продажи на счете 91 можно сделать?

    Reply
  22. simargle

    (24) RPV,

    Нет, в данном отчете нельзя учитывать данные по продажам по 91 счету, т.к. аналитика данного счета не содержит номенклатурную группу. Также в стандартном плане счетов отсутствуют отдельные субсчета на 91 счете для учета НДС и себестоимости продаж.

    Учет продаж по 91 счету нужен Вам для продаж материалов с 10 счета или для анализа оказания услуг?

    Reply
  23. RPV

    (25)

    для анализа продаж материалов с 91 счета

    Reply
  24. simargle

    (26) RPV,

    К сожалению в данном отчете вывести информацию по продажам материалов не представляется возможным ввиду причин, описанных выше. Код данного отчета открыт для внесения изменений, поэтому можно создать отдельный отчет на базе текущего, который будет анализировать продажи материалов в разрезе номенклатуры (для этого можно использовать субконто «Реализуемые активы» на счетах прочих доходов/расходов). При этом потеряется возможность вычленить НДС, т.к. в стандартном плане счетов не предусмотрен отдельный субсчет для такого учета.

    Reply
  25. tango

    файл в публикации заменен на тот, что в (15) ?

    Reply
  26. simargle

    (28) Уже не помню, лучше использовать вариант из комментария (15).

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

    Reply
  27. Максим2

    корректировка не учитывается. См. на скриншоте: документом Реализация списано 6 руб., данные по корректировке стоимости списания в отчет не попадают

    Reply
  28. simargle

    (30) Максим2, такая ситуация по всем номенклатурным группам или по некоторым сумма корректировки отражается корректно? Я правильно понял из скриншота, что в настройках параметров учета установлено ведение складского учета только в количественном выражении?

    Reply
  29. Максим2

    (31)

    Такая ситуация по всем ном. группам, включая товары, не только по продукции. Учет по складам ведется только по количеству. Получается в этой настройке причина отсутствия корректировок в отчете?

    Reply
  30. simargle

    (32) Максим2, да думаю причина такого поведения отчета в этом. При расчете суммы корректировки учитывается аналитика с которой выполняется корректировка (номенклатура, склад, партия). Т.е. при реализации субконто «Склад» заполнено, а при корректировке нет.

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

    Reply
  31. geffest

    simargle,добрый день! попытался сформировать отчет, но вот то, что выручка от оказания услуг(товаров нет) не попадает в отчет, это факт!! Хотя автор и указал, что отчет формируется на основании документов РТиУ. Отсюда вытекает вопрос автору разработки,а можно сделать так ,чтобы в отчет попадали и документы РТиУ,где только услуги??

    Reply
  32. simargle

    (34) geffest, добрый день.

    попытался сформировать отчет, но вот то, что выручка от оказания услуг(товаров нет) не попадает в отчет

    Да, все верно — отчет строится только по продажам товаров/продукции (в одном из комментариев выше обсуждался этот момент).

    Хотя автор и указал, что отчет формируется на основании документов РТиУ

    Отчет строится не по документам, а по регистру бухгалтерии (в частности по счету «Себестоимость продаж»). Возможно в текст описания закралась ошибка — напишите где написано про реализации — я поправлю.

    а можно сделать так ,чтобы в отчет попадали и документы РТиУ,где только услуги?

    Доработка данного отчета в части услуг не планируется. Кроме того, отчет строится по номенклатурным группам, а вам скорее всего нужна аналитика номенклатуры.

    Если цель — просто вывести услуги основываясь на данных документа «Реализация товаров и услуг», то можно воспользоваться типовым универсальным отчетом (по регистрам, справочникам, документам). В данном отчете можно выбрать все услуги из реализаций с произвольными отборами. Примеры настройки универсального отчета можно посмотреть например в этой публикации — http://infostart.ru/public/177927/

    Reply
  33. yanker

    ОШИБКА В СХЕМЕ КОМПОНОВКИ ДАННЫХ!!!

    ЧТО ДЕЛАТЬ???

    Reply
  34. simargle

    (36) yanker,

    напишите полную версию конфигурации в которой вы пытаетесь открыть отчет.

    Reply

Leave a Comment

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