Контроль фактических отгрузок (несложно изменить на контроль чего либо в любой конфигурации 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='\

45 Comments

  1. Ёпрст

    Что это? И зачем всё это нужно ? чтоб тупо показать реализации, у которых нет/есть счет фактуры ? …

    :))

    И нафига там упёрся справочник ?


    Reply
  2. Ёпрст

    И нафига в справочнике хранить всё ЭТО ? …

    Reply
  3. WiseSnake

    > И нафига в справочнике хранить всё ЭТО ? …

    Чтобы не лезть в типовую конфу… это можно подвесить сверху и не иметь проблемм с обновлениями.

    > Что это? И зачем всё это нужно ? чтоб тупо показать реализации, у которых нет/есть счет фактуры ? …

    Подправил описание… Появилась предистория… то бишь пример того как «это» применил я.

    Reply
  4. Ёпрст

    (3) Ё… Чтоб проверить, проведена ли на документ Счёт фактура, нужно Плодить элемент справочника к каждому документу ???

    Ну что за бредни…

    А распровели документ, привет ? Имеем неактуальный справочник ?

    Имхо, всё в топку.

    Максимум, слепить отчет на коленке, который покажет, где нет проведенных счет -фактур у документа реализация… всё.

    Reply
  5. WiseSnake

    (4) если Вы читаете не внимательно, то это не значит что это бредни….

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

    Reply
  6. Ёпрст

    (5) Документооборот, к примеру, 1000-1500 доков реализации в день, оно мне надо иметь такой же справочник ?

    Что значит, накладная провелась, но не уехала ? …

    Мот что-то менять нужно в самой организации работы, а не лепить никому не нужный справочник ? Который непонятно кем и когда будет обновляться…

    Reply
  7. WiseSnake

    (6) справочник занимает в десятки раз меньше места чем теже документы.

    >Что значит, накладная провелась, но не уехала ? …

    Подготавливаются документы и отправляются на склад на сборку… сборка может продолжаться по каким либо причинам продолжительное время более 3х дней. На предприятии установлены правила что редактировать документы операторы могут только 3 дня. Затем доступ закрывается (и лично я считаю это хорошим правилом)

    > Мот что-то менять нужно в самой организации работы, а не лепить никому не нужный справочник ? Который непонятно кем и когда будет обновляться…

    Не говорите ерунды! У каждого предприятия есть своя специфика, у этого предприятия такая. Не надо всез равнять под одну гребенку.

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

    Это нужно как минимум 1 человеку… мне. Прибавьте сюда еще 5 операторов. Меня устраивает как это работает. Если Вы не знаете куда «это» применить. То не используйте «это»

    Reply
  8. WiseSnake

    (6) Этот справочник можно сравнить с «Категориями» в 8ке. Вы считаете что в 8ке тоже сделали какой то непонятный и никому не нужный справочник «КатегорииОбъектов» ))))

    Reply
  9. Ёпрст

    (7) Ну и нахрен он нужен, если всё достаётся Отчетом по Документам ?

    Reply
  10. WiseSnake

    (9) ))))))))))))))))))))))))))))))))))))) перечитайте еще разок все и с самого начала, НО ВНИМАТЕЛЬНО! На мой взгляд я ответил на Ваш впрос и никаким Отчетом по Документам вы этих данных не получите…

    Reply
  11. Ёпрст

    (10) Биомать а ?

    Нахрена он нужен, когда гораздо проще иметь 1 реквизит в документе?

    Да хоть в комментарий пиши, вообще конфу не меняем .

    Reply
  12. WiseSnake

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

    А комментарий нужен для комментария))), Вы знаете некоторые даже этим пользуются))) и другими реквизитами тоже…

    Reply
  13. Ёпрст

    Охринеть, а лишний справочник, это не проблемы с обновлением ?

    Мдя…

    А в комментарий можно загнать всё и показывать как угодно в отчете, через разделитель, к примеру.

    Reply
  14. tango

    выписываем новую накладушку — в папочку файлик ИмяФайла=Док.Номер.

    уехала накладушечка — файлик нах.

    надо посмотреть список неуехавших — открываем папочку в искплорере, смотрим

    ни тебе справочников. ни реквизитов

    Reply
  15. Ёпрст

    А где отчет по справочнику ?

    А кто его смотреть будет?



    Идею — в топку.

    Плодить целый справочник, еще и с отбором по реквизиту, вместо того, чтоб завести/или не заводить один реквизит в шапке документа — супер идея, продолжайте в том же духе ….

    Reply
  16. tango

    правда, при таком решении становится неочевидной необходимость «внутреннего проекта по внедрению»

    Reply
  17. WiseSnake

    (13) Вы вообще когда нибудь обновляли базы?

    Мне приходится обновлять их очень много… Я не люблю делать лишнюю работу!!!

    Если Вы обновляли базы то должны знать что если это Ваш справочник то при сравнении объединении баз он даже не выходит в дерево изменений.

    >А в комментарий можно загнать всё и показывать как угодно в отчете

    1. Я еще раз обращаю Ваше внимание что вы не внимательно читаете.

    Я писал: «На предприятии установлены правила что редактировать документы операторы могут только 3 дня. Затем доступ закрывается» это касается и комментария.

    2. Где контроль прав? Комментарий могут менять все кто имеет доступ к документу… А должны тогда иметь доступ только операторы.

    3. Где гарантия того что операторы правильно напишут комментарий, чтобы Ваш отчет сработал? Отвечать не надо… гарантии нет!

    P.S. После таких вот изменений мне приходится «выруливать» базы потом, потому что людям пох… они поналепят реквизитов еще умудрятся их на форму загнать….. конечно они же за то время, что работают ниразу не обновляли базу. А когда приспичит… когда уже база загибается и надо палюбому обновлять увольняются. А за то время что они проработали они успевают такое Г в базе налепить, что просто диву даешься…

    Reply
  18. WiseSnake

    (14) накладных очень много… ведуться они разными людьми… это мягко сказать неудобно

    Reply
  19. Ёпрст

    (17) Удачи в том же духе в своём заблуждении.

    Reply
  20. WiseSnake

    >А где отчет по справочнику ?

    >А кто его смотреть будет?

    Отчет не нужен… Вся информация в обработке.. там же и редактируется…

    >Идею — в топку.

    Плодить целый справочник, еще и с отбором по реквизиту, вместо того, чтоб завести/или не заводить один реквизит в шапке документа — супер идея, продолжайте в том же духе ….

    посмотрите пост (17) может, что нить и поймете…

    Reply
  21. WiseSnake

    (19) В каком заблуждении? Это опыт, дорогой мой… И именно на основе опыта я сделал именно так, а не иначе… Когда то и я добавлял вот так реквизиты и что-то пытался там накуралесить, но это уже пройденный этап..

    Reply
  22. tango

    забавно

    Ёпрст, Вы заметили, что меряетесь?

    Reply
  23. WiseSnake

    >Идею — в топку.

    Плодить целый справочник, еще и с отбором по реквизиту, вместо того, чтоб завести/или не заводить один

    Не хотите заводить новый справочник…. сохраняйте во внешний файл..но это дольше будет работать…тогда вообще ничего не надо менять… в конфе… Внешний отчет и внешний файл…

    Reply
  24. Свой

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

    Сейчас поставили подобную задачу (учет фактически вернувшихся документов) для Торговли. Собирался решать с помощью Документ+Регистр но идея со справочником тоже нравится.

    Reply
  25. WiseSnake

    (24) Спасибо! Основная фишка в том что сделал раз и забыл и все работает 😉

    Reply
  26. WiseSnake

    (24) Как дополнение… реквизит можно сделать например перечислением с нужными значениями, а вывести представление перечисления в строку в списке не проблема 😉

    Reply
  27. Свой

    Единственно, я сомневаюсь в том чтобы факт отправки устанавливать при печати документа. Вроде бы удобно — не надо делать лишних движений, с другой стороны печать подтверждает только отправку на печать а не факт передачи контрагенту. У себя я делал явную передачу документов, т.к. у нас гораздо меньше чем 1500док/день

    Reply
  28. WiseSnake

    >Единственно, я сомневаюсь в том чтобы факт отправки устанавливать при печати документа.

    Это я сделал скрепя душой по слезным мольбам операторов. Им так очень удобно.

    Reply
  29. CheBurator

    > а что редактировать документы операторы могут только 3 дня.

    это — плохое правило…

    — на старой работе у меня все (кроме меня и одного «опытного») работали только в ТА.

    — и сейчас на работе тоже вывел, что все работают почти в ТА…

    Reply
  30. CheBurator

    Значицца так.. всуну свои 5 копеек: как это было у меня (в принципе и сейчас есть…)

    — типовая ТиС

    — добавлен один общий реквизит для документов «Цвет» (он же статус, подкраска и прочее что надо в зависимости от вида документа)

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

    — по факту сборки бэк-оператор печатает отгрузочные доки;

    — накладная «расцвечивается» статусом «готово к отгрузке»;

    — логист вечером составлет раскладку «готовых к отгрузке» отгрузок по машинам, т.е. на каждую машину формировал «транспортный лист на дату на машину» (адрес доставки, контакты, сколько коробок, сколько пакетов документов, врем яприбытия/убытия по точкам и прочее), транспортный лист сохранял, изменений кофиги не требуется;

    — после попадания в транспортный лист накладная «расцвечивается» статусом «на доставке»;

    — после выполнения доставки водители на след.день отчитываются именно этими «транспортными листами»

    — логист по каждому транспортному листу проводит «раскладку» накладных — которые сданы, доким подписаны и все ок — статус = «нулю», есть проблема с доками — статус=»проблемный», доки на доставке через ТК — статус «проблемный»;

    — при возврате доков от клиента по почте — секретарь проводит инспекцию доков или ставит статус=ноль, или оставляет проблемный статус…

    — соответсвенно есть пару отчетов тривиальных, показывающих подборки доков с разными статусами;

    вот собственно и все…

    Reply
  31. CheBurator

    + если кому-то интересно — пишите в личку, пороюсь скрины выложу..

    Reply
  32. WiseSnake

    (29) несогласен… запрещать редактирование после проведения невозможно, потому что есть условия которые это не позволяют…

    если резрешать редактирование больше то это вообще полная фигня… Восстановление ТА занимаются другие люди и это организовано…

    (30) >добавлен один общий реквизит

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

    Сhe Burashka маленький вопросик, с отчетами понятно, а как логист меняет статус?

    Reply
  33. WiseSnake

    + (32) ну на счет хранимой информации «намного больше» я преувеличил…. ведь все зависит от того сколько других документов в базе кроме тех для которых реквизит применяется…

    Reply
  34. CheBurator

    > запрещать редактирование после проведения невозможно

    смотря что… например, заявки — однозначный запрет, все исправления — только корректировочными заявками.

    реализации — весьма ограниченный круг лиц — понятно где искать косяки, плюс исправления задним числом в накладных — только в сторону уменьшения количества и состава документа; если надо в сторону увеличения колва/состава — то задним числом только через меня — за год был всего один случай…

    ..

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

    + есть возможность устанавливать статус дока вручную в журнале.

    логгирования кто на что изменил — надобности не было, народ был вменяемый.

    Reply
  35. WiseSnake

    (34) ну если я говорю невозможно значит наверно знаю? 😉 Как я уже сказал задержки при загрузке могут составлять несколько дней, причем при завершении загрузки клиенты накладную могут попросить изменить, например увеличить заказ если в машине осталось свободное место или уменьшить есть что нибудь не влезло и т.д. и т.п.

    Reply
  36. CheBurator

    если не рассматривать вопрос когда сборка по документу реализации — то, назачем при изменении заказа от клиента лезть куда-то назад и что-то править..??? выписал корректировочный заказ — и вперед.. или добирать или выкидывать лишку… + по цепочке корректировок я всегда могу посмотреть «недостачу» по сборке…

    Reply
  37. WiseSnake

    >выписал корректировочный заказ — и вперед..

    1. Плодить лишние документы.

    2. Потом еще нужен будет контроль отправки и на корректировочные документы

    3. Это всего лишь одно из условий… Вот например такое условие. Из-за задержки и/или по другой причине клиент потребовал скидку на товар(предположим на весь), как разрулить такую ситуацию? Тоже корректировочым заказом?

    Reply
  38. CheBurator

    1. Неубедительно. В чем напряг «лишних» документов — вы что их по 300 позиций ручками перебиваете..??? Комп — тупой, это его самая работа — хранить инфу… не надорвется..

    2. какой контроль отправки на корректировочные документы…? не понял… с точки зрения менеджера/кладовщика/сборщика — документ — ОДИН, и отражает __текущую__ ситуацию, + цепочка доков позволяет при необходимости легко восстановить историю… это бывает надо редко, но бывает… Другое дело, что штатная ТИСовская система работы с заявками не есть сильно удобная и жизненная… поэтому манагеры с трудом воспринимают «идею» корректировок — для них док — один и они в нем правят и пишут что надо… а вот если «спрятать» от них лишнюю инфу — то все сразу нормализуется.. т.е. речь состоит в том, чтобы дать манагерам удобный инструмент ДЛЯ НИХ.

    3 «..клиент потребовал скидку на товар(предположим на весь), как разрулить такую ситуацию? Тоже корректировочым заказом?» — ИМЕННО! потому что как раз и будет видно вся история… вдобавок и это реально было — потом все переигрывается назад (такая ситуация возможна…) и в условиях когда все правится в одной заявке и иистория «утряски» цен с клиентом могла быть длительная — запросто получается что нужные цены «до исправления» приходится вытаскивать или из мусорной орзины и вбивать с листа или манагер судорожно полтора часа пытается «реанимировать» ситуацию назад по куче личных записей в аське, почте, ежедневнике и т.д. — в то время когда работы там на 2 мин…

    Reply
  39. WiseSnake

    (1) Напряг в объеме… База и так весит под 5 гигов….А будет под 10… Что соответственно еще усложнит работу…

    (2)(3) Я не спорю, я согласен, что исправление корректировками более правильное, но так как настраивал работу не я, до меня наваяли, и исправить это возможности нет, во всяком случае пока, то работаем с тем что есть. И если сделать все по уму, то актуальность данной разработки не теряет свою ценность, а наоборот. К тому же в типовой конфе нет нормального интерфейса удобного манагерам….

    Reply
  40. Свой

    решаю сейчас — чем же лучше фиксировать статусы документа, справочником или общим реквизитом ?

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

    Reply
  41. WiseSnake

    (40) лично у меня такой вариант уже типа стандартизирован в разных модификациях. Незнаю почему сообщество так скептически относится к данному варианту решения, минусов я в нем не вижу, на практике все отлично работает. Скорее непривычный метод, пока.

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

    Reply
  42. UilSmit

    Супер!

    Reply
  43. WiseSnake

    (42) UilSmit почему тогда плюса не вижу???? )))))

    Reply
  44. p_margo

    да нормальная обработка. Подобное писала в прошлом году, несколько другая задача стояла, но что-то подобное и получилось. Ну а с обновленниями.. там всегда почти засада, выкручиваемся как-то. Ибо стандартными конфигурациями мало кто пользуется, се ля ви..

    Reply
  45. romaty8

    Единственно, я сомневаюсь в том чтобы факт отправки устанавливать при печати документа. Вроде бы удобно — не надо делать лишних движений, с другой стороны печать подтверждает только отправку на печать а не факт передачи контрагенту. У себя я делал явную передачу документов, т.к. у нас гораздо меньше чем 1500док/день

    Reply

Leave a Comment

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