Расчет стоимости изделия по спецификации (для УПП 8.2)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

26 Comments

  1. NoWhite

    А чем обработка «Расчет плановой себестоимости» плоха?

    Reply
  2. vkt

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

    Reply
  3. Kostalmed

    Обработка то что надо!!! Спасибо большое!!! В отличие от «Расчета плановой себестоимости» разузловывает все до материалов!!! спс!!!

    Reply
  4. Aleksey-29

    Скачаю попозже. Думаю в эконом. отделе пригодится! Скажут спасибо, передам автору!

    Reply
  5. vkt

    Если будут обнаружены глюки — сообщайте.

    Проверьте правильно ли разузловываются сборки.

    Reply
  6. proger1c81

    полезная штука однозначно! моим пользователям очень пригодится

    Reply
  7. a31
    Kostalmed пишет:

    Обработка то что надо!!! Спасибо большое!!! В отличие от «Расчета плановой себестоимости» разузловывает все до материалов!!! спс!!!

    Скачал, подключил в дополнительные печатные формы, обработки, — запускаю, а там пусто, что не так?

    Куда ее класть то?

    Спасибо.

    Reply
  8. vkt

    Прописываешь в Дополнительные внешние обработки.

    Запускаешь. В форме выбираешь номенклатуру, тип цены номенклатуры.

    Производится разузлование по основным спецификациям.

    Можно запустить через — Файл, Открыть.

    Это просто внешняя обработка.

    Reply
  9. MeTANid

    все просто супер… было бы, если бы цены не менялись

    Reply
  10. alekseineputin

    С удовольствием скачал бы отчет, но не хватает смарт-денежек.

    Ставлю плюс заранее, потому как считаю, что человек, публикующий свои наработки так или иначе помогает остальным коллегам.

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

    Reply
  11. InJey

    Я так понимаю будет работать только на УПП? На Управление торговлей не получится посчитать стоимость изделия из комплектующих?

    Reply
  12. vkt

    (11) jeyriko, Используется в УПП. Производится полное разузлование продукции — определяется состав изделия. В УТ нет вложенных спецификаций. Или есть?

    Reply
  13. vkt

    (9) MeTANid, А какие цены нужно использовать для расчета? Сначала устанавливаются плановые цены номенклатуры, а потом рассчитывается плановая стоимость изделия по комплектующим..

    Reply
  14. to_swim

    Добрй день.

    пасибо заа обработку, очень хорошая.

    Но есть одно но, когда идет расчет количества у спецификаций ссылочного типа: спец1-спец2-спец3

    То количество у первой спец1 считает корректно, а у спец2 и спец3 начинает перемножать число в общих количествах спец, на количество в исх. компликт.

    Можно это как то исправить?

    спасибо большое заранее

    Reply
  15. to_swim

    (15)

    «Вам нужно для информации также выводить и количество комплектующих на 1 шт. выходного изделия? »

    Да это было бы иделаьно, что бы он выводил остальные спец2 и спец3, как спец1

    У нас в базе не корректные количества стоят… различаются.

    Не подскажете где надо изменить?

    Или если есть возможность выслать

    зранее спасибо

    Reply
  16. vkt

    (14) to_swim, Можно по-конкретнее, что, по-вашему, неправильно?

    Если нужно определить стоимость по спецификации 2-х штук изделия, то и количество составляющих это изделие комплектующих также удваивается и стоимость также рассчитывается для этого количества. А цена показывается на 1 шт.

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

    Reply
  17. vkt

    (16) to_swim, Интересует только количество?

    Или стоимость тоже?

    Стоимость чего? — Всего изделия? Всего количества изделия? Или стоимость входящих в изделие комплектующих-сборок по количеству, указанному в спецификации? или на 1 изделие?

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

    Или нужен только состав изделия по спецификациям комплектующих-сборок?

    Reply
  18. to_swim

    (17)

    всего количества (которое указано в Исходных компликтующих, всех спецификациях которе связаны)…

    На одно изделие.

    Желательно со стоимостью, например по поступлениям… или кк средняя стоимость… Только нужна максимальная стоимость

    Reply
  19. vkt

    (18) to_swim, Итак, уточним.

    Имеем задачу: определить состав и рассчитать стоимость изделия по спец1. Изделие состоит из комплектующих, которые также могут быть сборками со спецификациями спец2, спец3, и т.д.

    При этом хочется еще видеть состав комплектующих-сборок по спецификациям, без учета количества вхождения сборки в выходное изделие. Т.е. если в изделие сборка1 входит в количестве 3 шт., то для расчета стоимости изделия учитывается, что сборок1 — 3 шт., но еще надо видеть и состав сборки1 на 1 шт.

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

    Reply
  20. tSirkul

    Неправильно обрабатывает спецификации на продукцию и полуфабрикаты где выходное количество <> 1.

    А у нас такие почти все — из за малого расхода некоторого сырья спецификации смасштабированы под выпуск 5000 кг продукции например.

    Иначе теряем информацию за счет нехватки разрядов в количестве материалов и полуфабрикатов.

    Reply
  21. vkt

    (20) tSirkul, У нас используется только 1 шт. выходного изделия. Поэтому вариант с <> 1 не тестировался.

    А как вручную у вас обсчитывается эта ситуация? И что именно имеется в виду?

    Количество продукции по головной спецификации <> 1?

    Или какой-то полуфабрикат изготавливается по спецификации не в единичном количестве?

    У нас была (и есть) какая-то аналогичная проблема с мелкими нормами. Решили, что если округлим до 3-го знака, то упростим себе жизнь. Так пока и считаем.

    Можно выбрать другую единицу измерения.

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

    Reply
  22. ketr

    102 строка модуля объекта улыбнуло))))

    Reply
  23. vkt

    (22)

    Reply
  24. vkt

    (22) Сорри, так было в оригинале. Меня тоже улыбнуло )))

    Reply
  25. spectre1978

    Сразу в УПП не пошла, упала на попытке получить ВидВоспроизводства из узла в надежде что там СправочникСсылка.Номенклатура. Подправил. Затем — количество полуфабриката считает неверно, просто перемножая количество в полуфабрикате на количество в родительской спецификации. Это будет работать только в том случае, если полуфабрикат выпускается на 1 единицу измерения полуфабриката с коэффициентом 1. Может, в штучном производстве и так, но у нас пищевка, там все спецификации на замес сколько-то килограммов каждый раз по-разному. Если же в спецификации количество выпускаемого полуфабриката не единица — вы получите кривую распечатку с неправильными количествами. Собственно, об этом написано несколькими репликами ранее. На скорую руку дописал, но не думаю что это универсально. Еще момент — может работать неправильно, если используются параметры выпуска продукции и формулы, ничего этого в обработке не учитывается, просто берутся количества и все. Пока не знаю, буду ли с этим что-то делать или нет. Но все равно лайк, ибо сэкономлено много времени!

    Reply
  26. vkt

    (25) Спасибо! Все правильно. Указанные недостатки имеют место. Не были устранены, так как отсутствуют контрольные примеры (у нас эти режимы не используются), а «придумывать» что-то абстрактное для проверки алгоритма нет времени.

    Reply

Leave a Comment

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