Работа со справочниками (перенос элементов)




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

17 Comments

  1. gubsky

    А где комменты или замечания??

    Reply
  2. gubsky

    Товарищи, ну че вы молча то скачиваете то??

    давайте хоть критику чтоль 🙂

    Reply
  3. poppy

    Хочешь критики? Пожалуйста…

    Чем тебе не устроили обработки с диска ИТС (objdel.ert и uchoice.ert)? ИМХО функционал тот-же.

    Reply
  4. gubsky

    так и знал, что подобный вопрос прозвучит 🙂

    uchoice.ert особо не юзал…. разве им можно переносить элементы из папки в папку???

    ну а в принципе просто хотелось самому написать.

    Reply
  5. gubsky

    упс….

    перезалил файлик, а счетчик сбросился…

    Reply
  6. Abadonna

    (5) НЕ перезаписал, а сначала старый удалил, а новый положил.

    А там честно написано, что сбрасывается… Надо было жать «Обновить»

    Reply
  7. gubsky

    ок. буду знать. спб

    Reply
  8. Delon

    Еще один камень в выбор профессионалов

    (3) — uchoice.ert с диска ИТС!

    Больше обработок похожых и разных!

    (2) Но есть и критика, тезка:

    Как здорово сработает НайтиСсылки(СЗ, ССЫЛ);

    для справочника с 300 000 и более элементов?

    Может лучше использовать F8QDR и F6QMR?

    И еще — желательно бы архивить обработки,

    не у всех ведь анлим…

    Reply
  9. gubsky

    (8) на счет архивить — учту на будущее.

    300 000

    хмм…

    на таких объемах не тестил, но намек понял:)

    извиняюсь за быть может глупый вопрос, но что такое: F8QDR и F6QMR ??

    Reply
  10. poppy

    (4)

    Можно…

    Reply
  11. VaRaS

    нормально

    Reply
  12. StadoAdama

    заюзал обработку под перенос из группы в группу, нашел один косяк… дописал одну строчку перед заполнением таблички…

    Спр.ИспользоватьРодителя(ИсхГруппа); так это получается несколько быстрее!

    Reply
  13. rasswet

    дописал, чтобы формировало таблицу, куда выводит всё что будет перенесено. без этого вообще работать не мог.

    иногда глючит при создании папки. не может новый код присвоить. пытается присвоить код имеющегося элемента и вылетает на Записать()

    ну а так вполне даже ничего.

    а главный глюк. не работает со справочников договоров, которые подчинены контрагентам. вот это бы дописать…но мне чёто лень разбираться..

    Reply
  14. Log_in

    при перемещении списком, замечательно было бы добавить опции:

    1. отметить все элементы списка

    2. снять отметку со всех элементов

    3. возможность использование выделения элементов из таблички с проставлением отметки у выделенных элементов.

    Спасибо.

    Reply
  15. Log_in

    нашел еще один косяк

    пытаюсь подправить нумерацию в справочнике где для кода отведено 5 знаков

    причем номера в существующем виде разбросаны от 1… до 99999, т.е. между номерами есть пропуски, в этом случае выдает ошибку

    «Код: 100001 не записан поверх старого кода: 99937

    …..

    Код: 00002 не записан поверх старого кода: 99995

    Перенумерация справочника «Номенклатура» завершена

    ЗафиксироватьТранзакцию();

    {D:DOC1COBRABOTKIBESTSDRENUM.ERT(549)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию»

    и номера не меняются

    Reply
  16. Log_in

    некорректное поведение при изменения размера диалогового окна, в частности когда увеличиваешь размер (по ширине и высоте) на вкладке «Перемещение списком», окошко со списком не меняется в размере, было бы удобнее если бы оно также увеличивалось.

    Reply
  17. ROM_1C

    Хорошая работа..

    а как сделать чтобы группу можна было выбирать на форме элемента справочника? У меня ошибка пишеться- «Объект не может быть перепозицирован»..

    Reply

Leave a Comment

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