Удобное удаление помеченных объектов (управляемое приложение)




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

28 Comments

  1. mr.Kot

    Вот я всегда думаю, почему в стандартной обработке удаления не сделали подобный функционал? Почему там всё максимально скудно в этом плане.

    Reply
  2. chmv

    Внешне удобно. Когда будут деньги — обязательно скачаю

    Reply
  3. lsd_777

    РегистрСведенийКлючЗаписи.ПоставщикиНоменклатуры не удаляет!

    Reply
  4. jenekmegachuvak

    (3) lsd_777, записи независимых регистров сведений чистятся руками

    Reply
  5. lsd_777

    (4) jenekmegachuvak, подскажите как?

    Reply
  6. jenekmegachuvak

    (5) lsd_777, при двойном клике на строке, относящейся к записи РС, откроется форма списка регистра с установленным курсором на нужной строке. Здесь можно удалить эту запись нажатием клавиши ‘Delete’ (если конечно на форме не запрещено это программно).

    Reply
  7. lsd_777

    (6) jenekmegachuvak, Розница 2.1, не прокатывает такое действие, пишет «Удаление записи регистра выполняется из ее карточки», а где она, непонятно!

    Reply
  8. Xershi

    (7) lsd_777, при удалении объекта регистр должен сам удалиться или у вас конфа самописная?

    Reply
  9. lsd_777

    (8) Xershi, типовая, абсолютно ничего не трогано!

    Reply
  10. Xershi

    (9) lsd_777, ковыряйте связи, в конфе смотри поиском по ссылке…

    Reply
  11. BlackStar

    (1) В Бухгалтерии 3.0 встроенная обработка довольно удобна, работает не монопольно, позволяет повторять удаление, позволяет выполнять замену значений

    Reply
  12. jenekmegachuvak

    (7) lsd_777, добавил в обработку команду по удалению записей независимых РС и очистки констант. Это должно помочь в Вашем случае.

    Reply
  13. sobeyko2008

    на УТ 8.2 не работает чтоли?

    Reply
  14. jenekmegachuvak

    (13) sobeyko2008, работает на любой конфигурации в режиме управляемых форм. А в чем проблема?

    Reply
  15. Wesley

    Не работает в УНФ 1.4. Пишет «Нет элементов, которые можно удалить», хотя выбрал все что было. Скрин ниже.

    Reply
  16. Paul_Nevada

    (15) — аналогично, автор!

    Reply
  17. Skam123

    на 1С 8.3 (8.3.5.1517) редакция 1.0 (1.0.32.7) не запускается и ни чего не пишет!!! Что делать???

    Reply
  18. davdykin

    Самое главное что универсальная обработка, без проблем запустилась на самописной конфе.. по крайней мере пока.

    Reply
  19. si4

    На БП 3 под 8.3 не работает

    Выдает ошибку где то на стадии поиска ссылок

    Недопустимое значение параметра (параметр номер 1)

    Reply
  20. si4

    На БП 3 под 8.3 не работает

    Выдает ошибку где то на стадии поиска ссылок

    Недопустимое значение параметра (параметр номер 1)

    Reply
  21. kitaevay

    Доработал эту обработку под 8.3.6, например (отказ от модальности, если вы понимаете о чём я)

    Reply
  22. belochkaNN

    Спасибо. Помогла обработка.

    Reply
  23. sertak

    Спасибо за обработку, все не доходили руки самому сделать для нетиповой конфиги.

    Reply
  24. sertak

    (21) Спасибо, скачал. Скачал также исходную у автора, считаю, что только так будет честно.

    Reply
  25. fixin

    Работает в докобороте под уф для справочников юзал, спасибо

    Reply
  26. user1009602

    Не удаляются обработкой договора и заказ клиента почему-то, хотя ранее всю реализацию к этим заказам удалила. Может у кого есть обработка на удаление этих объектов, буду очень благодарна.

    Reply
  27. ILNIK

    Автору спасибо

    Reply
  28. Gmix

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

    в строке 947 Процедура Процедура ОпределитьВозможностьУдалиенияОбъекта(

    Нужно исправить:

    Метаданные.РегистрыСведений.Содержит(Стр.Метаданные)
    И Строка(Стр.Метаданные.РежимЗаписи) = «Независимый» Тогда

    На

    ИначеЕсли Метаданные.РегистрыСведений.Содержит(Стр.Метаданные) Тогда
    Если Строка(Стр.Метаданные.РежимЗаписи) = «Независимый» Тогда
    // Проверим ведущие измерения
    Б_Ведущее=Ложь;
    Для каждого Изм Из Стр.Метаданные.Измерения Цикл
    Если Изм.Ведущее И Стр.Данные[Изм.Имя]=Объект Тогда
    Б_Ведущее=Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если НЕ Б_Ведущее Тогда
    ВозможноУдалить = Ложь;
    КонецЕсли;
    КонецЕсли;

    Показать

    Тогда будет удалять если измерение регистров с этим объектом является ведущим.

    В противном случае ни чего не дает удалить особенно если включены обмены данными и все объекты в регистре СоответствияОбъектовИнформационныхБаз.

    Reply

Leave a Comment

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