Инвентаризация РБП (ИНВ-11)




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

29 Comments

  1. e.kogan

    1. Отрихтуйте форму. Привязки, рамочки и т.д. сильно повышают эргономичность.

    2. Выводите в таблицу без заголовков колонок и строк. И что за микрокартинка в последней колонке?

    3. «по состоянию на проведена» — а где дата?

    Исправите — будет плюс.

    Reply
  2. pinkz80

    не корысти ради…. исправил ошибки.

    Reply
  3. e.kogan

    (2) Уже лучше. А если разложить ответственных лиц и комиссию на две разные рамочки, подписи сделать «… №1» и т.д. — станет совсем приятно для глаза.

    Не то чтобы это были ошибки, смысловое я ещё не смотрела.

    Reply
  4. pinkz80

    (3) буду благодарен, если посмотрите и укажите на смысловые ошибки

    Reply
  5. igor-pn

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

    Reply
  6. vasiliy_b

    Спасибо огромный плюс, очень пригодилась =) Бухгалтера довольны

    Reply
  7. kosmit

    http://infostart.ru/public/71308/

    Исправил обработку, неправильно работала, выложил. Забирайте.

    Reply
  8. pinkz80

    (7)

    гм. что же вы исправили, если при открытии вашего отчета выдает ошибку:

    {ОбщийМодуль.УниверсальныеМеханизмы(831)}: Значение не является значением объектного типа (Строки)

    Если ДеревоМакетов.Строки.Количество() > 1 Тогда

    (упп 1.2.29)

    Reply
  9. tygris

    Не понятно, почему столбцы «Остаток расходов…» и «Расчетный остаток расходов…» заполняются одинаковыми значениями. Расчетный остаток должен рассчитываться, в таком случае могут возникнуть отклонения, отображаемые в последних двух столбцах. В этом смысл инвентаризации, мне кажется.

    Reply
  10. pinkz80

    (9) рассчитываться бухгалтером и заполняться вручную — вы это имели в виду?

    если это критично для вас, могу добавить галочку «не заполнять расчетный остаток»

    Reply
  11. AnnaSehrGut

    Спасибо. Пригодилась. Хороший отчет

    Reply
  12. igo-osetro

    Спасибо! Мне очень пригодился бухгалтер был очень рад! отличный отчет у меня на УСО сформировался без проблем )))

    Reply
  13. kala

    Спасибо большое за труд!!! Пригодился.

    Reply
  14. Muler_irina

    Спасибо. Пригодилась. Хороший отчет

    Reply
  15. napan

    Спасибо большое хороший отчет, нам очень пригодился, бухгалтер безумно счатслив, как и я. Спасибо автору….

    Reply
  16. orsprog

    Спасибо! Мне очень пригодился бухгалтер была очень рада!

    Reply
  17. a_mironov

    Вот блин 🙂 а наша контора в своё время нанимала 1С:хомнет на весь день, чтобы они доработки сделали, они и этим занимались. А мог бы сэкономить, да, если бы знал, что можно тут скачать. Хорошая мысля приходит опосля, как правило. Надо бы несколько разработок своих сюда выложить

    Reply
  18. YuliaYVS

    А всё таки расчет последних двух колонок нужен, как ни крути… Ручками считать — это проще в екселе, через макрос, там хотя бы можно выгрузить в 1С (бух справку) и возиться меньше… Доработка не помешает

    Reply
  19. pinkz80

    (18)

    Предложите алгоритм расчета?

    Reply
  20. YuliaYVS

    сижу думаю, пробую сделать.

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

    Reply
  21. Лен75

    спасибо, отчет хороший, пригодится

    Reply
  22. AlenaR

    попадают рбп по которым на отчетную дату уже давно кончился срок

    либо по которым он еще не начинался

    например рбп появилось в январе 2012, а я строю отчет на конец 2011 года

    Reply
  23. pinkz80

    (22) Смотрите, что у вас числится на 97 счете. Именно от этих остатков и «пляшет» отчет.

    ВЫБРАТЬ

    ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаКСписаниию,



    ИЗ

    РегистрБухгалтерии.Хозрасчетный.Остатки(&КонПериода, Счет В ИЕРАРХИИ (&Счет97), , Организация = &Организация) КАК ХозрасчетныйОстатки

    Reply
  24. AlenaR

    (23) я не стала залезать в код

    просто нашла другой отчет тут же на инфостате, который формирует все верно

    Reply
  25. al01234

    Спасибо, отчет пригодился ))

    Reply
  26. ИрискаЯ

    Спасибо большое. Как раз то, что было нужно моему бухгалтеру :)))

    Reply
  27. Sanek_159

    Спасибо, за отчет! Собрался писать отчет, а он уже есть. Чуть подправил для своих целей и готово. От бухгалтеров спасибо.

    Reply
  28. Velliar

    Для УПП 48 релиз корректно отобразит данные? Он как формирует на конкретную дату? Или можно допустим что бы сформировался только за 2013 год?

    Reply
  29. Velliar

    Зря скачал. Все равно придется свой писать. 8 графа не верно заполняется. 76,01,2 счет не попадает в отчет.

    Reply

Leave a Comment

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