Практический пример автоматизации производства в 1С: УНФ




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

12 Comments

  1. _KaA

    Спасибо за статью. Подскажите, а формула с условием в типовой конфигурации работает? Можно рассчитать, например, цены тоже через «Выбор когда…»?

    Reply
  2. Gavrik

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

    Reply
  3. _KaA

    (2) Спасибо за ответ.

    Reply
  4. user633533_encantado

    А доп. затраты такие как аренда помещения, зарплата и т.п. она может распределить на себестоимость продукции согласно определенным правилам ?

    Reply
  5. Gavrik

    (4) Нет, правил нет возможности задавать. Всё скромно — по количеству. С другой стороны обработку по заполнению ТЧ несложно реализовать для документа «Распределения затрат».

    Reply
  6. Designer1C

    Производственный учёт на УНФ — Отличная идея !

    На КА-2 сложновато внедрять производственный учёт, ввиду перегруженности конфигурации для небольшой организации.

    Reply
  7. yazuzenko
    Для учёта сдельных нарядов создан остаточный регистр накопления «План-фактный анализ сдельных нарядов». Это позволяет загружать оборудование по остаткам операций.

    Каким образом происходит расчет количества возможных операций на определенном ресурсе в день?

    1. Используется график ресурса, количество плановых рабочих часов ресурса в день и делится на время операции…

    Но как быть если время операции для разных спецификаций может различаться? Использовать минимальное время?

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

    Reply
  8. Gavrik

    (7) Количество требуемых операций мастер смены подбирает глядя на время выполнения, отображаемое в АРМ. Учёт ремонтов, производительности рабочего мастер оценивает лично без помощи и возможности УНФ типа рабочего графика ресурсов.

    Но как быть если время операции для разных спецификаций может различаться? Использовать минимальное время?

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

    Reply
  9. pm74

    (0)интересно было почитать

    тоже используем УНФ 1.2 в производстве редукторов , используем связку Заказ покупателя — Заказ на производство — Производство (сборка/разборка)

    Reply
  10. Gavrik

    (9) интересная доработка карты производства

    Reply
  11. dachnik

    Сергей, написал вам в личку.

    Хотелось бы поближе ознакомиться с вашей доработкой УНФ

    Reply
  12. user619273_alevtina

    Интересная доработка.

    Reply

Leave a Comment

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