Валовая прибыль (1С: Розница 2.2) Управляемые формы




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

36 Comments

  1. ermakk

    Будет ли работать в Розница 2.2.6.28?

    Reply
  2. cezarj

    Должно, протестирую сегодня, отпишусь.

    Reply
  3. leks88

    Платно? Вы что серьёзно?))

    Reply
  4. cezarj

    (3) Серьёзно. Хочешь бесплатно ищи или делай сам.

    Reply
  5. leks88

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

    Reply
  6. cezarj

    (5) слушай что ты меня учишь, я как хочу так и напрягусь, у меня своя стратегия, если мне нужен будет совет я к гадалке схожу

    Reply
  7. cezarj

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

    Reply
  8. leks88

    Целая конфигурация https://infostart.ru/public/668887/ стоит 1000 р. Вы очень жадный и грубый, впрочем решать и правда Вам.

    Reply
  9. cezarj

    (8) Спасибо

    Reply
  10. cezarj

    (1) Немного изменил отчет, работать на 2.2.6.28 и более свежих будет.

    Reply
  11. cezarj

    (8) Поправил отчет. У них другая стратегия, конфигурация стоит 1000 рублей, а поддержка 2500.

    Reply
  12. ermakk

    Спасибо, работает, удобный отчет!

    Reply
  13. user594029_angelina-vl

    Добрый день!

    Будет ли работать на релизе 2.2.4?

    Reply
  14. cezarj

    (13) Добрый! Должно, но лучше пришлите базу я проверю. cezar.j@gmail.com

    Reply
  15. user886140

    Добрый день! Обработка работает, но не правильно показывает наценку в % и в некоторых местах неверно указана закупочная цена. Прикрепляю фото

    Reply
  16. cezarj

    (15) Наценку в % считает по отношению к розничной цене. (Розничная-Закупочная / Розничная)*100, поправлю этот момент. А где закупочная неверно указана нужно смотреть, отчет берет последнюю цену закупки и умножает на количество, поэтому если сильно во времени цены закупки отличаются будет не очень точно. Позже переделаю отчет, чтобы цену брал закупки из приходов на каждую дату.

    Reply
  17. TitbiT

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

    Reply
  18. cezarj

    (17) Можно фильтр, можно и группировку. При отборе по магазину группировка по складам. Сделаю на этих выходных.

    Reply
  19. TitbiT

    (18) Но цена получается только по последнему приходу попадает в отчет, а если было несколько приходов с разными ценами, возможно ли сделать в отчете в таком случае разбивку на несколько строк по разным ценам?

    Reply
  20. cezarj

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

    Reply
  21. TitbiT

    (20) Спасибо, тогда видимо нам он, к сожалению, не подходит.

    Reply
  22. AlxNel

    Большое Вам спасибо, именно то чего не хватает в 1С! Куча клиентов заносят остатки через оприходование а потом требуют чтоб валовая прибыль считалась сама…

    Reply
  23. user970630

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

    Ваш отчет сможет решить такую задачу?

    Reply
  24. cezarj

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

    Reply
  25. user970630

    Спасибо. Буду учить

    Reply
  26. user970630

    Доброго времени суток.

    Подскажите пожалуйста, у вас написано «открытый код», разрешается изменять обработку? Вы не против?

    И может быть это не корректно, но обработка вроде была по 2 стартмани? Это была скидка или просто цена поднялась? Ее можно будет в дальнейшем приобрести за 2 стартмани?

    Извини есть вопрос показался мелочным.

    Reply
  27. cezarj

    (26) Цена поднялась, да можете изменять. Я думаю останется за 4.

    Reply
  28. user970630

    (27)

    Спасибо

    Reply
  29. user656388

    Скажите, пожалуйста, а группировка по контрагентам есть?? (кому какой товар продан чтобы отследить)

    Reply
  30. sancho86

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

    Reply
  31. cezarj

    (30) Вы видимо не внимательно читали, этот отчет берёт цены закупки из установок цен а не из стандартного расчета себестоимости. Вы пробовали рассчитать себестоимость в Рознице? Обычно она очень криво считается и для расчета нужно перепроводить документы. В этом основной интерес отчета, а не в том какие показатели он выводит.

    Reply
  32. sancho86

    (31) нет, я все внимательно прочитал: «отчет умножает последнюю цену закупки на количество фактически проданного товара». Просто всем своим клиентам сразу ставлю автономный упрощенный учет себестоимости, перепроводить приходится минимум документов.

    То есть в моем случае, используя ваш отчет, получится та же валовая прибыль?

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

    Reply
  33. cezarj

    (32) Не совсем правильно поняли. Вот у вас к примеру клиент, который год работает и до этого не возникало у него вопросов по расчету себестоимости или неважно какой срок месяц, два, приходит к вам и говорит мне нужно посчитать себестоимость. Вы включаете ему расчет в Рознице, далее вам нужно перепровести все документы, если до этого расчет не был включен. Многие не включают его сразу, потому что не шарят в этом. Потом вы заходите в отчет Оценка прибыли и видите что у части товаров себестоимости нет, так как в рознице при сборке-расборке и еще в некоторых случаях она вообще не рассчитывается, так у меня было.

    Т.е. получается что:

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

    2. Часть документов не рассчитывает себестоимость в вашем случае.

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

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

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

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

    Reply
  34. user1232377

    Здравствуйте, ваше решение будет работать на маке 1с розница? версия 8.3.14.1694?

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

    Reply
  35. user1208421

    Извините за глупый вопрос : У нас стоит 1С:Предприятие 8.3 (8.3.14.1694) конфигурация — 1С:Комплексная автоматизация 2 (2.4.6.231), будет ли корректно работать данная обработка на ней?

    Reply
  36. cezarj

    Нет, не будет

    Reply

Leave a Comment

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