<?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='\
Имеющиеся на портале обработки работают с объектами которые были помечены на удаления. Для данной обработки это не принципиально, она работает с выбранными объектами.
+ для почина
Но это не значит, что все хорошо. Для удаления связки документов — да, пожалуй. Но не любых объектов — там концов не найдешь потом.
инструментарий черного 1снега
ну, и для детачмента годится
(4)А если годится, плюс где?
(3) Обработка это инструмет и пользователь должен четко понимать, что он делает и для чего. Средствами винды каталог базы тоже удалить можно, но ведь это не значит, не стоит вообще файлы удалять.
(4) Расист 🙂 ? Чем для белых одинесников не подходит?
белые пусть с итсом работают и книжки читают
(5) шшшу-у-у-у-тттт
Скачивающие, не стесняйтесь, не нравится — ругайте.
Рекурсия — штука опасная, как бы он полбазы не поудалял 🙂
(10) 🙂 она такая. Внесу в описание обязательное создание архива, сколько не повторяй — все равно мало будет.
(10) Действительно. Может нужно сделать кнопочку «Проверка», чтобы перед удалением можно было просмотреть чего коснётся рекурсия.
(11) Обязательно. И в форме напиши большими красными буквами 😉
(12) Это не проблема. Сейчас доработаем.
(14) Ну так и хде?
(15)
Работа не дает. 5-го мая выложу. Может раньше если праздники позволят 🙂
К тому же переделывать там много, так как писал обработку для себя. А для себя 50% всего в голове держишь. Теперь переделаю, сделаю более универсальной.
(17) Ну ладно. Будем ждать. Вот ещё идейка — добавь возможность сохранения удалённых объектов в файл (думаю для таких целей формат XML лучше всего подойдёт), ну и, естественно, возможность восстановления из этого файла 😉
(17) Доброго времени суток, Yuri_Dnp! Недавно понадобилось в ЗиКе почистить Шаблоны проводок. Неправильно завели План счетов в 1С Бух-рии для Бюджета — на 5 Юрлиц вместо 5 Балансодержателей), экспериментировали с выгрузкой Плана счетов в ЗиК тоже 5 раз, в итоге ссылок по разным счетам и субконто в ЗиКе оказалось около 3800 шт. Ну и не все удаляются теперь, из-за ссылок. Теперь сижу, вручную всё чищу. Так что очень нужная вещь ваша обработочка, успехов Вам!
Выложил новую версию обработки. Получилась гораздо более объемная. Удобнее она стала или нет судить Вам. Появилась возможность удалять в разделенном режиме помеченные на удаление объекты со всеми их ссылками. Пользоваться обработкай надо осмотрительно. Предварительно создав архив.
Очень приветствуются отзывы. Просьба потестироваать, потому как самому все протестировать сложно.
(18)
Переделал. Просьба потестировать. Выгружать и загружать объекты имхо уже лишнее. Созданого архива должно хватить.
(19)
Очень приятно, что моя обработка пригодилась. Спасибо за отзыв
(20) Это может пригодиться для того чтобы посмотреть когда и что удалялось!
(21)
Видел. Есть маааленькая разница по сравнению с этой и другими подобными обработками — они не позволяют удалять объекты если на них есть ссылки. Моя обработка может удалить объекты, ссылки на них и все ссылки на ссылки рекурсивно. Так что функционал у них разный.
(22)
может быть в следующей версии. И так программирование пришлось вспоминать 🙂
Постараюсь через пару дней выложить помощь по обработке. До этого, надеюсь на Ваши отзывы по поводу функционала и интерфейса.
(20) Да и не всегда удобно восстанавливать из архива. Например, если удалить несколько (достаточно большое количество) объектов и один из них понадобиться восстановить, то восстановление архива потребует повторного удаления остальных объектов. Да, на это можно ответить, что, мол-де, пользователь сам отвечает за свои действия и так далее, но если это будет реализованно, то это может очень помочь…
(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. В код даже не заглядывал. Как-нибудь посмотрю…
1. Смоделировать ошибку не смог.
2. Согласен. Доделаю
3. Согласен. Надо будет доработать
4. Сложный вопрос 🙂 Захотелось мне так
5. Согласен.
6. Согласен. Будет описание. Кстати оно в кратком виде есть в самой обработке. Стандартное описание к внешнему отчету.
7. Тоже не смог смоделировать
(26) По поводу ошибок — возможно они возникают только на моей конфигурации (самостоятельная разработка на основе бухгалтерии и, чуточку, оператиного учёта). Однако же данная разработка должна работать и на ней. Ну да ладно оттестирую, коли время будет. О результатах сообщю. А описание в файле «readme.txt» действительно есть и действительно в «кратком виде», таком кратком что как-то «маловато будет»(с) ;D (для этой разарботки). Что-то вроде: «Это ракета. Она может летать и взрываться. Может быть запущена с наземной установки, самолёта, лодки. А как запускать, куда лететь, когда взрываться и взрываться ли вообще думайте сами.» 😉 Ну да ничего страшного. Бывает и хуже.
Молодец, что продолжаешь поддержку своей разработки! Удачи!
(27)
Она не зависит от конфигурации.
А описание я имел в виду другое 🙂 в режиме «предприятия» Помощь -> Описание
(28)
Ну так я и говорю должна работать. Ничего… Заставим 🙂
Тоже хорошо, но в «readme.txt» тоже добавь, раз уж оно там есть 😉
Качаю сегодняшнюю версию…
обработка очень нужная. У меня удалились несколько документов без проблем.
А потом программа стала выдавать ошибку:
//тзП.Заполнить( тзИ, НачСтрока + 1, тзП.КоличествоСтрок(), Кол);
Неверный идентификатор колонки!//
Объясните кто-нибудь, пожалуйста, что я делаю не так? :(((
(30)
Сейчас этим занимаюсь. Подождите пожалуйста.
(30)
Вы указывали в настройках программы для объектов-родителей «Непосредственно удалять вместе со ссылками» ?
(29)
Версию пока не менял. Изменю сегодня.
Выложил подправленную версию.
Исправлены некоторые ошибки. Изменился интерфейс.
(34) Спасибо большое, но это все-таки не все :(. При попытке передать неудаленные объекты для обработки программа выдает служебное сообщение: //тзОтбора.УдалитьКолонку( «Добавленная» );
RECURSIONDEL_V1.1.ERT(549)}: Неверный идентификатор колонки!//
Посмотри, пожалуйста, что там опять стряслось?
(35)
Исправил. Скачивайте
О-о-о! Я смотрю тут много чего поменялось 🙂 Сейчас посмотрим…
(36) СПАСИБО БОЛЬШОЕ!!!!!!
МОЛОДЧИК!!!!
Одна только картинка бабы с ружом меня уже повеселила!!!
Очень нужен такой вот скрипт но под 8.1. Надо удалить более 800 позиций номенклатуры из базы. 🙁 🙁 🙁
(40) romanovkv,
Вроде видел подобные обработки под 8.2, попробуй поищи ни infostart’e
А за данную обработку автору отдельное спасибо!
Всем, привет.
Не могу удалить номенклатуру, т.к. она используется в другом документе, а в частности в Установки цен номенклатуры.
Нужно удалить номенклатуру, не удаляя данный документ (Установки цен номенклатуры)
Подскажите поможет ли мне данная обработка?
Обработка должна работать 1С 8.2 Управление торговлей, редакция 11.0 (11.0.7.13)
Док = СоздатьОбъект(спДоки.ПолучитьЗначение(спДоки.ТекущаяСтрока(),));
{H:ЛУБОВАRECURSIONDELRECURSIONDEL.ERT(187)}: Неудачная попытка создания объекта — выдает такую ошибку..
что я делаю не так?
Есть ИБ в которой ведется 3 организации. требуется уничтожит все документы связанные с одной организацией. Я правильно понимаю, что с помощю Вашей обработки, достаточно будет выбрать нужную организацию и нажать кнопку, две … и ву-а-ля!?!?!?
Судя по переписке то — что нужно. Плюс.