Обмен между идентичными конфигурациями 81




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

31 Comments

  1. slaviksoft

    а чем отличается от стандартных обработок с ИТС «Выгрузка и загрузка в XML»

    Reply
  2. WKBAPKA

    и чем лучше конвертации? при обмене между идентичными конфигурациями КД настраивается за 5 минут

    Reply
  3. Leshka_m

    Обработка на ИТС, как я понял, выгружает по внутреннему идентификатору и она не подтягивает объекты, на которые есть ссылки.

    КД — на любителя, если обмен простой, не будешь же каждый новый релиз лазить в конвертацию и править изменившиеся реквизиты. А тут обработка сама метаданные перебирает.

    Reply
  4. Моха

    (3) Потягивает, если кномпочку там нажать ;). Шерстит все зависимости ;).

    А че там править реквизиты, они подтягиваются из самой же КД.

    Reply
  5. luns

    (4) Точно. Подтверждаю. Сам пользовался обработкой с ИТС — все отлично переносит.

    Reply
  6. Yashazz

    Что-то разлюбил я прямые обмены… КД рулит!

    Reply
  7. almas

    из той-же оперы. мое решение. Только не загружаю а выгружаю… http://infostart.ru/public/60617/

    Leshka_m молодец. С КД — на любителя — недоработана до сих пор(думаю еще долго…)

    Выгрузка и загрузка в XML — рулит, но если добавил реквизит хрен перенесешь без виляния.

    Моха,luns,Yashazz я вас люблю, 😀 ваш оптимизм заражает.

    Reply
  8. vgna06

    Скажите, а из ПРОФ в базовую отбработка перенесет?

    Reply
  9. dmitry.karih
    almas пишет:

    Выгрузка и загрузка в XML — рулит, но если добавил реквизит хрен перенесешь без виляния.

    (8) vgna06,

    Reply
  10. rabanik

    Хотел спросить:

    «ВНИМАНИЕ!!! Недоработано:

    1. Не пробовал переносить справочники с иерархией в пределах подчинения.

    2. Отсутствует проверка на уникальность кодов в справочнике, поэтому при переносе полагайтесь на свой страх и риск.»

    а что, это так трудно сделать? Или я что то не догоняю ? )))

    Reply
  11. Tur_gad

    Спасибо за обработку простой понятный интерфейс, ни чего лишнего. СПАСИБО БОЛЬШОЕ!

    Reply
  12. AlexO

    (1) slaviksoft, (2) WKBAPKA,

    в типовом обмене между идентичными переносится по внутреннему идентификатору — если база «родная», то ничего, а если нет — идут сплошные задвоения всего и вся.

    Через КД — полно ошибок при переносе (просто не переносит), а разбираться, что там понаворочено…

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

    В общем, не все так просто с этими переносами.

    Reply
  13. WKBAPKA

    (13) AlexO,

    если про 8.x то ничего подобного там не происходит… настроить можно не только по внутреннему идентификатору…

    там есть моменты, просто надо разобраться, что касается обменов по правилам обмена есть один косяк, по крайней мере для украинских конфигураций, описан вот тут http://forum1c.com.ua/index.php?topic=181.0

    Reply
  14. AlexO

    (14) WKBAPKA,

    ничего подобного.

    Косяков еще масса.

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

    Если переносить в чистую базу — все переносится, и поиск объектов идет тот, который задашь. А если конфы одинаковые, но базы — разные, то все задваивает.

    Видимо, из-за тогоо, что сначала поиск идет по идентификатору, а уже потом по полям, а отключить поиск по идентификатору — нельзя, т.к. тогда и по полям отключается.

    И не говорите мне ничего про «готовить не умеете» — я этих конвертаций понаписал кучу уже ))

    Reply
  15. WKBAPKA

    (15) AlexO,

    может мы о разных конвертациях говорим?

    если бы я не работал с конвертацией, я бы не писал бы тут… мне эта конвертация уже скоро снится будет…

    Видимо, из-за тогоо, что сначала поиск идет по идентификатору, а уже потом по полям, а отключить поиск по идентификатору — нельзя, т.к. тогда и по полям отключается.

    да что за глупости?

    И не говорите мне ничего про «готовить не умеете» — я этих конвертаций понаписал кучу уже ))

    оно и видно 😉

    Reply
  16. AlexO

    (16) WKBAPKA,

    мне эта конвертация уже скоро снится будет

    мне тоже

    да что за глупости?

    хорошо, как настраиваем поиск объектов?

    Reply
  17. AlexO

    (0) автор, укажите, пожалуйста, в описании, что обработка переносит ИЗ настраиваемого источника В открытую базу, а то ни из описания, ни из вида обработки понять невозможно — что-куда переносит, пришлось в код лезьть…

    Reply
  18. WKBAPKA

    (17) AlexO,

    можно по внутреннему идентификатору, или включить поиск по полям…

    ПЫ СЫ: если бы там задваивалось, как пишите, то обмен по правилам обмена можно было бы выкинуть в топку…

    кстати, через конвертацию написаны правила для обмена типовых конфигураций между собой, типа УТП и Розницы, перенос остатков из бухии 7.7 в 8.х… ни разу не сталкивался с мифическими задвоениями

    Reply
  19. AlexO

    (19) WKBAPKA,

    можно по внутреннему идентификатору, или включить поиск по полям…

    вот именно.

    Ставишь поиск по полям, галочки поиска ИНН-КПП-Наименование в разных сочетаниях — никакого эффекта.

    Задваивает все основные справочники.(19) WKBAPKA,

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

    я вам о том же и пишу — если ОДНА И ТА ЖЕ БАЗА (идентификаторы у объектов те же) — ищет и по реквизитам, если нет (разные идентификаторы объектов, но конфа одна) — то, как у меня, не ищет, а задваивает.

    то обмен по правилам обмена можно было бы выкинуть в топку.

    обмен по правилам обменивается с объектами в другой базе, созданными из единой базы-источника с теми же идентификаторами.

    Если объекты другие (например, вручную занесете обного и того же контрагента в обеих базах) — то обмен создаст в приемнике еще одного такого же.

    Эксперимент я не ставил (обмена нет), но полтора дня ушло на попытки нормально вписать такие объекты.

    Так что выкидывать или нет обмен между типовыми — решайте сами 🙁

    Reply
  20. AlexO

    Доработал у себя версию — ввел настройки поиска объектов по Коду, Наименованию, ИНН (для контриков). Можно искать и/или по кодам, и/или по наименованию, если Контрагенты — то и/или по ИНН.

    Поиск работает как при переносе справочников, так и при переносе документов, независимо.

    Reply
  21. WKBAPKA

    ну что вы за глупости пишите? обмен по правилам это обмен по правилам… это когда я могу настроить обмен между совершенно разными конфигурациями… а синхронизация справочников может быть по УИД или по ключевым полям…

    то что вы пишите, пришлите мне плж. правила обмена, я их загружу и посмотрю настройки

    Reply
  22. AlexO

    (22) WKBAPKA,

    все это прекрасно работает, когда чистая база. Или догружается в базу, созданную из этой же.

    Перегружал неоднократно, много раз уже. Видно там вам — не видно — значения не имеет ))

    Постоянно то одно, то другое задваивалось. А вот эта последняя выгрузка из УПП в УПП (базы физически не родственны) — задваивается очень много всего, контрагенты — в первую очередь.

    Reply
  23. WKBAPKA

    Загрузил правила… посмотрел настройки по контрагентам

    Вопрос первый: зачем в ИНН делать строку неограниченной длинны?

    ИНН и КПП разные коды и ИНН я так понимаю, что может повторяться у разных контрагентов или нет?

    у нас тут такого понятия как КПП нет

    Reply
  24. WKBAPKA

    и почему на закладке «Правила выгрузки» пусто?

    Reply
  25. AlexO

    (24) WKBAPKA,

    Вопрос первый: зачем в ИНН делать строку неограниченной длинны?

    а разница какая? есть 10, есть — 12. Или правила не могут верно обработать неогр длину? 🙂

    ИНН и КПП разные коды и ИНН я так понимаю, что может повторяться у разных контрагентов или нет?

    У меня поиск стоит по ИНН, по КПП — это если филиалы (с одним ИНН). Но это к делу не относится — у меня по КПП вообще нет поиска.

    (25) WKBAPKA,

    и почему на закладке «Правила выгрузки» пусто?

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

    Reply
  26. WKBAPKA

    у тебя поиск по внутреннему ИД, а если не найден, тогда уже по ИНН

    что касается ИНН, я вообще не понимаю смысла, зачем делать его неограниченной длинны если он сам по себе не может быть больше 12-14 символов… теоретически, конвертации должно быть пофиг, но вот при вводе этого самого ИНН пользователями могут быть косяки, типа пробелы слева справа… и это нужно учитывать… если у тебя двояться контрагенты то это одно из двух: либо одинаковые ИД либо ИНН… т.к. у меня вот тут http://infostart.ru/public/56988/ очень активно используется обмен, причем по внутреннему ИД, я не верю, что у тебя просто так задваиваются элементы…

    Reply
  27. AlexO

    (27) WKBAPKA,

    у тебя поиск по внутреннему ИД, а если не найден, тогда уже по ИНН

    да, я знаю, о чем неоднократно писал выше :))

    И проблема именно в этом — в любом случае идет поиск по ИД (а нужно — только по ИНН). Это и Универсальном обмене данными, и в ВыгрузкаЗагрузкаДанных.

    что касается ИНН, я вообще не понимаю смысла, зачем делать его неограниченной длинны

    это он только в обмене неогр длины — в справочнике он ограничен.

    (27) WKBAPKA,

    могут быть косяки, типа пробелы слева справа

    если ИНН меняется от 10 до 14 — то пробелы могут быть в любом случае, если не написать спецмеханизм для контроля за этим.

    если у тебя двояться контрагенты то это одно из двух: либо одинаковые ИД либо ИНН

    как раз задвоение из-за того, что не находит ни по ИД, ни по ИНН.

    причем по внутреннему ИД, я не верю, что у тебя просто так задваиваются элементы

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

    очень активно используется обмен

    У вас первый раз как был обмен? в чистую базу привнеслись объекты другой конфигурации. ПРИВНЕСЛИСЬ.

    И потом уже только они же сравнивались при дальнейших обменах с объектами в исходной базе по ИНН, Наименованию и прочая…

    Reply
  28. WKBAPKA

    (28) AlexO,

    1. ну дык просто снимаешь галку «Искать объект приемника по внутреннему идентификатору …» и оно автоматически будет искать по указанным полям 😉

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

    3. Если переменной длины, то спец. механизмы писать не надо

    4. см. п.1 🙂

    5. Не важно,как первый обмен был осуществлен, либо через первичную выгрузку, либо как пустая база… ошибки нужно искать в правилах обмена

    Reply
  29. AlexO

    (29) WKBAPKA,

    ну дык просто снимаешь галку «Искать объект приемника по внутреннему идентификатору …» и оно автоматически

    … и оно автоматически погасит все остальные галки поиска :))

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

    возможно, я в КД несколько раз уже обновлял конфигурацию…

    Не важно,как первый обмен был осуществлен,

    ну как это — не важно..

    вся разница в том — с чего началась база: либо с этой же базы, либо — те же контрагенты (с теми же ИНН, наименованиями), но вносились вручную (или из другой базы).

    Reply
  30. AlexO

    вот такие пироги с этим КД… это не считая черепашьей скорости 🙁

    Reply
  31. lees

    скачивал как пример подключения по com

    Reply

Leave a Comment

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