Копирование группы справочника с иерархией и элементами в другую группу




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

16 Comments

  1. Alex_E

    А просто взять и мышкой перетащить не судьба?

    Reply
  2. yegorovnv

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

    давайте не будем плодить плохие клоны.

    умение пользоваться методом Скопировать() похвально, рад за вас

    Reply
  3. fishca

    стандартного функционала разве не достаточно?

    Reply
  4. arhal-ya@yandex.ru

    (1) Alex_E,

    1. Пробовал в 8.1? Может у тебя судьба отличная от всех остальных пользователей 1с?

    2. Читай внимательнее тему, особенно слово «Копирование».

    Reply
  5. arhal-ya@yandex.ru

    (3) fishca,

    Еще раз — читаем слово «Копирование» в теме публикации.

    Reply
  6. Alex_E

    (4) Судьба у мня обычная. Переносить из группы в группу можно было ещё в 7.7, кнопочка соответственная была и в 7.7 и в 8.0 и в 8.1 и в 8.2. В 8.2 можно ещё и мышкой. Слово копирование в публикации — крутое слово. Для чего — непонятно 🙁 Может что бы создать несколько одинаковых элементов номенклатуры в разных папках?

    Reply
  7. arhal-ya@yandex.ru

    (2) rinatru,

    Не встречал.

    Во первых это простой оригинальный инструмент а не клон. Кстати, не увидел ссылку на аналог.

    Во вторых не претендует на универсальность типа выбора справочника — потому и делюсь задаром.

    По поводу «Скопировать()» — это пафос уставшего от своей значимости кодера 1С? Зачем тогда было вообще лезть в код если и так все знаешь и умеешь? Тем более в такой «плохой клон».

    Reply
  8. arhal-ya@yandex.ru

    (6) Alex_E,

    Слово копирование в публикации — крутое слово. Для чего — непонятно 🙁 Может что бы создать несколько одинаковых элементов номенклатуры в разных папках?

    Правильно, а если внимательнее почитать тему, то не только элементов, но и групп с учетом вложенной иерархии. Насчет «крутое» не знаю — слово как слово, меня особо не впечатляет:)

    Reply
  9. yegorovnv

    (7)

    я не лез в код.. просто предположил, что использовался метод Скопировать()…

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

    пафоса нет, просто рекомендация

    аналог вот здесь — >> http://infostart.ru/public/92395/

    специально потратил 2 минуты, чтобы найти аналог и показать его тебе

    Reply
  10. arhal-ya@yandex.ru

    (9) rinatru,

    пафоса нет

    ,

    специально потратил 2 минуты

    — … 🙂

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

    Собственно резюме:

    — для конечного пользователя лучше «аналог».

    — для кодера, сисадмина и прочих причастных к 1с не только поверхностно — лучше «мой плохой клон» потому как алгоритм раза в три проще и допиливать, соответственно, удобнее.

    Reply
  11. Roni

    Я тоже считаю что не аналог. А когда нужно скопировать более 1000 элементов мышкой пощелкать тяжеловато будет…

    Reply
  12. Ranika

    Спасибо! Просто, удобно 🙂

    Reply
  13. yuraskas

    Спасибо, помогло.

    Reply
  14. yuraskas

    Код не рабочий. Иерархия не сохраняется.

    Reply
  15. Yakudza1984

    Спасибо. Просто, удобно, ничего лишнего. Помогло.

    Reply
  16. nik389

    Иерархия не сохраняется

    Reply

Leave a Comment

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