Отчеты для ТиС, ред.9.2




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

    А почему бы особенности отчетов не выложить в качестве описания.

    На сайте все вроде для этого есть 🙁

    Reply
  2. waol

    ок, сделаю чуть позже

    Reply
  3. CheBurator

    Я как-то думал, что просроченным считается док, если ориентироваться на реквизит «дата оплаты»….

    Reply
  4. Gendalf

    За остатки с фильтром цен огромнейший фенкс +100!!! 🙂

    Reply
  5. glazk

    Хороший отчёт! Спасибо! А как сделать, что бы вместо «Код» печатать № п/п.

    Reply
  6. waol

    glazk: а какой отчет ?

    Reply
  7. glazk

    Остатки ТМЦ

    Reply
  8. CheBurator

    Замечание (3) было обойдено вниманием … 😉

    Reply
  9. waol

    Замечание (3) не было понято …;)

    Reply
  10. Happyjack

    понравился отчет остатки с фильтром цен. Отчет по списанию тмц плачет, что не нашел в справочнике тип цен закупочная, хотя такой тип цен есть…

    Reply
  11. waol

    10) д.б. именно «Закупочная». с большой буквы. Кириллицей.

    (можно скопировать из текста этого сообщения)

    Reply
  12. jeka66

    В отчете «Отчет по продажам (без ГП, с периодами).ert» если меняются цены закупа, то просчитывает неправильно, но при ровных ценах все прекрасно.

    Reply
  13. waol

    (12) подразумевалось так: отчет не видит изменений цен в пределах периодов. Цена берется в каждом периоде на его конец. Работает не так ?

    Reply
  14. jeka66

    (13) Да, он отсчитывает от одной цены . Есть еще вопрос про множественный фильтр : при выборе фильтра, например по покупателям, выскакивает окошко, но активной остается только форма отчета и выбрать покупателей невозможно. При обновлении открывается форма стандартного отчета (но это не так важно, а работа фильтра интересует очень)

    Reply
  15. CheBurator

    (9) Штатная ТиС взаиморасчеты гасит по ФИФО в рамках договора. Зачем это считать мимо регистров…? (или я не въехал)

    Reply
  16. CheBurator

    (9) по поводу (3)

    > Просроченным считается документ, плановая дата оплаты которого превышает дату конца формирования отчета,

    Например, есть Реализация N123, плановая дата оплаты = 31.01.2008 — т.е. представлена большая отсрочка…

    Отчет? период задан до конца года 2007 г.

    По вашей логике получается, что Реализация 123 — просрочена…?

    …и вообще — странно… в зависимости от даты ВЫБОРКИ данных принимать решения по данным….?

    Reply
  17. waol

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

    Reply
  18. waol

    (15) а это уже из заголовка: «…для тех, кто не любит

    возиться с восстановлением ГП»

    Reply
  19. CheBurator

    (18) понял… т.е. типа вместо восстановить ГП и получить в отчете правильные данные делаем расчет по фифо — т.е. то же самое «восстановление ГП» но прямо в отчете…? вы уверены что вы учли все телодвижения во взаиморасчетах? продажи-возвраты-сторно-корректировки-отчеты комиссионеров-пко-рко-банк и прочее ВСЕ что имеет отношение к взаиморасчетам…? в т.ч. несовпадение валют договора и валюты документа… и проче…?

    Да или нет? учли ВСЕ?

    Reply
  20. waol

    (14) по поводу невозможности работать с мн.фильтром — не смог воспроизвести описанное у себя. При добавлении покупателя в мн.фильтр открывается немодальный подбор,

    при доб.свойств — уже модально. Что касается кнопок «Настройка» и «Обновить» — я с ними пардон — не заморачивался. По идее там не сложно поправить

    Reply
  21. CheBurator

    (20) может быть это связано с модальным окном

    Reply
  22. waol

    (19) конечно не уверен ))

    но пытался учесть. Если увидите ошибку — пишите, буду благодарен.

    вообще, для разных валют не тестировался, работал в основном в режиме «все договоры в рублях»

    Reply
  23. waol

    (21) если сам отчет открыть модально, то такая фича появится. Но как он его открыл модально — другой вопрос.

    Reply
  24. waol

    (18) могу еще по этому поводу сказать, что учитываются оплаты введенные на основании. Т.е. если ПКО введен на основании реализации, то она считается оплаченной, независимо от того на какой позиции ФИФО она находится.

    Отчетов комиссионеров там каж. нет. вводы остатков, возвраты и корректировки долга учитываются. Сторно нет. Реализация только документ вида «Реализация». Остальные нет.

    В общем, конечно целиком восстановление ГП он не заменяет, надо дорабатывать.

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

    Reply
  25. ux

    Спасибо за отчеты! Избавили от некоторой работы)

    Reply
  26. spryn

    Очень помог ваш отчёт Ведомость по контрагентам (без ГП). В отличие от стандартного не глючит. Плюсик за щедрость вашу к всем вашим разработкам. +++++++++++++++++++++++++

    Reply
  27. maljaev

    (26) Еще посты можно плюсовать, чего мелочиться…

    Reply
  28. waol

    (26) спасибо-очень-приятно!

    Reply
  29. waol

    (27) бросай это дело

    Reply
  30. maljaev

    (29) А что, я неправ? Ты думаешь, тот что тебе все разработки плюсанул, хотя бы посмотрел на них? Ему понадобился один отчет по ТиС, а в благодарность он плюсанул еще 6. А что там у тебя в этих шести — ему по барабану. А другому, кто их будет смотреть и скачивать — не по барабану. Ты сам-то можешь аргументированно объяснить мне, тупому, в чем я неправ?

    Reply
  31. ellezar

    Большое спасибо за отчет по остаткам ТМЦ, можно еще 1 поправочку внести в отчет добавить форму, чтобы отслеживать документооборот товара, чтобы не пользоватся несколькими отчетами.

    Reply
  32. waol

    (31) можно скопировать формирование отчета из «Ведомость по остаткам…» (или что нибудь вроде того в ТиС). Думаю, навряд ли у меня руки дойдут в ближайшее время

    Reply
  33. nickkey

    Спасибо за отчеты но есть непонятный косяк не могу понять как он получается в отчете «ведомость по контрагентам» дни просрочки какие то астрономические прям неправильно считает досадно такой удобный а никто ссылочку не кинет может есть для тис 9.2 такой же отчет как для 8.7 «взаиморасчеты» буду очень благодарен.

    Reply
  34. waol

    (33) посмотрю, м.есть для 9.2. но он скорее всего с использованием 1с++

    Reply
  35. nickkey

    такой и нужен у меня есть реализация на 8.7 но они отличаются буду очень признателен — prostoprogrammer@list.ru

    Reply
  36. orsprog

    понравился отчет остатки с фильтром цен

    Reply
  37. waol

    (35) чего то я запутался, тут же как раз отчеты для 9.2

    Reply
  38. nickkey

    все правильно но в 8.7 прям обширные взаиморасчеты а в 9.2 только отчеты по долгам а там даже дней просрочки нет я пробовал переписывать со старой но база переполнена нестандартными регистрами черт ногу сломит вот и спрашивал может у кого есть чего нибудь подобное чтоб просрочка долги и дату на скажем недели 2 вперед можно было ставить от ТА я это делал только логическим методом обмана ато ТА ругается 🙂 если что нибудь подобное есть было бы отлично.

    Reply
  39. kleo19866

    интересный отчет остатки тмц с минимальным остатком

    Reply
  40. provnick

    Интересно, в отчете по продажам функция за день есть, а в списке нет:

    сзПериодичность.ДобавитьЗначение(«??????»);

    сзПериодичность.ДобавитьЗначение(«Месяц»);

    сзПериодичность.ДобавитьЗначение(«Квартал»);

    сзПериодичность.ДобавитьЗначение(«Год»); добавил за «день», получил то, что надо, но вот, что хот-са сделать чтобы дни в колонке, а товар по горизонтали? не подскажете?

    И в отчете по контрагентам Поле агрегатного объекта ЗачтенАвансПоставщикуВал ошибка, пришлось убрать, в виду отсутствия оного.

    Reply
  41. waol

    (40) >>хот-са сделать чтобы дни в колонке, а товар по горизонтали? не подскажете?

    могу сделать, пишите — договоримся

    Reply

Leave a Comment

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