Путевые заметки…




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

46 Comments

  1. poppy

    Почему бы не отнести к «оперативным» все остальные регистры? И при перепроведении исключить манипуляции в т.ч. и с остальными регистрами?

    Reply
  2. CheBurator

    … Потомушта нельзя быть красивой такой …

    Если кратко (имхо глубокое):

    1. история остатков/взаиморасчетов/авансов/прочего — имеем значение для бухии и/или УУ;

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

    Reply
  3. hogik

    Если говорить о типовой ТиС – полностью согласен. А если говорить в целом, то при проектировании схемы базы данных надо соблюдать простое правило – вычислять надо только те значения, которые нужны НА ТЕКУЩИЙ МОМЕНТ. А те, которые требуются один раз в месяц – вычислять как рабочую величину именно один раз в месяц. И делать это в выходных формах, а не в “регистрах длительного хранения”.

    Reply
  4. CheBurator

    (3) ГП — универсальная штуковина и катит везде. Все прочее — придется «специализировать», как пример, например лекарства — там, например, списываемую себестоимость в конце месяца не посчитаешь… + для оперативного управления, например, ВСЕ ВРЕМЯ вычислять раскладку «себестоимости» может быть накладно, и проще держать ее по факту возникновения в регистрах… — итого: вываливаемся в специализированные нетиражируемые решения…

    + мысль следующая: добавив в регистр измерение «документ» можно писать для этого «документа» движения в любой момент, а не только самим «документом» — тут надо подумать… идея, имхо, перспективная…

    Reply
  5. poppy

    (2) по п.2

    Посмотри решения от hogik’a. Он отказался от ГП, создал математику и реализовал альтернативный движок.

    У него все регистры — «оперативные», но у тебя = не рыба, не мясо

    Reply
  6. poppy

    Изменение остатков задним числом без изменения Резервов и ЗаявокЗаказов = бяка.

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

    Reply
  7. CheBurator

    (5) > Посмотри решения от hogik’a.

    …ссылка?

    Reply
  8. CheBurator

    > Несложные манипуляции «задним числом» с остатками приведут к тому, что «оперативные» регистры потеряют свою актуальность и перестанут отражать действительную реальность.

    …а вот и нихренюшеньки! как раз наоборот!!! На текущий момент мои «оперативные» регистры будут отражать текущее состояние дел, ПРИЧЕМ С УЧЕТОМ ТОГО, ЧТО ПРОИЗОШЛИ ИЗМЕНЕНИЯ ОСТАТКОВ ЗАДНИМ ЧИСЛОМ. Что может быть:

    — остатков стало на ТА больше — ничего страшного не произойдет, ситуация НЕ УХУДШИТСЯ.

    — остатков на ТА стало МЕНЬШЕ — в худшем случае не сможем обеспечить требуемое кол-во резервов/заявок/заказов — ну так это и есть правда на ТА — часть из них скушана «взади»…

    Reply
  9. hogik

    (4)( Сhe Burashka)

    Если типовую ТиС не переделывать полностью под конечного пользователя (продавца, кладовщика, мастера производства и т.д.), а считать конечным пользователем бухгалтера то, действительно, получится “не рыба, не мясо”.

    (5)(poppy)

    И у нас проблем навалом. Иногда, я очень жалею, что я затеял эту полную переделку конфигурации. Думаю, мы “перегнули палку в другую сторону”. Система работает в режиме 24х7 уже восемь лет. Но, с каждым годом всё труднее и труднее учитывать новые пожелания пользователей. Потеряна гибкость, универсальность и “заменимость разработчика”… ;-(

    (6)(poppy)

    “»оперативные» регистры потеряют свою актуальность”

    Не потеряют – они же в апострофах. Как пример. Регистров “Резервов и ЗаявокЗаказов” не существует. Это реализуется простым перемещением на “склад резервов и заказов”. 😉

    (7)(Сhe Burashka)

    Ссылки нет. Могу только пригласить Вас к себе в гости.

    Reply
  10. CheBurator

    попутно еще одна фишка озвучу (я ее уже подымал) — достаточно интересно подумать над системой автораспределения поступления ТМЦ под необходимые заявки/резервы, КОГДА НЕХВАТКА НЕОБХОДИМОГО КОЛ-ВО ТОВАРА СТАВИТСЯ «В ОЧЕРЕДЬ» К ПОСТУПЛЕНИЮ ПРОСТЫМ ВЫВЕДЕНИЕМ РЕЗЕРВИРОВАНИЯ «В МИНУС» … — тут думать…

    Reply
  11. poppy

    (7)

    http://infostart.ru/profile/2905/projects/

    Здесь обсуждение (в комментариях)

    http://infostart.ru/blogs/166/?cp=all

    Reply
  12. CheBurator

    (9) В гости — это интересно… Тем более, что Владимир от Москвы недалеко.. Надо подумать над этим… было бы интересно поговорить, опытом поменяться… правда я сомневаюсь, что я что-то интересное смогу выдать…

    Reply
  13. CheBurator

    (11) в обсуждении коментов Ходжик сказал «Остатки сходятся» (Есть остатки (итоги) на реальных полках.) — это да, вопросов нет если это только торговля… для бухии важны «виртуальные» вчерашние кошельки/полки — что выгоднее — каждый раз тащить данные отчетом или вытаскивать из регисторв — хз… тем более, что схема хранения данных, описанная Ходжиком, «близка» к системе регистров остатков 1Сины (на беглый взгляд).

    Reply
  14. poppy

    (12)

    > Тем более, что Владимир от Москвы недалеко..

    Может я неправльно поняла, но Владимир в Москве?

    Я бы тоже в гости не отказалась… 😉 Хотя, также, выдать что-то вряд-ли интересное.

    Reply
  15. hogik

    (14)(Сhe Burashka)

    “я что-то интересное смогу выдать”

    Это и не требуется 😉 Я очень внимательно слежу за Вашими публикациями на данном сайте. А вот, сколько потребуется “сидеть” около нашей разработки – это вопрос. А типа, видео ролика от Олега по “Кассирочке” маловато будет. Кстати мы не во Владимире, а в 15-20 километрах от МКАДа.

    Reply
  16. O-Planet

    Смелое и новаторское. Это усегда гут. А если еще и работает, то вообще! Впрочем, важна идея прежде всего.

    Reply
  17. CheBurator

    Введение оси времени, сделанное 1Синой, порождает целую кучу казусов, которыми люди пытаются «потыкать в грязь лицом (ласково)», типичный пример (оттуда же):

    ..

    разберем простейшую ситуацию:

    1) введен приходный документ — 5 пар кирзовых сапог

    2) зарезервировали 4 пары для клиента

    3) обнаружили пересорт — 3 пары сапог и 2 пары тапочек, исправили задним числом приходник

    4) вопрос — достоверен ли резерв? в каком состоянии будут остатки после продажи?

    как отрабатывается данная ситуация?

    ..

    При этом забывается, что несмотря что ось времени есть — МАШИНЫ ВРЕМЕНИ НЕТ. И если обнаружен пересорт, то В ОБЩЕМ СЛУЧАЕ выход только один: ТЕКУЩИМ ВРЕМЕНЕМ «скорректировать» ТЕКУЩИЕ ОСТАТКИ и «СКОРРЕКТИРОВАТЬ» РЕЗЕРВЫ и ПРОЧИЕ «ОБЯЗАТЕЛЬСТВА» !!!___ПО ФАКТУ ОБНАРУЖЕНИЯ НЕСТЫКОВКИ___!!! ВСЕ!!! иначе — не бывает.

    ИНАЧЕ — только полная перерисовка всей АМБАРНОЙ КНИГИ с самого момента РЕГИСТРАЦИИ «НЕПРАВИЛЬНОЙ» записи. — а ведь амбарная книга-то прошита, пропечатана, и пронумерована на каждой странице. ВСЕ! ППЦ! никаких задним числом правок. Любая правка задним числом — иди на поклон к барину и проси разрешения…

    Reply
  18. CheBurator

    > Иногда, я очень жалею, что я затеял эту полную

    переделку конфигурации (фраза от Ходжика)

    .. вот!!! мой мелкий опыт показывает — очень во многих случаях (для ТОРГОВЫХ компаний) можно добиться работы только в ТА и в типовой ТиС — это требует в первую очередь дисциплины документооборота и выполнения обязательств поставщиков/покупателей. Примерное время приведения «бардака» в «порядок» — от полугода до года.

    Reply
  19. O-Planet

    Но по-моему, надо не типовую терзать, а давно пора свою писать по накопленному опыту и выставлять, как альтернативную. Кстати, можно у суппорта перекупить название «Апельсин», ведь оно к чебурашкам как раз напрямую относится. 😉

    Reply
  20. CheBurator

    (15) так что наклевывается поездка к Ходжику — если недалеко от МКАД… (по вопросам совместного заседания — спишемся в привате)

    Reply
  21. CheBurator

    (19) Главное, чтоб гвоздей вместе с апельсинами не было… 😉

    Reply
  22. CheBurator

    Писать альтернативную конфигу — можно попробовать, но совсем простенькую, типа количественного учета «для ларька»…

    Reply
  23. CheBurator

    > Но по-моему, надо не типовую терзать, а давно пора свою писать по накопленному опыту и выставлять, как альтернативную.

    ..неоднократная проработка этого вопроса на разных клиентах, которым «мне вот совсем ничего надо — совсем простой учет нужен», показывает что клиенту возможно понадобится и вот это, и вот это, а! да! это точно надо, я совсем забыл… и т.д. — в итоге практически весь функционал типовой ТиС… так что если ставить вопрос широко (на размах моих ух) — то надо сделать «вторую типовую ТИС» с «человеческим лицом» — а на это, боюсь, силенок у нас не хватит…

    Reply
  24. CheBurator

    …по хорошему что надо — в типовой ТиС четко по блокам разнести движения денег и движения ТМЦ, в т.ч. разнести это по разным последовательностям.

    … и ВООБЩЕ! ГЛУБОКОЕ ИМХО: следующий рывок имеет смысл делать в более явной блочности построения типовых конфиг (пусть даже в ущерб производительности)…

    Reply
  25. hogik

    (18)( Сhe Burashka)

    “можно добиться работы только в ТА”

    У нас это не получилось – пришлось отказаться вообще от этого, на мой взгляд, странного понятия. Организация, то у нас (по количеству пользователей) не мелкая – уже около 75 рабочих мест. И все в 1Су норовят войти…

    (19)(O-Planet)

    “свою писать по накопленному опыту”

    Ох. Сейчас, думаю, что и не надо. Нашу систему писали 1,5 человек, и всё пишем -пишем…

    Reply
  26. CheBurator

    …все куда-то срулили… я не Сруль, я — Чебурашка… пойду повтыкаю в экстремальное кино (посудить на Питерский фест надо) и спать через часок…

    Reply
  27. CheBurator

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

    … ясен пень, раздолбайство (в организации), ничем не лечиться… можно сгладить симпотомы, но плата за это — сидим «на игле» «нетипичной пневмонии»…

    Reply
  28. O-Planet

    Если говорить о программе для торгового концерна с кучей филиалов, то свою писать не надо. Я сталкиваюсь часто с средними и мелкими фирмочками, которые 70% ТиС не используют, но вынуждены отрабатывать (разные проекты, основные свойства и т.д.) По-нормальному, нужна махонькая прога для торг. организации с нормальным партионником, с приятным интерефейсом и с защитой от ввода задним числом (чтобы оно — излюбленная операция юзеров, поддерживалось, но все не портило). В ТиС есть предпосылки богатой аналитики, но иногда элементарное оказывается не реализовано. Пример — отчет по продажам ТМЦ. Узнать бы, кто придумал туда вместо склада МОЛ вставить! Самое прикольное, что этот МОЛ у всех либо проигнорирован, либо один. А потом просят: покажите продажи в разрезе магазинов. Приходится доки иногда за год перепроводить.

    Reply
  29. hogik

    (27)(Сhe Burashka)

    Про ТА можно долго говорить. Но самое лаконичное Ваше –“что несмотря что ось времени есть — МАШИНЫ ВРЕМЕНИ НЕТ”.

    “плата за это — сидим «на игле» «нетипичной пневмонии»…”

    Вот мы и платим. А если зарабатывать деньги заказами, то наше решение никуда не годиться. Так, – частное решение, хотя и работает в конкретной организации совсем не плохо.

    Reply
  30. CheBurator

    (28) Продажи в разрезе магазинов: юрлицо — одно, несколько фирм, каждая фирма = магазин.

    Reply
  31. poppy

    (28)

    > Я сталкиваюсь часто с средними и мелкими фирмочками, которые 70% ТиС

    > не используют, но вынуждены отрабатывать (разные проекты, основные

    > свойства и т.д.)

    Они что, мазохисты? ТиС нормально без проектов и основных свойств работает…

    Reply
  32. hogik

    (20)(Сhe Burashka)

    Кстати. Списаться в привате, средствами данного сайта, для меня проблематично – мозгов моих на это не хватает. Решил сегодня написать сообщение и обнаружил, что мне там куча писем пришла. В старой версии сайта мне приходили сообщения на реальную почту о том, что поступило сообщение в приват данного сайта. А теперь не приходят. И я не понимаю, как посмотреть свежие сообщения.

    Reply
  33. CheBurator

    (31) Проекты — это любимое средство многих! вот вам ище одна идея, которая существенно облегчит жизнь.

    — должноа быть возможность на любой док повесить любое количество маркеров-тегов (с предопределенными/любыми) значениями… ряд проблем/задач решался бы на раз (типовая задача: отметить и взять «на контроль» некоторые документы) — т.е. аналог свойств для документов (по образу свойств для справочников…) — И ТАКАЯ ПАРАДИГМА БУДЕТ БЛИЗКА ДЛЯ МАНАГЕРОВ!

    Reply
  34. CheBurator

    (32) мой мыло для контакта: e.meil@mail.ru

    Reply
  35. CheBurator

    nm[e на вас всех газировкой с сиропом (апельсиновым), отключаюсь… в выходные выходите на связь!!!! тогда можно продуктивно пообщаться!

    Reply
  36. O-Planet

    >> — должноа быть возможность на любой док повесить любое количество маркеров-тегов (с предопределенными/любыми) значениями…

    Идея эта не нова. Я такое сделал в одной фирме, только «навешиваю» на доки статьи расходов для внутреннего учета. И у мну в Документообороте они тоже есть, но ты говоришь сейчас о более общем. А вообще, маркеры на доки пора бы уже кому-то запатентовать… 😉

    Reply
  37. poppy

    (33)

    В восьмерочных конфигурациях это уже реализовано. Там документам можно назначить и свойства, и категории.

    Reply
  38. CheBurator

    (37) это хорошо…

    Reply
  39. Kurt

    Значит всего-то и осталось восьмёрочную конфигурацию «переписать» под семерку…. шучу.

    Reply
  40. hogik

    Начал изучать 1С 8.х и опять, как и при изучении 1С 7.7, задумался над фразами:

    “Факт проведения документа и необходимость поддержания актуальной последовательности документов на оси событий порождают…”

    “…отметка времени создается системой каждый раз при … проведении документа”

    Т.е. “ось событий” отражает работу оператора по вводу документа. Мне в торговле известен только один документ, где событие набивки документа соответствует реальной жизни – это чек ККМ. В остальных документах нет единого события, по которому можно построить ось событий и сопоставить ее с действиями операторов по набивки документов. Точнее, этих событий множество — дата первичного документа, дата отгрузки, дата прихода на склад, дата списания остатков (реально отгрузки), дата разрешения отгрузки и т.д. Но все эти даты не имеют никакого отношения к работе оператора и компьютера. Тогда зачем ЭТО?

    Reply
  41. CheBurator

    (40) УТ, как и ТиС в 7.7, к _процессу_ торговли имеет весьма отдаленное отношение…

    Reply
  42. vip

    (41) +1

    Reply
  43. CheBurator

    (42) НО! это — плата за универсальность (в какой-то мере).

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

    Reply
  44. tango

    (18)+(19) поясню согласие с обоими.

    Либо ТиС, либо своя с нуля самописка по хотелкам.

    Корежить типовую — самое гиблое дело. Для студентов.

    Reply
  45. CheBurator

    (44) Тут я не совсем согласен. Типовая ТиС вполне работоспособна в большинстве организаций в основном своем функционале (вот она выгода универсализма), грамотная «доточка» и скрытие ненужных/неиспользуемых возможностей — экономит кучу времени по написанию «нетленок»… Как раз хуже всего когда «студент» начинает корежить типовую под запросы клиентов, при этом очень слабо представляет собе логику и возможности типовой — не только в плане технической реализации, но и в плане МЕТОДИКИ применения… Для «штатных» ситуаций клиентов чаще всего приходится «подтачивать» взаиморасчеты в разрезе поставок/продаж… все остальное — если понадобилось, то, как правило, на фирме уже есть свой прог… (другое дело если прог — «вещь в себе» — вероятность того, что решения будут «кривые» — очень высока). На примере старой работы: (опт лекарства) — все доточки были сделаны на 95% внешними отчетами/обработками + минимум изменений в ключевых точках (по возможности с вызовом внешних обработок), в результате если студент «накатит» типовое обновление «не глядя» — такие клоуны встречаются — прога будет по-прежнему работоспособна с потерей некоего функционала…

    Reply
  46. hogik

    (40)

    “УТ, как и ТиС в 7.7, к _процессу_ торговли имеет весьма отдаленное отношение…”

    Это я понимаю 😉 Но и на других участках АСУ-па существует понятие первичный документ. Существует, для некоторых документов, “необходимая” хронология их обработки. Но на коробке продукта 1С: Предприятие написано “Сетевая”. Я это понимаю как – “многопользовательская”. И документы в систему могут поступать в произвольном порядке – ну, например, разделили операторы пачку документов между собой. И при вводе документов компьютерная “ось событий” теряет всякий смысл. Т.е. после ввода документов их надо в “монопольном” режиме расставить на ось. Но если критична последовательность операций, то это достигается другим способом. Например, если критично продавать конкретный товар конкретной накладной, то это партионный учет c ручным выбором партии в расходном документе. И какое это имеет отношение к взаимному расположению приходной и расходной накладной по компьютерной дате и времени? Т.е. средства обеспечения последовательности операций должна базироваться на самой сути этих операций. Или я чего-то не так понимаю?

    Reply

Leave a Comment

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