Материальный отчет BS (для 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='\

41 Comments

  1. Арчибальд

    (0) Взгляни у меня «Комплект отчетов…»

    Разумеется, плюс.

    Reply
  2. ZeBeR

    (1) Посмотрел. Отчет по списанию — идея та же.

    НО

    Вы программеры любите эффектно вызвать отчет, а мы бухи, любим красиво распечатать. 😀

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

    (2) Я потому и послал, что идея та же.

    А что, неужели так уж некрасиво распечатывается? 😥

    Reply
  4. ZeBeR

    (3) Просто нелюблю количество под суммами — нечитается.

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

    (4) Я тоже этого не люблю. Заказали клиенты… 😐

    Reply
  6. kuzmina_ann

    а сортировать по инвентарному номеру можно?

    Reply
  7. ZeBeR

    (6) сортировка в отчете стандартная, но если надо, за плюсик можно сделать 😉

    Reply
  8. Adoms

    Очень хорошая обработка ! Большое спасибо!

    Reply
  9. Ionik

    Действительно,стоящий труд…спасибо.

    Reply
  10. YuryKr

    Очень достойно!!! Спасибо

    Reply
  11. kuzmina_ann

    сделайте, пожалуйста, а плюсик уже поставила, спасибо

    Reply
  12. kuzmina_ann

    :{}

    Reply
  13. ZeBeR

    (11) (12) Сделано, пользуйтесь 🙂

    Reply
  14. Grigori

    Хорошо работает, наглядная и читаемая форма.

    Reply
  15. timurei

    классный отчет, как раз то что искал…….+

    Reply
  16. psa76

    Ребята Помогите. Есть Эта обработка «Материальный Отчет DS» только для бюджета. Как раз все подходит, только не хоз.расч. план счетов.

    Reply
  17. ZeBeR

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

    Reply
  18. psa76

    Был бы рядом програмист. а так он к нам приезжает рас в год, и то на баланс. (конце года) Ребята помогите………….

    Reply
  19. ZeBeR

    (18)

    Попробую помочь если никто из программистов, работающих с бюджетом, не откликнется. Это было бы проще.

    У меня нет бюджетной конфы, поэтому дай мне описание бюджетных счетов учета материалов в 1С в следующем виде:

    Код; Наименование; Субконто1; Субконто2; Субконто3;

    Например

    Группа счетов 10; «Материалы» ; Материалы

    счет 10.1; «Сырье и Материалы»; Материалы; МестаХранения;

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

    а дальше посмотрим.

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

    (19) Счета в бюджетке — это справочник 😳

    Reply
  21. ZeBeR

    (18) (20) Тогда я пас.

    Reply
  22. buka-777

    классный отчет!!!

    только зачем выводится код по субконто — ведь это аналитика в 1С, пришлось убрать

    Reply
  23. ZeBeR

    (22) Спасибо за коммент, раз так понравился отчет, можно и плюсик поставить!

    Код субконто 1С большинство использует как инвентарный номер, поэтому он и выводится в отчете.

    Reply
  24. buka-777

    так то по материалам, а по контагентам и их счетам?

    даже два плюсика поставлю

    Reply
  25. ZeBeR

    (24) Согласен, не очень красиво. Делал, чтоб вывести код статьи затрат, а все остальные стали выводиться до кучи.

    Reply
  26. antoninayuf80

    Отличная форма! У меня раньше не по одному дню уходило, чтобы что-то сваять из стандартных отчетов по всем нашим объектам. А делать это приходится каждый месяц. В-общем, спасибо Вам!

    Reply
  27. sviat02

    Потскажыте плиз для бух. учета Украины подойдет, ито собрался делать тоже из «Подрядчик строительства».

    Reply
  28. ZeBeR

    (27) Попробуйте, потом расскажете. В любом случае будет легче этот отчет дорботать, чем новый ваять.

    Reply
  29. psa76

    Добрый день. Помогите найти обработу — «РЕЕСТР закупок». но есть нюанс, в том что, я хочу выбор производить по коменариям.

    Reply
  30. spartak_lp

    спасибо за обработку!

    Reply
  31. ZeBeR

    (30) Пожалуйста. Если понравилось, можно плюсик поставить.

    Reply
  32. al_ban

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

    Reply
  33. sviat02

    Для бух. учета Украины, конечно не подходит но за основу взять то что надо, правда много процедур глобального модуля которых в бух. учете для Украъни просто несуществует, мне надо было делать попроще , вот я и взял чуть другой за основу отчет. А так отчет очень хорошый, видно что проделано много работы, большой плюс.

    Reply
  34. ZeBeR

    (33)Спасибо. А где «большой плюс»?

    Reply
  35. asterlana

    замечательный отчет. Поставила бы два плюса, да модератор не позволит

    Reply
  36. nvp1712

    (7)

    Спасибо! Отличный отчет

    Reply
  37. Credo07

    Спасибо большое за прекрасные отчеты! Очень помогли!

    Reply
  38. АЛИСА В СТРАНЕ ЧУДЕС

    Спасибо огромное за отчет! Он великолепен!

    Reply
  39. АЛИСА В СТРАНЕ ЧУДЕС

    Подскажите пожалуйста, как в отчет добавить Номенклатурную группу материала и нормы расхода

    Reply
  40. Доня

    Скачала, плюсик

    спасибо пригодился

    Reply
  41. brother_85

    Великое СПАСИБО! Очень помогла данная обработка. Жизнь спасла)))Иначе бы!

    Хорошо, что есть такие люди, как Вы!

    Reply

Leave a Comment

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