Проектно — сметная документация (смета)




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

23 Comments

  1. baton_pk

    Вот глядя на это и этому подобное уж больно хочется видеть что-нибудь вроде гитхаба для общественной разработки на 1С.

    Reply
  2. Sintson

    (1) Вообще говоря, когда — то была такая мысль, не нашлось единомышленников.

    Reply
  3. OBEH

    Была тоже такая тема. Не хватило ни времени ни прочего ресурсов.

    Насколько интеграция с гранд сметой реализована? И «ядро», это УПП или как?

    Все-же, все привыкли там работать и «верстать» документы.

    Вот учет затем вполне на 1С реализуется.

    Reply
  4. Sintson

    (3) Никак с гранд сметой не связано.

    Весь обмен планировался по АРПС. «Ядро» может быть любым, на РЖД мы УПП в качестве учетной системы использовали, туда материалы и услуги из Ведомостей договорной цены сливались.

    Reply
  5. OBEH

    (4) «Весь обмен планировался по АРПС»

    Пока не смотрел конфигурацию. Хочется понять, все-же, ее назначение.

    Она, к примеру, полностью функционал гранд сметы перекрывает(хотя бы в перспективе)?

    Reply
  6. Sintson

    (5) В перспективе можно и гранд смету перекрыть ))) было бы желание (в любых сметных программах ценность в справочниках нормативов), пока это только «набросок», чтобы превратить в полноценную смету нужно завести справочники нормативов и расценок, коих огромное количество.

    Есть аналогичный продукт «Смета 2» называется, по моему от 1С, там все справочники зашифрованы.

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

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

    Reply
  7. help1Ckr

    Инфостарт глючит? Минут пять пытаюсь поставить плюс — никакой реакции

    Reply
  8. help1Ckr

    Раз нельзя плюс поставить хоть покритикую — Интерфейс у Вас излишне суров) Документы справочники обработки. Лучше сгруппировать по логическому смыслу. Это раз, во вторых панель функций очень поможет в продвижении продукта

    Reply
  9. Sintson

    (8) Критика принимается, интерфейса нет вообще — т.к. это не законченное решение — ЭТО НАБРОСОК, выжимка того что мне нравилось из готового решения.

    ЗЫ

    Хотя плюсик не помешал бы (смущенно)…

    Reply
  10. OBEH

    (6) идея, как раз, то, что надо.

    На базе БП 3.0 нормально взлетела бы.

    Reply
  11. German

    А как вам хранить состав расценки в спецификации?

    Упрощенно на УПП

    ЛС — Заказ поставщику (В текущих ценах!!)

    изм — Корректировка заказа поставщику

    КС-2 — ПТиУ с видом обекты строительства

    КС-3 — отчет по закупкам

    ССР — Отчет по заказам в аналитке проектов

    Reply
  12. Sintson

    (11) Думаю не взлетит, разумеется если строим что-нибудь крупнее песочницы.

    Тем более отчеты — это все же отчеты.

    Reply
  13. German

    (12) взлетело и даже совершило посадку

    Reply
  14. Sintson

    (13) Хм.. поздравляю! Интересно было бы взглянуть на реализацию.

    Reply
  15. German
  16. Sintson

    (15) Большой труд, только я так и не понял, зачем «курочить» типовой документ, не оставив там камня на камне, не проще создать новый (справедливости ради скажу, раньше тоже увлекался переделкой типового функционала, но если объект соответствует лишь отдаленно по смыслу…), — хотя это моё скромное мнение 😉

    ЗЫ

    Проекты (или объекты строительства) задействовали?

    Reply
  17. German

    (16)

    Дак виды операциий же как раз для этого придуманы, взаиморасчеты ведутся по заказам/сметам для возможности формирования справки стоимости выполненных работ. Смета на 100% по смыслу соответствует заказу поставщику

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

    На проекты очень сильно завязано бюджетирование

    Reply
  18. OBEH

    (17)»На проекты очень сильно завязано бюджетирование…»

    Естественно, для бюджетирования все в проектах лежит. А если не лежит, то этот объект можно использовать все равно.

    Только вот не совсем понимаю зачем так все сложно сделано(судя по ссылкам)?

    Нам бы все посложнее? Зависимости там всякие и прочее… И потом, кроме прогера никто не разберется.

    Проще надо быть.

    Reply
  19. German

    (18) OBEH,

    Естественно, для бюджетирования все в проектах лежит.

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

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

    Reply
  20. OBEH

    (19)Ничего не понял.

    Возможно, это и есть издержки сложной реализации.

    «именно сроки оказывают существенное влияние на краткосрочный бюджет…»

    Что такое «краткосрочный бюджет»? — День, неделя, месяц, год …?

    Чем от «некраткосрочного» отличается? — Какими то параметрами еще, кроме сроков?

    Дальше

    «Целевые цифры бюджета итак всем известны…». А мне, например, неизвестны. Я делаю простой отчет и эти самые «целевые цифры» в различных аналитиках(и не только в деньгах) система покажет. А если эти самые «целевые цифры» поменялись, то я и это нормально, не надеясь на «известность всем», получу отчетом. Причем, причины изменений этих цифр тоже. Естественно, завязываться на них я буду(чтобы нечаянно не профукать 200 миллиардов).

    Reply
  21. Sintson

    (17) Не буду спорить, может быть у вас и так…

    Однако (в академическом смысле):

    Сме́та — документ, в котором вычисляется сумма затрат на проект, расписанная по статьям расходов (заработная плата, налоги и отчисления по заработной плате, хозяйственные расходы, приобретение комплектующих и проч).

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

    Акты выполненных работ (или ПТиУ) или РТиУ — разумеется близки КС-кам.

    (18) Если Вы используете в качестве «материнской» системы УПП, в общем да, но никто не заставляет использовать эту аналитику, к тому же, задача системного архитектора именно, грамотно и максимально эффективно использовать аналитики в учетной системе.

    Я, все — таки считаю, что проекты — довольно свободный для использования справочник.

    В мою бытность разработчиком в ИВЦ Мосстрой, специалисты вообще старались не использовать справочник «Объекты строительства», считая что он исключительно для БУ строительства ОС внутри компании.

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

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

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

    Reply
  22. molodoi1sneg

    Зря скачал только. Хотел посмотреть как реализован парсер arp смет, но ничего подобного в конфигурации нет.(Обработка которая читает заголовки не в счет.)

    Reply
  23. Sintson

    (22) Думаю допишете сами, задел уже сделан, Вам в любом случае придется решать вопрос расценок, как и куда их грузить, а это, простите уже полноценное решение, на которое моя разработка не претендует.

    Reply

Leave a Comment

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