Себестоимость реализованной продукции по периодам выпуска в УПП (для РАУЗ, бухгалтерский учёт)




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

11 Comments

  1. Uejova

    Добрый день! Подскажите, пожалуйста, по какой причине может не формироваться отчет?

    Выдает пустую таблицу.

    Reply
  2. Designer1C

    Причин может быть масса. Чтобы решить Ваш вопрос, мне от Вас нужен

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

    2.ОСВ за этот же период : реализация продукции выполнялась ? себестоимость рассчитана ?

    Reply
  3. Uejova

    Павел, добрый день! Написала вам личное сообщение

    Reply
  4. AgroPZU

    Добрый день. Есть ли возможность приобрести тех поддержку?

    Reply
  5. Designer1C

    (4)Конечно возможность приобрести тех.поддержку есть.

    Варианты приобретения :

    Нужны подтверждающие документы — мне нужно внести на страницу разработки соответствующий раздел

    Без подтверждающих документов (оплата «с карты на карту») — то можно сразу перейти к вопросу :

    Есть ли техническое задание, на основании которого должна оказываться тех.поддержка ?

    Тех.задание должно в себя включать :

    1.Исходная ситуация у Заказчика.

    Какая программа, какой релиз, отличия от типовой конфигурации, какая учётная политика, какие настройки в программе,

    Как устроен справочник «Номенклатура» и прилегающие к нему (Характеристики и т.п., если они тоже будут задействованы в доработках).

    2.Макет печатной формы (названия колонок и их описание).

    Желателен образец отчёта (действующий или «как Заказчик видит»;)

    Это длоя того, чтобы по образцу отчёта можно было понять : как заполнять поля, какие группировки в отчёте, какие итоги в отчёте и т.п.

    3.На какой вопрос Заказчика должен отвечать требуемый отчёт ?

    То есть : каким образом отчёт может помочь решить стоящую перед Заказчиком задачу.

    Это важно для максимального понимания назначения доработок. Это поможет прояснить тонкости.

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

    На основании тех.задания можно определить сроки и затраты.

    То есть ТЗ от Заказчика — подробное описание его «хотелки»

    Reply
  6. AgroPZU

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

    Можете писать в личку?

    Reply
  7. mike-gv

    Добрый день!

    Мне не понятно отчет сможет разложить продукцию до материалов если было несколько переделов. Или когда продукция состоит из полуфабрикатов, которые могли быть выпущены два, три месяца назад. Код отчета открыт?

    Reply
  8. Designer1C

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

    Себестоимость в каждом периоде разузловывается до материала

    Количество уровне вложенности : у меня было до 6.

    Максимум, который я первоначально закладывал : наверное 7 уровней.

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

    Код отчёта открыт : в характеристиках указана открытость исходного кода.

    При формировании отчёта заполняется таблица значений, на основании которой можно формировать отчёты на СКД (закладка «Отчёт «Затраты СКД»)

    Reply
  9. Designer1C

    (7) Сплошное «ДА» :

    Код открыт.

    Продукция раскладывается до материалов. Количество переделов : у меня до 6 доходило.

    Разузлование возможно даже в случаях, когда реализация была в 2018 году, а выпуск был в предыдущих годах.

    Reply
  10. Edgar1983

    Добрый день!

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

    Reply
  11. Designer1C

    В пространстве вариантов возможно всё ! Было бы время и деньги.

    Отчёт делался под одни потребности. Затраты времени на разработку я написал.

    Если другой организации нужен отчёт с другими особенностями, то вопрос в сроках и стоимости.

    Денег нет на оплату силами стороннего специалиста — можете делать своими силами. Код отчёта открыт.

    Бюджет имеется — разработка будет вестись с моим участием.

    Reply

Leave a Comment

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