Работа с УРБД




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

53 Comments

  1. iov

    Хочу на 7.7.

    Reply
  2. oberonm

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

    Reply
  3. ABTOP

    Не работает, не выбирается узел.

    Reply
  4. mykolap

    Да, слетела типизация реквизита с узлом.

    Исправил.

    Reply
  5. margosha80

    {Форма.Форма(48)}: Ошибка при вызове метода контекста (УстановитьГлавныйУзел): Недопустимое значение параметра (параметр номер ‘1’)

    ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);

    Я хотела сделать базу главной

    Reply
  6. mykolap

    (5) Чтобы база стала главной — надо снимать признак главного узла, а не устанавливать. Если у базы нет главной — тогда она главная.

    Reply
  7. margosha80

    В том то и дело. Если я ставлю на главный узел и нажимаю «Установить главный узел» ничего не происходит

    Reply
  8. margosha80

    Я на 1.6.15.6 пробую

    Reply
  9. mykolap

    (8) Надо нажимать не «Установить признак главного узла», а «Снять признак главного узла». «Установить» применяется чтобы снова сделать базу подчиненной.

    Reply
  10. margosha80

    Гениально. Если бы могла поставить 2 плюса, то поставила бы!!!!!!

    Reply
  11. cdb

    Большое спасибо за обработку. Мне понравилась.

    Reply
  12. lyzhenko.irk

    Нет кнопки выполнить…. что делать…?

    Reply
  13. Pivovar

    + , для себя еще добавил очистку регистрации изменений для определенного узла

    Reply
  14. mykolap

    (12) Кнопка выполнить не нужна. Для выполнения действий предназначены соответствующие кнопки. Аватар обновил.

    Reply
  15. mykolap

    (13) Обновил обработку. Если узел выбран — будет очистка только по выбранному узлу, если узел пустой — очистка по выбранному плану обмена.

    Reply
  16. MegaMouse

    Сегодня попробую на бух 2,0 — отпишу

    Reply
  17. MegaMouse

    Бух 2,0. Продвинутые юзеры удалили центральную базу.

    Что осталось — отвязал от УРИБ , опять настроил с нуля. полет нормальный.

    Спасибки

    Reply
  18. ostrovskii_a

    нормально работает УТ 10.3

    Reply
  19. ILYA1C

    очень удобно, спасибо

    Reply
  20. VasilevaHelen

    Спасибо, очень удобная обработка, пригодилась.

    Reply
  21. PereYP

    на КА 1.1.14 отработала отлично,спасибо

    Reply
  22. mkobzancev

    норм разработочка — помогает при небольшом допиливании под нашу упп измененную

    Reply
  23. dimisa

    Спасибо автору — удобная штука

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

    (не через стандартную процедуру выгрузки базы)

    очень удобно и экономит массу времени

    Reply
  24. annhv

    Спасибо, часто пользуюсь…

    Reply
  25. nurislam

    Удобная и нужная обработочка.Спасибо

    Reply
  26. Artemuch

    Отлично попробуем. Уже весь форум просмотрел это наиболее полная орбработка для манипуляциями с периферийными узлами. Автору спасибо.

    Reply
  27. ZigSit

    Хорошая и нужная обработка.

    Спасибо.

    Reply
  28. soba

    (23) dimisa,

    Можно поподробнее про копирование? Физическая копия базы а затем привязка к планам? А что, разве у базы нет ID ?

    Reply
  29. vprus

    Великолепная обработка. Постоянно ей пользуюсь.

    Reply
  30. white125

    Очень помогла обработка. Спасибо

    Reply
  31. klel

    Хорошая штука нуна призадуматься о её использовании!!=) 5+ спасибо за разработку дружище

    Reply
  32. damiron

    Хорошо, так же можно подумать про кнопку выгрузки или копирования базы

    Reply
  33. kondrat1C

    а есть вариант под 8.1?

    очень нужно

    Reply
  34. mykolap

    (33) kondrat1C,

    В самой публикации есть изначальный вариант, без суффикса 82, он под 8.1.

    На главной страничке отображается файл по умолчанию, по умолчанию конечно же я сделал под 8.2.

    Нажмите кнопку «Просмотреть и скачать все файлы»

    Reply
  35. bassz

    это мне поможет

    ситуация такая

    нужно из центральной базы сделать подчиненную и запустить между ними обмен

    допустим на филиале разворачиваю самый свежий бекап основной базы

    как из основной базы сделать дополнительную ?

    Reply
  36. MegaMouse

    (35)Вопрос сумбурный несколько… А что Вы собственно хотите?

    Сделать так чтоб 2 и более офиса работали как-бы в разных базах и в тоже время видели доки созданные другим офисом???

    Тогда типовой РИБ(УРБД) , а вот когда ЭТО заглючит — берете данную обработку и пытаетесь все исправить.

    Почитайте описание — иногда помогает.

    Reply
  37. bassz

    хочу сделать подчиненную базу из бекапа SQL основной базы

    так получится ?

    Reply
  38. Stas-ch

    Может я в чем не разобрался — прошу помощи. Надо быстро сделать подчиненный узел.

    Последовательность выполненных действий в УТ 10.3.13.2:

    1. Открыл демо базу — там есть два узла Центральный офис (помечен зеленой точкой как главный) и Магазин.

    2. Сделал для Магазина базу стандартным образом — узел Магазин помечен зеленой точкой, Центральный — красный.

    3. Сделал копию Центральной базы, запустил эту обработку. Выбрал план обмена Полный, Узел — Магазин.

    4. Нажимаю кнопку Очистить регистрацию изменений, Установить главный узел.

    Проверяю — Магазин стал красный, и Центральный офис — остался с зеленой точкой (типа он главный).

    Мне то надо наоборот.

    5. Нажимаю Снять признак главного узла. Все возвращается обратно, как было сразу после копирования.

    6. Выбираю Центральный узел — Снять признак главного — ничего не происходит.

    7. Нажимаю Установить главный узел — получаю ошибку

    {Форма.Форма.Форма(55)}: Ошибка при вызове метода контекста (УстановитьГлавныйУзел)

    ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’)

    Что я делаю не так и какая последовательность действий для быстрого создания подчиненного узла?

    Reply
  39. Stas-ch

    Попробовал вручную изменить наименование узлов — поменял местами наименование и номер у главного и магазина — вроде все заработало. Надеюсь правильно все сделал?

    Reply
  40. dr555

    скинте плиз на почту dr555@list.ru

    Reply
  41. Jogeedae

    велосипед. минуснул бы, да $m не хватает.

    Reply
  42. MegaMouse

    (41) Всплыла фраза из рекламы :»А Вы его кушать пробовали???».

    Минусанул бы Вас ,Jogeedae, да както жалко… и не денег.

    mykolap , через полгодика ждем для 8.3 -))

    Reply
  43. Jogeedae

    (42) MegaMouse,

    во-первых, каюсь — реакция была бы никакой, если бы увидел 2009 год сразу.

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

    в-третьих, тут есть неплохой вариант типовой.

    в-четвертых, давайте, жалейте меня.

    Reply
  44. MegaMouse

    (43) Такой развернутый ответ с конкретикой мне нравится больше.

    в 2009 наверное альтернативы небыло, или это решение мне лично понравилось.

    в-четвертых : Спасибо, зарядили позитивом на день — пойду поработаю.

    Всем спасибо, ХОРОШЕГО НАСТРОЕНИЯ и УДАЧИ!!!

    Reply
  45. Odinsov

    Спасибо, пригодилось

    Reply
  46. sly_ter

    Маленький вопрос. У меня есть центральная база и куча периферийных, в центральной мне надо внести небольшие изменения без передачи изменений в периферийные. Мне надо запустить обработку и выбрать «снять признак главного узла», а после внесения изменений «установить главный узел»? Слетят ли планы обмена, нужно ли будет их заново создавать?

    Reply
  47. mykolap

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

    Контроль на уровне каждого сообщения обмена.

    Основное назначение обработки было восстановление идентичности конфигурации в рамках УРБД в случае когда такая рассинхронизация произошла в результате какого то сбоя.

    Включение возможности редактировать конфигурацию имеет смысл именно для подчиненного чтобы в него загрузить конфигурацию идентичную главному.

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

    Всегда это проделывал успешно (десятки раз проделывал).

    Reply
  48. Lokwud

    Спасибо

    Reply
  49. element

    у Вас не будет такой же в арсенале для 8,0 / ут 10.2 … ??

    если что в личку пишите element_ooo@mail.ru

    Reply
  50. orehova123

    метод DESIGNER /ResetMasterNode не работает, начиная с платформы 8.3.7, выпадает в ошибку backend.dll

    Reply
  51. Butenko_sn

    (50) orehova123,

    Подстава! Действительно не работает! Пришлось базу периферийную из центральной заново восстанавливать!

    Reply
  52. dveri27

    а эта программа поможет сделать из переферийной центральную и настроить обмен с переферийной?

    Reply
  53. MegaMouse

    Exxx .. Перечитайте всю ветку — там есть ответ.

    А если коротко — НЕТ

    НЕХ редактор Вам в руки и гугль в помощ.

    Reply

Leave a Comment

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