Отчет по прибыли и рентабельности для БП 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='\

58 Comments

  1. kit

    Поправил в отчете рентабельность, теперь выражается в %. Спасибо за замечание!

    Reply
  2. Порт

    мне нравится!

    Reply
  3. kit

    Для тех, кто уже скачал, можно поправить формулу в конфигураторе, в СКД на закладке «Вычисляемые поля».

    Reply
  4. almas

    Спасибо.

    Reply
  5. natarezn

    отлично сказано — не для россии!

    Reply
  6. kit

    Отчет обновил, изменил группировку в запросе, т.к. иногда задваивались либо себестоимость, либо выручка (например при разных ГТД одной номенклатуры), ну и ещё какие-то мелочи.

    Reply
  7. host_kms

    http://saveimg.ru/show-image.php?id=4405e7136455e3dca4bc662c13b4b320

    {(18, 58)}: Не задано значение параметра «СубконтоКт1» И ХозрасчетныйДвиженияССубконто.СубконтоКт1 В ИЕРАРХИИ(<<?>>СубконтоКт1)

    Рарус.Общепит 3.0 на базе БП

    Reply
  8. kit

    (7) host_kms, Поле товар в шапке не заполнено. Укажите группу «Товары». Но можно и удалить этот отбор, просто для моих клиентов так удобнее, если что пишите удалим.

    Reply
  9. woot

    А как сделать отбор по всем товарам?

    Reply
  10. kit

    (9) woot, см. комментарий №8.

    Reply
  11. woot

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

    Reply
  12. woot

    Скрины могу выложить

    Reply
  13. kit

    (12) woot, Давай скрины.

    Reply
  14. alternativa

    аналогичная ситуация. Бухгалтерия предприятия 3.0 (релиз 3.0.36.18). При попытке сформировать выдает {(18, 58)}: Не задано значение параметра «СубконтоКт1» И ХозрасчетныйДвиженияССубконто.СубконтоКт1 В ИЕРАРХИИ(<<?>>СубконтоКт1) . не совсем понимаю как удалить этот отбор (комменатрий 8), «галка» на номенклатуре не стоит. Я не программист, но если пошагово разъяснить — то попробую подправить. Отчет судя по всему хороший. Хотелось бы добавить НДС с группировкой по ставкам.

    Reply
  15. kit

    (14) alternativa, Если удалить не получается, тогда заполните этот отбор значением группы справочника «Номенклатура» самого верхнего уровня.

    Reply
  16. alternativa

    (15) Очень жаль, но отчет не работает и в случае, если выбираю группу «Товары» в номенклатуре. В этом случае ошибка не выдается, но в таблице выведена только шапка. Работаю с интерфейсом «Такси» , м.б. тут есть проблемы? Я не программист , а бухгалтер. Видимо данный отчет в первую очередь ориентирован на уровень программиста.

    Reply
  17. kit

    (16) alternativa, Видимо, из группы ТОВАРЫ у вас не было реализаций. Укажите любую другую, в которой находятся ваши товары. Если товары не сгруппированы, тогда можно это сделать групповой обработкой. А чем, вообще, фирма занимается?

    Reply
  18. kit

    (16) alternativa, В ТАКСИ проблем нет, проверено.

    Reply
  19. alternativa

    (17)В номенклатуре есть группа Товары, эта группа включает в себя номенклатурные позиции, по которым была реализация. Еще раз повторяю — я не программист. Для меня термин «групповая обработка» не увязывается в те поля, которые предусмотрены Вашим отчетом. Такая же проблема была и с другим участником. Но ведь он как-то ее решил!!!

    Залезла в модуль — понимаю, что вся загвоздка сидит в «И ХозрасчетныйДвиженияССубконто.СубконтоКт1 В ИЕРАРХИИ(&СубконтоКт1)»

    Если язык 7.7 для меня не представляет проблем, то по 8.3 любое решение через конфигуратор подвергает в ступор. Ковыряться приходится долго — вот и решила воспользоваться уже готовым решением. Но видимо неудачно. Еще раз повторю — я не программист, а бухгалтер. Поэтому не всегда с первого раза могу понять ту или иную терминологию.

    Организация занимается как производством, так и торговлей покупных товаров (не розница). Интерес также в вашем отчете вызывает возможное дополнение по сумме исчисленного НДС с указанием ставки (это м.б. 0%,10%,18% так и «Без НДС»).

    на 7.7 есть такой отчетик, если есть необходимость могу скинуть. Очень удобный

    Reply
  20. kit

    (19) alternativa, Ответил в личку.

    Reply
  21. kit

    Добавил второй вариант обработки без отбора по номенклатуре. У некоторых пользователей возникали проблемы с его использованием.

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

    Reply
  22. lesja_bryansk@mail.ru

    Отчет не работает.

    Нет колонки выручка и тянет НДС. хотя мы на упрощенке.

    Reply
  23. kit

    (22)Да, судя по вашей картинке, выручки на 90-ом счете нет. А можете скинуть ещё и картинку проводок БУ этого документа ( Реализация ТУ № 165 от 11.03.2014)?

    Reply
  24. lesja_bryansk@mail.ru

    (23)

    Reply
  25. kit

    (24) lesja_bryansk@mail.ru, Специально для вас изменил под УСН, кину на почту. Просто у вас выручка по БУ определяется, а под ОСН по НУ, которого у вас нет.

    Reply
  26. lesja_bryansk@mail.ru

    (25) СПАСИБО большое! Теперь все работает:))

    Reply
  27. Душечка

    Огромное спасибо за отчет. Подскажите, пожалуйста, а можно как нибудь настроить количество проданного товара ?

    Reply
  28. Душечка

    Пояснение к 27. Отчет, который скачала,ОтчетПоПрибылиНоменклатурыНовый. Я так поняла на Скрине показан другой отчет ? Или можно этот отчет настроить ?

    Reply
  29. kit

    (28) Душечка, На снимке с колонкой количество вариант «без отбора».

    Reply
  30. Душечка

    Очень Вам благодарна. У меня клиенты ведут в БП 3.0 реализацию по сетевым магазинам, т.е в базе несколько контрагентов с одинаковыми названиями , но разными КПП. Им нужен был отчет по реализации по каждому магазину и в целом по сети. Я себя называю более или менее продвинутым пользователем, но ни как не программистом. Инфостарт всегда спасал. В вашей обработке поменяла приоритеты и всё получилось, т.е для первого отчета ( для каждого магазина )вначале идет Покупатель, потом Номенклатура и за тем Документ . Для второго отчета ( в целом по сети ) Номенклатура-Покупатель-Документ.

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

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

    Reply
  31. kit

    (30) Душечка, Я читал «РАЗРАБОТКА СЛОЖНЫХ ОТЧЕТОВ В 1С:ПРЕДПРИЯТИИ» Е.Ю. Хрусталевой, ну и можно ещё посоветовать видео-уроки от Чистова Д.В. Рад, что отчет вам пригодился. Ну и, кстати, сделайте копию себе этого отчета и поиздевайтесь над ним, думаю, тоже в плане понимания разработки подобных отчетов пойдет на пользу.

    Reply
  32. Душечка

    (31) Спасиб-а-а-а-а-а-а. Окунусь в мир программирования. Надеюсь , что моё плавание на воде наконец-то закончится, и я погружусь , ну, хотя бы на метр в мир программирования 1С.

    Reply
  33. ant_lom

    Возможно ли сделать, чтобы данный отчет показывал данные и по услугам?

    Reply
  34. kit

    (33) ant_lom, В описании я указал, что отчет строится по запросу 41 и 90 счетов. Услуги на 41 счете вряд ли отражаются )).

    Недавно я выложил ещё один отчет по доходам и расходам номенклатурных групп, там запрос по 20 и 90 счету строится, может он Вам лучше подойдет.

    Вот ссылка: http://infostart.ru/public/344253/

    Reply
  35. array38

    Здравствуйте. Отчет вообще ничего не формуирует если делаю отбор по датам. Если период убираю, то формирует по всем продажам. 🙁 почему?

    Reply
  36. kit

    (35) array38, Какой файл скачали?

    Reply
  37. array38

    Я скачал первый и третий. Для ОСНО я так понимаю… Выяснил, что отчет не формируется, если стоит конец периода. Если его нет, то отчет строится.

    Также, вопрос: а можно ли добавить документ движения в структуру? В скд не вижу такого пункта.

    Благодарю!

    Reply
  38. kit

    Даты сейчас перепроверил, но вроде как работает корректно. ((

    А по документам движения вопроса не понял, отчет их тоже выводит, даже на скрине это видно. (без отбора)

    Reply
  39. array38

    (38) Почему у меня все не так? Помогите пожалуйста! Сможете подключиться и глянуть? Небесплатно конечно!

    Документа движения у меня нет.

    Reply
  40. a_kuznetsov

    Добрый! Релиз БП 3.0.40.31

    Движений в отчете нет — без отбора, все убрал и отборы периода, организацию и покупателей.

    Структуру отчета смотрел, менял — результат ни документов ни номенклатуры. Странно

    Reply
  41. kit

    (40) a_kuznetsov, Чем занимается фирма? Какие проводки в документах реализации?

    Reply
  42. a_kuznetsov

    Производство

    Движения по 43 счету

    Reply
  43. kit

    (42) a_kuznetsov, В описании указал, что отчет строится на проводках 41-го 90-го счетов. Думаю, если немного запрос изменить (41 на 43 счет), отчет будет работать и для производственных организаций.

    Reply
  44. a_kuznetsov

    (43) В запросе поправил, а воз и нынче там

    Reply
  45. kit

    (44) a_kuznetsov, В СКД на закладке параметры не указали значение параметра (&Счет кт43). см. приложение

    Reply
  46. a_kuznetsov

    Действительно, сам бы не додумался. Прикладываю обработку с изменениями

    Reply
  47. kit

    (46) a_kuznetsov, Я не понял, работает или нет? В демо базе у меня отработала на ура.

    Reply
  48. a_kuznetsov

    Да, спасибо

    Reply
  49. zak555

    Отчёт у автора не работает.

    Переделал с нуля.

    И за что 2 смартнами с меня списали ?

    Reply
  50. kit

    (49) zak555, Не понял, а какое отношение этот отчет имеет ко мне. Это не мой отчет.

    Reply
  51. zak555

    (50) я скачал кажись два — из публикации и поста (44)

    в отчётах когда даты ставил ничего не выводилось — полез разбираться — как я понял там параметры пересекались — в итоге новую схему сделал, модуль объекта чуть отредактировал ну и отдал автору

    Reply
  52. kit

    (51) zak555, Запрос в отчете, Вами присланном совсем не мой. А в посте (44) человек желал запрос по 43 счету, который я ему исправил и отправил в (46) посте. Далее из переписки понятно, что отчет и по 43 счету заработал, но это другая версия отчета. Возможно Вам нужен был отчет с вариантом без отбора, если Вы скачивали у меня.

    Reply
  53. matcord

    (20) и мне ответьте в личку, потому что та же проблема, а отчет не работает, но очень нужен

    Reply
  54. Гость

    Отчет не работает если является организация установлена как ИП, значения суммы выручки пустое, а ндс равно стоимости продажи. В итоге бред.

    Reply
  55. kit

    (54) Гость, Уважаемый Гость, для ИП имеется свой отчет «Отчет по прибыли номенклатуры УСН». Посмотрите внимательнее, Вы скачали для ОСН.

    Reply
  56. Гость

    (55) Так ИП на общей, я так понял что отчет считает НДС на 90.01, сумма НУ, а если организация установлена как ИП, то поле НУ,ВР и ПР. нет. И в отчете в поле НДС тянется просто выручка. По идее для ИП на общей НДС должен тянуться с 90.03

    Reply
  57. buy_sale

    В параметрах началопериода исправьте НачалоПериода(&НачалоПериода, «День»).

    В условиях желательно использовать в иерархии (&Счет)

    Reply
  58. kit

    (57) buy_sale, Спасибо за комментарий, хотя по счету там указан конкретный счёт, а не группа, иерархия неуместна, но если только кто-нибудь подчиненные счета не заведет, но это уже другая история.

    Reply

Leave a Comment

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