Импорт данных в 1С (Универсальная обработка)




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

32 Comments

  1. корум

    (-1).

    1. Где описание?

    2. Какого формата должны быть файлы?

    3. ЧТО конкретно грузит отработка?

    Reply
  2. ..видимо подразумевается что Import77 и Export77 известны всем…

    Reply
  3. gidro

    Спасибо за обработку! только у меня после загрузки оборот приемника получился больше, чем оборот источника. Чем это вызвано? и ещё в обработке импорта нету опции «Восстанавливать последовательности документов», хотя в описании она есть. Подскажите, пожалуйста, где можно скачать import77.ert c этой нужной опцией?

    Reply
  4. volk

    Отличная обработка! Раньше постоянно использовал ExImDocs( спасибо Ankey), так как ничего путёвого не находил кроме неё, чтобы осуществлялась рекурсивная выгрузка-загрузка справочников. Но эта — ни в чём не уступает! По времени обработки данных сравнить не успел с ExImDocs, но в любом случае доволен результатом! Спасибо!

    Reply
  5. volk

    Хорошо-бы объединить Импорт и Экспорт в одну обработку, хотя это можно и самому сделать… Но всё-же! С наступающими всех!

    Reply
  6. Буду пробовать.

    Reply
  7. butakovms

    Огромное спосибо!!!

    Reply
  8. santilka

    Спасибки, обработка супер!!!

    Reply
  9. Alexsandr

    Спасибо. Как раз во время, именно сейчас понадобился большой перенос баз.

    Reply
  10. liwo

    Спасибо!!!

    Reply
  11. betafence

    бомба

    Reply
  12. armina2007

    Господа, извините новичка за наивный вопрос: но обработка export77 создавала файл выгрузки в dbf, а обработка import77 требует файла txt-((. Как это решить?

    Reply
  13. shelnat

    Мне понравилась. Спасибо. Единственное, при импорте добавляет документы иногда прошлых периодов.

    Reply
  14. zaic

    Странно, но за экспорт больше плюсов..

    Reply
  15. Olya_Poy

    У меня при открытии файла выдает ошибку — «Компонент v7plus.dll не найден .При создании объекта из компонентов C:Program Files1Cv77BINv7plus.dll (отсутствует CLSID)»

    Как исправить такую ошибку? 🙁

    Reply
  16. Душелов

    (15) regsrv32 v7plus.dll

    под администраторскими правами

    Reply
  17. Seon

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

    И показывать эту таблицу, по окончании либо при ошибках через исключение…

    Reply
  18. Seon

    При загрузке неплохобы видеть прогресс загрузки в процентах…

    Reply
  19. Seon

    Ужастно медленно загружает!!!!!

    за 2 часа обработано 2500 объектов!!! И это всего лишь справочники.

    блин.

    Reply
  20. Seon

    ТаблицаЗагруженныеОбъекты.УдалитьСтроку(ТекущаяСтрока+1);

    вот эта строка, работает очень медленно, к сведению.

    Зачем удалять эти строки?

    На крайняк можно сделать поле в таблице «строка помечена на удаление» и больше её не трогать!

    ЗЫЖ я загружаю более 90 000 объектов.

    Reply
  21. Мать Тереза

    меня это просто спасло. Снимаю шляпу.

    Reply
  22. D2008

    После указания тхт файла и запуска, пишет-«Не уазан формат файла загрузки». Где его указать? Или где почитать поподробнее как этим пользоваться? Заранее спасибо!

    Reply
  23. Volyana

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

    Файл обработки открывается в монопольном режиме программы: Файл > Открыть > (выбрать Import77.ert).

    Для Olya_Poy 22.12.2008 12:24:31.

    У меня в Vista при открытии тоже выдавало ошибку — «Компонент v7plus.dll не найден (отсутствует CLSID)». Проблема устранилась после того как удалил русские символы из пути, и в командной строке зарегистрировал дллку командой «regsvr32 C:..путь. .v7plus.dll. Хотя у тебя нету русских букв, поэтому просто в командной строке выполни команду «regsvr32 C:Program Files1Cv77BINv7plus.dll». Хотя эту команду лучше выполнить через батник, тогда решится возможная проблема с правами администратора.

    Reply
  24. chev

    Интересно. Посмотрю подробнее.

    Reply
  25. vovgun

    как мне перенести самописную конфу из 7.7 в пустую базу 8.2? Помогите пож-ста.

    Reply
  26. onyx

    меня это просто спасло. Снимаю шляпу.

    Reply
  27. validat

    Описание есть у файла Экспорт77. Автор почему-то сделал так. Вот описание и ссылка. Или в Другие ссылки автора, в самом низу. В общем скачивать нужно импорт и экспорт.

    ——-

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

    рожденной версией 7.7

    ——-

    Reply
  28. nvilku

    при загрузке данных Зик пишет: ТекущаяОперация=СоздатьОбъект(«Операция»);

    {D:1C_DATA!TEST!ОТЧЕТЫ В РАБОТЕIMPORT77.ERT(979)}: Неудачная попытка создания объекта (Операция)

    Reply
  29. Мать Тереза

    Медленно, но ведь работает.

    Reply
  30. olgahlynina

    Подскажите? пожалуйста «чайнику» пошагово — как настроить импорт хоть чего-нибудь из СЭДа в 1С-8 (экспорт нам настроили а импорт — нет). Сколько не пыталась настроить пишет : «Не найдено файлов, соответствующих настройкам обмена»

    Reply
  31. kotenok17_90

    Здравствуйте у меня тоже такой косяк: {С:БазыПробаIMPORT77.ERT(979)}: Неудачная попытка создания объекта (Операция). Как исправить, что сделать? Подскажите плиз…

    Reply
  32. Степанова Н.

    А для 8-ки подходит или нет.

    Reply

Leave a Comment

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