Универсам (Полная версия). Обработка для универсального обмена данными через OLE




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

36 Comments

  1. CheBurator

    хотелось бы поиметь комментарии по обработке:

    0. какая версия выложена?

    1. как переносит реквизиты неопределенного вида?

    2. насколько успешно работает по переносу операций и проводок, в т.ч. и с субконто неопределенного вида;

    3. как работает по переносу реквизитов-строк неограниченной длины;

    …+ есть еще вопросы-замечания.. будем обсуждать после ответов на эти..

    Reply
  2. cs25

    Юзаю именно эту версию (2.6). Помогла не раз, без особых багов (не без ошибок конечно) !!! За это Павлу Шевченко ОГРОМНОЕ СПАСИБО !!!

    Reply
  3. avhrst

    Если срочно нужно перенести данные из одной конфигурации в другую — идеальная программа. А устраиваться на работу тестировщиком для Сhe Burashka я не намерен.

    Reply
  4. Tarlich

    Провереная годами !!! +

    Reply
  5. Cifer

    (3) Тестировщиком не для Che Burashka, это ж ТВОЯ обработка, а не его!

    Он же тебя не просит свои протестировать!

    За свою не можешь ответить?

    Reply
  6. Ёпрст

    (5) вряд ли Он автор …

    Reply
  7. Попытка1С

    Отличная вещь, давно юзаю!

    Reply
  8. avhrst

    Обработка не моя, просто выложил полную версию очень нужного инструмента.

    А если у rw.spb и Ёпрст есть ч получше тогда выкладывайте а не критикуйте …

    Reply
  9. константин

    Не знаю, кто автор, но за то что выложили именно эту обработку я бы поставил +100,

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

    Reply
  10. константин

    Добавлено к (9) Автор данной разработки © Шевченко Павел

    это полная демо-версия (настроек море, но сохранения их для последующей загрузки нет) , переносит корректно

    Reply
  11. CheBurator

    не, я, конечно, могу продемонстрировать кривизну данной обработки в некоторых моментах… но оно мне надо — чужие обработки тестировать зазря…?

    Reply
  12. micus

    Версия не полная и не последняя. Это 2.6, есть 2.7. Там обработок больше. 😉

    Для переноса на скорую руку — оч удобная вещь.

    Reply
  13. artbear

    Все-таки УниверсаЛ или УниверсаМ ? 🙂

    Reply
  14. Ёпрст

    (8) Если выкладываете не свой код, то указывайте об этом в заголовке ВСЕГДА.

    Reply
  15. Altez
  16. константин

    С Che burashka, вполне согласен, кривизна в любой обработке есть, в этой обработке основной минус, что она не делает синхронизации по внутренним кодам элементов справочника или того же документа, а также через чур нудная настройка, но переделывать ее не буду, проще свою разработать, если одинаковые конфигурации

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

    а субконто на некоторых счетах садятся не правильно(нарушен порядок), после переноса стоит перевыбрать счет, аналитика субконто очищается.А если Аналитика разная, тогда они вообще пустые. В настройках, я не нашел где установить это соответствие.

    Reply
  17. константин

    Лучьше пользоваться и юзать версию 2.7, там хотябы сохранение настройки есть и настройка изменена в корне.Попробую сделать переброс между разными конфами,

    потом напишу, какие ошибки встретил…

    Reply
  18. alabama1976

    +gud

    Reply
  19. константин

    версия 2.7 Перенос документов и справочников по ссылкам общим объемом 70000док.

    с учетом транзакции длился около 18 часов, после переноса при беглом просмотре обнаружилось следующее: %10 перенеслись пустые, остальные 90% вроде правильно заполнены, однако статус документов (только записано) в настройках проведение, пометки и прочая ерунда, галки стояли.

    У кого много времени, а также нет возможности разрабатывать что-то свое, может пользоваться этой обработкой смело, может результат быть у Вас и другим…

    При переносе обработка работала на Server 8ядер, 16гектар оператив.

    Reply
  20. brr

    Гм, есть же РокетЛаунчер?

    Reply
  21. b_ravil_t

    Лучьше пользоваться версией 2.7.

    При минимальной доработке можно переносить движения документов.

    Несколько предприятий переносил из одной базы в другую в среднем 2-3 года работы бухов. Правда были косяки с повторным проведением перенесенных документов (задваивались проводки), странно только что только у пары видов документов (ввод ОС и еще что то было, сейчас уже не помню 3-4 года назад было)

    Reply
  22. sml

    Полезная вещь, пользую 2.6 более 4 лет. В основном использовал для переноса документов и справочников между торговыми базами схожих конфигураций. 2 года назад надо было пересчитывать остатки задним числом (менялась схема закупки с купленного на принятого на реализацию). При этом рабочая база не останавливалась а в копии была проделана эта хрень, а при помощи этой чудесной обработки переносились документы из рабочей в переделанную. В момент Х, когда базы были засинхронизированы по документам, рабочая база была заменена на переделанную.

    Reply
  23. AddUserNew

    Спасибо автору.

    Обработка корректно сделала то что нужно было (перенос операций).

    По переносу, ИМХО, это лучшее чем пользовался.

    Reply
  24. jsofthome1

    ОГРОМНОЕ СПАСИБО !!!

    Reply
  25. strong_l

    А как ей пользоваться? Мне надо выгрузить только сотрудников из УСН в ЗиК!

    Reply
  26. Andzhej

    не коректно переносит рекв. типа «Вид расчетов» — 2-е одинаковые базы 7.7 (скуль и дбф): перенос из скуль в дбф

    сами выди расчетов сопоставленны коректно

    т.е. может ввобще не перенести или перенести частично (в справочнике такие рекв. частично не переносить, в доке вообще не переносит).

    Reply
  27. Sergey_Murzinov

    Практически все перенеслось корректно, хорошо

    Reply
  28. manslay

    Одна из лучших обработок

    Reply
  29. TrinitronOTV

    списбо автору, забираю

    Reply
  30. taste

    подскажите как правильно задать настройки, чтоб перенести поступление от определенного поставщика?

    Reply
  31. tgnike

    Очень удобно!

    Спасибо большое!!

    Reply
  32. post279

    Пригодилось, автору респект

    Reply
  33. hate

    Единственная обработка которая адекватно перекидывает инфу из одной базы в другую.

    Reply
  34. corsar4ik

    Попробую обработку, отпишусь о результатах у себя. Как видно по постам более ранним, у всех всё по-разному.. Это уже 4ая обработка в моем поиске истины 🙂 Как знать..

    Reply
  35. 2011b11

    Спасибо за обработку, но мне интересно если я из Бухгалтерии УСН 7.7, в Бухгалтерии УСН 7.7 переносить документы , интересно поможет, или только из разных?

    Reply
  36. kiser

    Какая же она полная?! А где сохранение настроек?

    Reply

Leave a Comment

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