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




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

45 Comments

  1. Yuri_Dnp

    Имеющиеся на портале обработки работают с объектами которые были помечены на удаления. Для данной обработки это не принципиально, она работает с выбранными объектами.

    Reply
  2. Арчибальд

    + для почина

    Reply
  3. Арчибальд

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

    Reply
  4. shooting detachment

    инструментарий черного 1снега

    ну, и для детачмента годится

    Reply
  5. Арчибальд

    (4)А если годится, плюс где?

    Reply
  6. Yuri_Dnp

    (3) Обработка это инструмет и пользователь должен четко понимать, что он делает и для чего. Средствами винды каталог базы тоже удалить можно, но ведь это не значит, не стоит вообще файлы удалять.

    Reply
  7. Yuri_Dnp

    (4) Расист 🙂 ? Чем для белых одинесников не подходит?

    Reply
  8. shooting detachment

    белые пусть с итсом работают и книжки читают

    (5) шшшу-у-у-у-тттт

    Reply
  9. Yuri_Dnp

    Скачивающие, не стесняйтесь, не нравится — ругайте.

    Reply
  10. Talim

    Рекурсия — штука опасная, как бы он полбазы не поудалял 🙂

    Reply
  11. Yuri_Dnp

    (10) 🙂 она такая. Внесу в описание обязательное создание архива, сколько не повторяй — все равно мало будет.

    Reply
  12. Antoska

    (10) Действительно. Может нужно сделать кнопочку «Проверка», чтобы перед удалением можно было просмотреть чего коснётся рекурсия.

    Reply
  13. Antoska

    (11) Обязательно. И в форме напиши большими красными буквами 😉

    Reply
  14. Yuri_Dnp

    (12) Это не проблема. Сейчас доработаем.

    Reply
  15. Antoska

    (14) Ну так и хде?

    Reply
  16. Yuri_Dnp

    (15)

    Работа не дает. 5-го мая выложу. Может раньше если праздники позволят 🙂

    Reply
  17. Yuri_Dnp

    К тому же переделывать там много, так как писал обработку для себя. А для себя 50% всего в голове держишь. Теперь переделаю, сделаю более универсальной.

    Reply
  18. Antoska

    (17) Ну ладно. Будем ждать. Вот ещё идейка — добавь возможность сохранения удалённых объектов в файл (думаю для таких целей формат XML лучше всего подойдёт), ну и, естественно, возможность восстановления из этого файла 😉

    Reply
  19. AS108

    (17) Доброго времени суток, Yuri_Dnp! Недавно понадобилось в ЗиКе почистить Шаблоны проводок. Неправильно завели План счетов в 1С Бух-рии для Бюджета — на 5 Юрлиц вместо 5 Балансодержателей), экспериментировали с выгрузкой Плана счетов в ЗиК тоже 5 раз, в итоге ссылок по разным счетам и субконто в ЗиКе оказалось около 3800 шт. Ну и не все удаляются теперь, из-за ссылок. Теперь сижу, вручную всё чищу. Так что очень нужная вещь ваша обработочка, успехов Вам!

    Reply
  20. Yuri_Dnp

    Выложил новую версию обработки. Получилась гораздо более объемная. Удобнее она стала или нет судить Вам. Появилась возможность удалять в разделенном режиме помеченные на удаление объекты со всеми их ссылками. Пользоваться обработкай надо осмотрительно. Предварительно создав архив.

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

    (18)

    Переделал. Просьба потестировать. Выгружать и загружать объекты имхо уже лишнее. Созданого архива должно хватить.

    (19)

    Очень приятно, что моя обработка пригодилась. Спасибо за отзыв

    Reply
  21. Abadonna
  22. Antoska

    (20) Это может пригодиться для того чтобы посмотреть когда и что удалялось!

    Reply
  23. Yuri_Dnp

    (21)

    Видел. Есть маааленькая разница по сравнению с этой и другими подобными обработками — они не позволяют удалять объекты если на них есть ссылки. Моя обработка может удалить объекты, ссылки на них и все ссылки на ссылки рекурсивно. Так что функционал у них разный.

    (22)

    может быть в следующей версии. И так программирование пришлось вспоминать 🙂

    Постараюсь через пару дней выложить помощь по обработке. До этого, надеюсь на Ваши отзывы по поводу функционала и интерфейса.

    Reply
  24. Antoska

    (20) Да и не всегда удобно восстанавливать из архива. Например, если удалить несколько (достаточно большое количество) объектов и один из них понадобиться восстановить, то восстановление архива потребует повторного удаления остальных объектов. Да, на это можно ответить, что, мол-де, пользователь сам отвечает за свои действия и так далее, но если это будет реализованно, то это может очень помочь…

    Reply
  25. Antoska

    (23) Ну вот:

    1. Добавь на вкладке «РЕЗУЛЬТАТ» для табицы «Объекты для обработки» кнопочки «++ Д» и «++ С» (по аналогии с «— Д» и «— С») и открывшиеся, после выбора вида, списки документов и справочники не должны закрываться при выборе элемента, т. е. осуществляется подбор. А кнопочку «+» можно либо вообще удалить, либо сделать так чтобы при выборе элемента список закрывался (ведь логичнее предположить что при нажатии на одиночный знак + должен происходить выбор одного элемента). Здесь также укажу на ошибку:

    «тзОтбора.Выгрузить( тзП, 1, тзОтбора.КоличествоСтрок(), «эл»);

    {Z:SOFT1CINFOSTART.RURECURSIONDEL_V1.1RECURSIONDEL_V1.1.ERT(344)}: Номер за пределами значения!»

    и это при том что я добавил кнопочкой «+» элемент с таблицу «Объекты для обработки». Да и выбранный мной элемент исчез 🙁 Замечу что с элементами добавленными кнопкой «/ ЗАПОЛНИТЬ ТАБЛИЦУ СОГЛАСНО ОТБОРОВ /» подобного не случалось.

    2. Кнопочки «НАЗАД» и «ДАЛЕЕ» должны всё-таки становиться неактивными при достижении граничных «локаций» формы, чтобы не вводить в заблуждение пользователей 🙂

    3. Попробуй как-нибудь отделить объекты которые выбрал пользователь для удаления в таблице «Объекты для обработки» и те которые выбрала программа по нажатии «ОБРАБОТАТЬ».

    4. Почему все буквы (на кнопках) в верхнем регистре?

    5. Да и насчет проверки — я всё-таки думаю нужно выводить табличку, в которой постараться красиво показать какие объекты удаляются, какие выбранны пользователем, а какие программой, найденные ссылки и т. д.

    6. По поводу настройки — не совсем понятно что означает «По сколько объектов(ссылок) удалять:». Думаю это как-то связано с уровнем погружения в рекурсии и при значении 0 объекты найденные рекурсией не удаляются? Да и не совсем понятно что такое «Объекты родители». Впрочем, эти проблемы могут быть решены подробным описанием программы. Да и в этом описании необходимо будет договориться о терминах используемых в программе, что бы избавить пользователя от обучения методом проб и ошибок как можно больше.

    7. И на последок ошибочка во время поиска ссылок (кнопка «ОБРАБОТАТЬ»):

    «тзСсылок.Выгрузить( тзП, 1, тзСсылок.КоличествоСтрок(), «Ссылка»);

    {Z:SOFT1CINFOSTART.RURECURSIONDEL_V1.1RECURSIONDEL_V1.1.ERT(348)}: Номер за пределами значения!» и поиск завершился 🙁 Ситуация выбором элемента такая же как и в п. 1

    P.S. В код даже не заглядывал. Как-нибудь посмотрю…

    Reply
  26. Yuri_Dnp

    1. Смоделировать ошибку не смог.

    2. Согласен. Доделаю

    3. Согласен. Надо будет доработать

    4. Сложный вопрос 🙂 Захотелось мне так

    5. Согласен.

    6. Согласен. Будет описание. Кстати оно в кратком виде есть в самой обработке. Стандартное описание к внешнему отчету.

    7. Тоже не смог смоделировать

    Reply
  27. Antoska

    (26) По поводу ошибок — возможно они возникают только на моей конфигурации (самостоятельная разработка на основе бухгалтерии и, чуточку, оператиного учёта). Однако же данная разработка должна работать и на ней. Ну да ладно оттестирую, коли время будет. О результатах сообщю. А описание в файле «readme.txt» действительно есть и действительно в «кратком виде», таком кратком что как-то «маловато будет»(с) ;D (для этой разарботки). Что-то вроде: «Это ракета. Она может летать и взрываться. Может быть запущена с наземной установки, самолёта, лодки. А как запускать, куда лететь, когда взрываться и взрываться ли вообще думайте сами.» 😉 Ну да ничего страшного. Бывает и хуже.

    Молодец, что продолжаешь поддержку своей разработки! Удачи!

    Reply
  28. Yuri_Dnp

    (27)

    Она не зависит от конфигурации.

    А описание я имел в виду другое 🙂 в режиме «предприятия» Помощь -> Описание

    Reply
  29. Antoska

    (28)

    Ну так я и говорю должна работать. Ничего… Заставим 🙂

    Тоже хорошо, но в «readme.txt» тоже добавь, раз уж оно там есть 😉

    Качаю сегодняшнюю версию…

    Reply
  30. els

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

    А потом программа стала выдавать ошибку:

    //тзП.Заполнить( тзИ, НачСтрока + 1, тзП.КоличествоСтрок(), Кол);

    Неверный идентификатор колонки!//

    Объясните кто-нибудь, пожалуйста, что я делаю не так? :(((

    Reply
  31. Yuri_Dnp

    (30)

    Сейчас этим занимаюсь. Подождите пожалуйста.

    Reply
  32. Yuri_Dnp

    (30)

    Вы указывали в настройках программы для объектов-родителей «Непосредственно удалять вместе со ссылками» ?

    Reply
  33. Yuri_Dnp

    (29)

    Версию пока не менял. Изменю сегодня.

    Reply
  34. Yuri_Dnp

    Выложил подправленную версию.

    Исправлены некоторые ошибки. Изменился интерфейс.

    Reply
  35. els

    (34) Спасибо большое, но это все-таки не все :(. При попытке передать неудаленные объекты для обработки программа выдает служебное сообщение: //тзОтбора.УдалитьКолонку( «Добавленная» );

    RECURSIONDEL_V1.1.ERT(549)}: Неверный идентификатор колонки!//

    Посмотри, пожалуйста, что там опять стряслось?

    Reply
  36. Yuri_Dnp

    (35)

    Исправил. Скачивайте

    Reply
  37. Antoska

    О-о-о! Я смотрю тут много чего поменялось 🙂 Сейчас посмотрим…

    Reply
  38. els

    (36) СПАСИБО БОЛЬШОЕ!!!!!!

    Reply
  39. gin256

    МОЛОДЧИК!!!!

    Одна только картинка бабы с ружом меня уже повеселила!!!

    Reply
  40. romanovkv

    Очень нужен такой вот скрипт но под 8.1. Надо удалить более 800 позиций номенклатуры из базы. 🙁 🙁 🙁

    Reply
  41. emptyteam

    (40) romanovkv,

    Очень нужен такой вот скрипт но под 8.1. Надо удалить более 800 позиций номенклатуры из базы.

    Вроде видел подобные обработки под 8.2, попробуй поищи ни infostart’e

    А за данную обработку автору отдельное спасибо!

    Reply
  42. maratcom

    Всем, привет.

    Не могу удалить номенклатуру, т.к. она используется в другом документе, а в частности в Установки цен номенклатуры.

    Нужно удалить номенклатуру, не удаляя данный документ (Установки цен номенклатуры)

    Подскажите поможет ли мне данная обработка?

    Обработка должна работать 1С 8.2 Управление торговлей, редакция 11.0 (11.0.7.13)

    Reply
  43. Maks86

    Док = СоздатьОбъект(спДоки.ПолучитьЗначение(спДоки.ТекущаяСтрока(),));

    {H:ЛУБОВАRECURSIONDELRECURSIONDEL.ERT(187)}: Неудачная попытка создания объекта — выдает такую ошибку..

    что я делаю не так?

    Reply
  44. mr_best_23rus

    Есть ИБ в которой ведется 3 организации. требуется уничтожит все документы связанные с одной организацией. Я правильно понимаю, что с помощю Вашей обработки, достаточно будет выбрать нужную организацию и нажать кнопку, две … и ву-а-ля!?!?!?

    Reply
  45. gull22

    Судя по переписке то — что нужно. Плюс.

    Reply

Leave a Comment

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