Материальный отчет по складу МХ-20 для Бухгалтерии 3.0




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

30 Comments

  1. TIGER1991

    Здравствуйте! Когда будет по 003 счету?

    Reply
  2. allynet11

    Здравствуйте!

    Такого же рода отчет по переданным материалам в производство, т.е. по забалансу (МЦ,04) по МОЛ , не планируете создать??

    Reply
  3. gull22

    Да и счет 002лишним не будет. Авансом плюс.

    Reply
  4. MGreg

    003 счет добавил

    Reply
  5. Tata7772

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

    Reply
  6. oleg212

    тоже спрошу — а с детализацией по документам расчетов, можно такой отчет сделать для 8.3 Бух и что по цене?

    Reply
  7. dimbos_s

    Подскажите пожалуйста.Почему, когда выбираю отчет по форме МХ — 20, таблица отчета выходит пустая?

    Reply
  8. MGreg

    (7) dimbos_s, Надо обязательно указывать склад.

    Reply
  9. nikaleks

    Хороший отчёт!, ждём доработок

    А можно добавить группировку по счёту учёта, и выбор счетов учёта?

    Reply
  10. MGreg

    (9) nikaleks, Конечно добавлю, в ближайшую неделю. Думаю будет лучше.

    Reply
  11. gull22

    Если сделать отбор «по всем складам» будет ли выводить по складам? Аналогично отчету «Остатки по складам» БП 3.0

    И можно ли организовать вывод по складам в случае отрицательного ответа?

    Reply
  12. gull22

    А как рассчитывается цена?

    Reply
  13. MGreg

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

    Reply
  14. gull22

    (13)

    Цена на конец периода?

    Reply
  15. sergling

    Не работает в принципе по 10 и 41 на июль 2015, т.к.

    Функция ПолучитьВыборкуПоБухДанным()

    | ХозрасчетныйОстаткиИОбороты.Субконто3 = &Склад — НЕТУ СУБКОНТО 3 на этих счета

    Reply
  16. nata_87

    Субконто3 = Склад при методе списания ФИФО, а при среднем списание у Вас склад в Субконто2, поэтому надо чуть изменить запрос под свой метод списания ТМЦ.

    Reply
  17. MGreg

    (16) nata_87, Изменения в запрос (в зависимости от настроек 1с 2 субконто или 3 на счетах учета) я вносил. Видимо не обновил. Обновлю.

    Reply
  18. Yolochka

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

    Reply
  19. MGreg

    (18) Yolochka, (18) Yolochka, Не вижу необходимости, хотя не понял куда добавить.

    Reply
  20. tornado_storm

    ВедетсяУчетПоПартиям = СпособОценкиМПЗ = Перечисления.СпособыОценки.ПоСредней; в строке 30 и тогда взлетел при расчете себестоимости по средней.

    Reply
  21. user823594

    Отчёт формируется по всем складам, но когда выбираешь конкретный склад — пустая таблица.

    Reply
  22. MGreg

    (21)Я посмотрю, там может быть проблема каким субконто у Вас склад 2 или 3, хотя я в свое время предусматривал это надо проверить спасибо. Исправлю отправлю Вам на днях если что.

    Reply
  23. MGreg

    Проверил все работает.

    Reply
  24. MGreg

    Не проверял если партионный учет. Если не работает пишите отправлю на почту.

    Reply
  25. Shamil1994

    Добрый день !

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

    Reply
  26. MGreg

    (25)Да, так давно это было, код исправил, куда отправить ?? Сегодня я бы все переделал, но пока оставлю.

    Reply
  27. ybatiaev

    (26) Добрый день! Тут выложена последняя версия? Можно скачивать?

    Reply
  28. MGreg

    (27)Коли так Давайте после праздников 10 января обновлю. Там еще улучшения внесу.

    Reply
  29. WWWWW

    Что за хрень, на версии 3.0.69.32 если выбираю склад выводится только количество, без сумм. На версии 3.1.9.188 вообще ошибка: Форма.ФормаОтчета.Форма(519,28).Переменная не определена (БухгалтерскийУчетПереопределяемый). Не рекомендую..

    Reply
  30. WWWWW

    (29)Извеняюсь, все работает. Только при включенной настройке Учет запасов по складам (по количеству) сумма в отчет не выводится, на этот случай никакого расчета по среднему либо данных из документов не предусмотренно(( Смысл этого отчета тогда теряется, так как если включить (по количеству и сумме) то можно те же данные получить и из оборотно-сальдовой по счету!!!

    Reply

Leave a Comment

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