Универсальный отчет по движениям и остаткам регистров оперативного учета 1С 7.7




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

28 Comments

  1. kompas-dm

    (0) Отработал. Понравилось. Спасибо.

    Reply
  2. Hryv

    (1) пользуйтесь наздоровье 🙂

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

    Reply
  3. Ёпрст

    Шляпа. regprint.ert универсальней.

    Тут нет всех функций, нет итогов, всего 3 группировки… в общем, очередной лисапед.

    Reply
  4. Hryv

    (3)

    Во-первых, итоги есть! Не вводите, пожалуйста, людей в заблуждение!

    Во-вторых, какких функций нет? Если нет реально полезных функций, то их можно добавить. Я открыт для любых пожеланий пользователей.

    В-тетьих, «всего 3 группировки» — я на практике обычно использую 1-2, только поэтому больше трех и не добавлял

    ЗЫ я не знаком с regprint.ert, специально найду чтобы сравнить

    единственный аналог, который я видел, намного моему уступает

    собственно потому и сделал свой, что тот не устраивал

    Reply
  5. Ёпрст

    (4) хочу видеть НачОст Приход Расход КонОст одновременно по всем измерениям.

    Reply
  6. Ёпрст

    >>>я на практике обычно использую 1-2, т

    да уж..

    >>>я не знаком с regprint.ert,

    вот с этого и надо было начинать.. есть даже на прямых запросах давно ужо…

    А так, с периодичностью раз в месяц всё создают и создают разные поделки, а вот хоть раз посмотреть , что на диске итс года так с 2000-го валяется..всё никак..

    Reply
  7. Арчибальд

    (4) 😀 Это ты Ёпрсту сказал?

    Reply
  8. Ёпрст

    (7) а че ?

    :))))

    Reply
  9. Hryv

    Нашел, посмотрел

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

    Больше я реальных преимуществ regprint.ert не заметил. Форму по типу ОСВ я не делал специально, она не читабельная ИМХО. Некоторые другие различия на любителя.

    О преимуществах моего отчета я пока не буду писать, возможно я просто не нашел как это реализовано в regprint.ert. Когда лучше разберусь, тогда отпишу.

    Reply
  10. Ёпрст

    (9) см. (5) — это основное преимущество.

    Reply
  11. Hryv

    (10) если Вам нужна именно такая печатная форма, то мой отчет, конечно, не подходит

    но это не значит, что он никому не пригодится

    Reply
  12. Арчибальд

    (8) Ну, типа, ты юзверь 😀

    Reply
  13. Ёпрст

    (11) да блин.. Ну сам подумай, зачем мне видеть по отдельности Начальный остаток движуху и конечный остаток ?

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

    не более того.

    Reply
  14. Hryv

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

    кроме того уже были ситуации, когда юзер приходит и говорит мне надо такой вот отчет, я настраивал этот, сохранял шаблон и вуаля: нужный юзеру отчет готов

    Reply
  15. Ёпрст

    ну и про 3 группировки…это тоже — маловато будет..

    Reply
  16. kompas-dm

    (0) Вдогонку. Применил в боевых условиях. За 5 мин снял «наезд» клиента.

    При поиске ошибок, отладки отчетов — отлично !

    Reply
  17. Hryv

    (16) Спасибо за положительный отзыв. Ты отчетом пользуешься точно также как и я 🙂

    Reply
  18. Hryv

    Что касается сравнения с regprint.ert

    Скорее всего, если бы я раньше узнал о regprint.ert, то этот я бы и не сделал

    Но я рад, что получилось так как получилось

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

    Reply
  19. Hryv

    Основа и причина отличий в том, что я использую СоздатьОбъект(«Регистр.ХХХ»), а regprint.ert — язык запросов. Из-за этого мой отчет уступает в работе с группировками, в том числе по группам справочников. Тут у меня есть куда расти, буду или нет — пока не знаю.

    Оборотно-сальдовую форму я теперь из принципа доделаю 🙂

    Также попробую улучшить работу с фильтрами (условиями).

    3 основных преимущества моего отчета я добавил в описание.

    Также в regprint.ert обнаружился баг. Не такой уж и страшный, но все же: при печати числа округляются до 2 знаков. У меня с точностю, заданной в конфигураторе.

    Более детальный разбор делать не буду, каждый может сам сравнить.

    Reply
  20. tsd

    (18) с годами юношеский максимализм проходит 😉

    ЗЫ: Все уже украдено до нас

    Reply
  21. Hryv

    Добавил оборотно-сальдовую. Пока для нее отключены группировки. Буду благодарен всем, кто сообщит о багах!

    По мере доработки и исправления ошибок будут выходить обновления 4.4.x

    Reply
  22. kompas-dm

    (0) Занимаюсь сверткой ТиС Украина. Ваша работа с регистрами опять актуальна!

    Reply
  23. Угрюмый

    Спасибо! Пользуюсь, устраивает на все 100%!

    Reply
  24. gull22

    Интересная игрушка, понравилась!

    Reply
  25. formula76

    Очень здорово! Спасибо. Чет токо сводных остатков пока не нашел…

    Reply
  26. Amigo_0

    Невероятная вещь! Спасибо автору!

    Reply
  27. lionrat

    Поигрался с 4.4.0. Отличная штуковина! Автору респект!

    Reply
  28. fort13

    Спасибо автору!

    Reply

Leave a Comment

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