Удаление объектов и битых ссылок из конфигурации




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

99 Comments

  1. igormiro

    Обработка Удаление объектов. (Работает в управляемом приложении).

    Гораздо лучше, чем стандартная, экономит много времени.

    Перейти к публикации

    Reply ↓
  2. sergeypv

    При удалении битых ссылок регистров сведений:

    {Форма.Форма(355)}: Ошибка при вызове метода контекста (Записать): Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Цены номенклатуры)

    НЗ.Записать();

    по причине:

    Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Цены номенклатуры)

    Reply ↓
  3. igormiro

    Все исправил, скачивайте.

    Reply ↓
  4. ASV

    Подскажите плиз, в чем отличие если стоит галочка «Удалять через «Удалить объекты»

    Reply ↓
  5. mr.Kot

    Вот почему, почему! Почему 1С не сделает удаление объектов с возможностью отбора, ведь это же так просто и так нужно. Спасибо за обработку 🙂

    Reply ↓
  6. spisyshkin

    Спасибо за обработку! Вы молодец!

    Reply ↓
  7. smirnoffs

    А можно ли удалить часть устаревшей номенклатуры, при условии, что в документах установки цен и, возможно, чеках есть ссылки на элементы номенклатуры?

    Reply ↓
  8. Ibragimov

    Огромнейшее спасибо за обработку, регулярно выручает в нашем нелегком деле! 🙂

    Reply ↓
  9. Anna1

    У нас сейчас вовсю идет внедрение УПП 8.2, обработкой пользуюсь постоянно на протяжении всего внедрения, очень удобно: в любой момент можно удалить из базы ненужные документы,почистить справочники. Большое спасибо!

    Reply ↓
  10. maikl_len

    Спасибо за обработку! Вы молодец!

    Reply ↓
  11. asg1975

    Работает ли контроль ссылочной целостности? Удаляет через Пометку удаления или Полностью? Чем лучше УниверсальныеПодборИОбработкаОбъектов.epf? На вопрос «Подскажите плиз, в чем отличие если стоит галочка «Удалять через «Удалить объекты»» тоже не увидел ответа. Автор вы где?

    Reply ↓
  12. igormiro

    Работает, если установлен монопольный режим.

    Если есть ссылки удалять не будет.

    В сообщениях будет видно где используется объект.

    Reply ↓
  13. igormiro

    (10) asg1975,

    Удалять через «Удалить объекты» есть такая процедура в конфигурации. Её использую. там можно проверять на ссылочную целостность.

    Reply ↓
  14. asg1975

    Не сочтите за назойливость, но в чем выигрыш по сравнению с универсальной от 1С «УниверсальныеПодборИОбработкаОбъектов.epf»?

    Reply ↓
  15. igormiro

    (13) asg1975, Моя обработка еще кроме работы с объектами ссылками работает с регистрами сведений.

    И ещё удаляет битые ссылки во всех регистрах.

    Reply ↓
  16. vamleshka

    А что означает «Удаление из любых регистров пустых ссылок»? Очень бы хотел чтобы была возможность удаления объектов, если в них присутствует «Битые ссылки». Это вообще возможно написать?

    Reply ↓
  17. igormiro

    (15) vamleshka, Да возможно принципе, это реализовано на вкладке удаление битых ссылок.

    Reply ↓
  18. Razrabotchik_www

    Уважаемый, igormiro. Вы можете пожалуйста добавить в свою обработку след. функцию:

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

    Просто после использования вашей обработки у меня сложилось неоднозначное впечатление и я не знаю, что поставить: «+» или «-» (честно говоря, сначала хотел поставить «-«).

    Дело в том, что я поставил удаляться документы реализации за 3 месяца с контролем ссылочной целостности. Обработка вроде начала работать (в области Служебных сообщений появилась надпись, что началась обработка группы документов реализации), но у меня за целую ночь удалилось всего лишь 6 документов (!) за первое число первого месяца и всё!

    Я так до конца и не понял — делала ли вообще эта обработка удаление документов или нет.

    Буду премного благодарен если вы все же добавите эту функцию (она кстати есть в типовой обработке), т.к. ваша обработка выглядит достаточно заманчива в плане удобства использования.

    Заранее спасибо!

    Reply ↓
  19. stel1985@mail.ru

    Спасибо за обработку. Очень полезная

    Reply ↓
  20. Razrabotchik_www

    Автор, пожалуйста ответьте мне. Очень нужно знать.

    Reply ↓
  21. igormiro

    (19) Razrabotchik_www, Сейчас у меня времени нет. Добавлю как смогу.

    Reply ↓
  22. Razrabotchik_www

    (20) спасибо за быстрый ответ! 🙂 Ставлю плюс за хорошую обработку.

    Reply ↓
  23. igormiro

    (21) Razrabotchik_www, Функционал добавил, качай и проверяй

    Reply ↓
  24. Razrabotchik_www

    (22) проверил. Не знаю в чем проблема… 🙁 У меня до сих пор во время процесса удаления не отображаются детальные записи (какой объект в данный момент был или не был удален). Детальные записи были отображены только после завершения удаления.

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

    Очень вас прошу, пожалуйста добавьте функцию (или же объясните незнающему как ее увидеть/включить если она уже есть).

    Заранее огромное спасибо!

    Reply ↓
  25. Kometa

    Обработка классная! У меня нагородили юзеры ненужные элементы в справочнике, другие юзеры удалили эти ненужные элементы. А в доках остались ссылки. Обработкой подправляла хвосты, сейчас права всем закрыла, чтобы огород не высаживали в 1С.

    Reply ↓
  26. orsprog

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

    Reply ↓
  27. zhleonid8

    Респектую, но ещё ни одно удаление не приносило столько пользы сколько приносит проблем,

    хотя бывают исключения. Автор, кроме удаления, добавь и восстановление:)

    Reply ↓
  28. happyden

    Выложите версию для 8.1 раз уж заявляете что поддерживается 8.1?

    Reply ↓
  29. AnotherSide

    Спасибо за обработку. Особенно пригодилась возможность удалять по видам — полезная вещь для больших баз.

    Если бы еще «вкрутить» сюда механизм удаления средствами SQL (скриптики…), цены бы не было!

    З.Ы.: и версию для 8.1, пожалуйста. Не все еще перешли на 8.2)

    З.З.Ы.: под 8.1, на самом деле переводится за 5 минут) Но! Мне кажется, было бы полезным добавить возможность выбора сразу нескольких видов справочников, документов и т.д.

    Reply ↓
  30. AnotherSide

    Кстати, мне кажется, что в вариант удаления без применения метода УдалитьОбъекты(), тот к-ый в цикле, было бы целесообразно добавить строчку вида «Объект.ОбменДанными.Загрузка = Истина»… Ибо процесс удаления ускоряется в десять раз, особенно у док-ов со множеством вариантов движений по регистрам — запись лишняя по регистрам обрубается.

    Reply ↓
  31. VitaliyPovod
    Ibragimov пишет:

    Огромнейшее спасибо за обработку, регулярно выручает в нашем нелегком деле! 🙂

    Целиком и полностью поддерживаю!

    Reply ↓
  32. igormiro

    (29) AnotherSide, Полностью согласен в новой версии учту.

    Reply ↓
  33. vkt

    Хотел удалить записи в регистре сведений. Установил отбор, заполнил таблицу удалений. А кнопочки «Выполнить удаление» — нет.

    Reply ↓
  34. igormiro

    (32) vkt, Ошибку исправил. Если будут еще ошибки пиши.

    Reply ↓
  35. igormiro

    Качайте новую версию обработки об ошибках сообщите!!!

    Reply ↓
  36. _LEV_

    Спасибо, скачаем — заценим! Может и предложения появятся 😉

    Reply ↓
  37. net7wolf
    happyden пишет:

    Выложите версию для 8.1 раз уж заявляете что поддерживается 8.1?

    Согласен. если нет под 8.1 так и убрать токовые ссылки.

    Reply ↓
  38. igormiro

    (36) net7wolf, Для 8.1 только старая версия. Второй файл.

    Reply ↓
  39. igormiro

    (27) happyden, Для 8.1 только старая версия. Второй файл.

    Reply ↓
  40. rozer

    Вопрос: Есть <объект не определен…> в таблицы последовательности то как в этом случае поступит обработка?

    Reply ↓
  41. igormiro

    (39) rozer, <объект не определен…> это битая ссылка. Попробуй просто восстановление последовательности сделать.

    Reply ↓
  42. igormiro

    (39) rozer, Добавил функционал в обработку удаление битых ссылок из последовательностей. Попробуй.

    Reply ↓
  43. rozer

    (41) спасибо!

    Reply ↓
  44. rozer

    (41) сорри но не увидел в 8.1 🙁

    Reply ↓
  45. igormiro

    (43) rozer, Добавил и под 8.1, выполнятся может долго, так как будет восстанавливать последовательность документов.

    Reply ↓
  46. rozer

    (44) немного не то… восстановление здесь не поможет. Воспользовался этим http://infostart.ru/public/62857 — переделал на 8.1

    Reply ↓
  47. igormiro

    (45) rozer, Ты не понял, моя обработка делает тоже самое что и http://infostart.ru/public/62857, только после удаления она корректно восстановит последовательность документов.

    Reply ↓
  48. rozer

    (46) спасибо, но восстановление последовательности мне в «центральной» базе РИБ не надо. Надо просто было исправить косяк.

    Reply ↓
  49. Ibragimov

    спасибо!

    Reply ↓
  50. DimitrT

    Спасибо — полезно попробовать — может будут идеи по доработке…

    Reply ↓
  51. serjpsv

    В этой обработке можно установить фильтр по названию удаляемых документов?

    Reply ↓
  52. serjpsv

    Крутая обработка! Спасибо

    Reply ↓
  53. serjpsv

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

    У меня на ЗУП 8.2 он не работает

    Reply ↓
  54. igormiro

    (52) serjpsv, Индикация не работает на управляемых формах. На обычных формах только пи включении флага отображать индикатор.

    Reply ↓
  55. igormiro

    Обновление обработки.

    Обработка выполняется быстрее. Улучшен алгоритм работы с контролем ссылочной целостности.

    Reply ↓
  56. Inetguru

    Уважаемый автор, если возможно добавьте такой функционал: восстановление из выбранного файла сохранения базы выбранного объекта данных (на выбор давать только не существующие в оригинале базы и измененные по сравнению с ним) со всеми вытекающими-восстановление или изменение всех связанных объектов. Перед операцией желательно предварительно показать что произойдет детально, возможно даже отобразить наподобие окна сравнения конфигураций с двух сторон оригинальный объект и тот что станет после восстановления. Если будет заменен документ, то показать какие именно реквизиты документа претерпели изменения. Возможно отдельно выделить восстановление битых ссылок в оригинальной базе.

    Reply ↓
  57. kobol

    Огромное спасибо, выручил на 5+

    Reply ↓
  58. AlexO

    (46) так восстановление последовательности можно отключить, если не нужно?

    Reply ↓
  59. olgadogi

    Использовала для чистки базы, все прошло очень удачно. Большое спасибо

    Reply ↓
  60. igormiro

    (57) AlexO, Пока нельзя, поле праздников добавлю отключение

    Reply ↓
  61. Ranika

    Спасибо, очень порадовал скриншот с подробным описанием ))))

    Reply ↓
  62. Igly

    (59) Так что там насчет отключения восстановления последовательности, удалось сделать? Или тут еще старая версия? Уже везде вокруг наступило «послепраздников» ))

    Reply ↓
  63. igormiro

    (61) Igly, Скачивай, появилась настройка, отключения восстановления последовательности, проверь должно работать.

    Если нет то напиши.

    Reply ↓
  64. Signal

    Скажите, а на управляемые формы не планируете перевести?

    Reply ↓
  65. igormiro

    (63) Signal, Обработка полностью работает на управляемых формах, по умолчанию основная форма управляемая. Только не отображаться индикатор.

    Reply ↓
  66. igormiro

    (63) Signal, См 2 рисунок Форма управляемая. Если что то не работает то пишите.

    Reply ↓
  67. OlegrVasil

    Очень полезная обработка. Спасибо автору и за «живую» реакцию в том числе.

    Reply ↓
  68. Igly

    Где можно почитать в правилах (вообще, где ссылка на главной на правила сайта?) про методику учета местной «валюты»? Почему происходит списание со счета за каждое скачивание (например как здесь списалось, и за вариант 81, и за вариант 82)?

    Reply ↓
  69. Signal

    (65) Скажите пожалуйста, а возможность удалять не используя монопольный режим, будет реализована?

    Reply ↓
  70. igormiro

    (68) Signal, Без монопольного режима — реализовано, только без контроля ссылочной целостности.

    Если с контролем ссылочной целостности, то только в монопольном режиме (ограничения платформы).

    Reply ↓
  71. Katish7

    Не могу скачать обработку, посылает на страницу со способовами оплаты, перехожу в интернет-магазин, там нет такой обработки. Подскажите, как скачать?

    Reply ↓
  72. Katish7

    Извините за флуд не по теме. Разобралась.

    Reply ↓
  73. Katish7

    У меня есть база и в ней есть объекты с битыми ссылками (документы). Автор, скажи, твоя обработка сможет найти и удалить все элементы, содержащие битые ссылки в реквизитах?

    Reply ↓
  74. igormiro

    (72) Katish7, Посмотри на какой объект (реквизит) в документе, и сделай отбор по объекту где значение заполнено, а за тем удалить

    Reply ↓
  75. Katish7

    Спасибо, получилось!

    Конечно хотелось бы чтобы обработка сама искала где именно эти ссылки есть битые.

    Ну да ладно, зато действительно работает быстро. Ставлю плюс!

    Reply ↓
  76. nshrek

    полезная и интересная обработка. Спасибо за разработку. Часто битые ссылки или восстанавливаю или чищу через тестирование базы. С этой обаботка дело пойдет быстрее

    Reply ↓
  77. KostyaBu

    При удалении битых ссылок не совсем понятно, что будет удалено. Хотелось бы иметь возможнось выблать галочками. Однако обработка оказалась невероятно полезной! Автору спасибо.

    Reply ↓
  78. Igly

    Еще одна очень полезная вещь в определенных ситуациях. Спасибо!

    Хочется еще, чтобы был мало-мальский хелп в обработке. А то отрубили интернет, а тебе приспичило поработать (ну интернета-то нет ))) и сидишь методом тыка определяешь, в какой последовательности, что делать.

    Reply ↓
  79. Katish7

    Скажите, чем отличается выполнение обработки с галкой «Использовать транзакцию» и без неё? Как будет работать быстрее?

    Reply ↓
  80. igormiro

    (79) Katish7, Быстрее без транзакции, но в транзакции вы что то удаляете др. пользователи не могут эти объекты использовать так как они заблокированы.

    Reply ↓
  81. zakiap2

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

    Reply ↓
  82. Pretender195

    Нужная вещь для администратора 1с

    Reply ↓
  83. Boroda

    Обработка, безусловно, очень полезная и нужная. Но хотелось бы узнать причину её появления вновь на небосклоне: какие-либо доработки, новшества, или исправление каких ошибок, или просто «поднятие»…?

    Reply ↓
  84. mnikol

    В списке конфигураций нет БГУ. Жаль…

    Reply ↓
  85. igormiro

    (86) mnikol, Обработка универсальная и работает с любой конфигурацией.

    Reply ↓
  86. kkprps

    Спасибо автору за удаление регистров сведений. Раньше долго мучились. И за битые спасибо.

    Reply ↓
  87. igor_1c

    А у меня проблема. конфигурация УПП. По регистрам Товары в НТТ и Товары Организации появляются биты ссылки серий номенклатуры. Типа <Объект не найден…>, в регистре Партии товаров на складах такого нет, даже не знаю что делать. Товарный отчет не работает из-за этого. может эта процедура удалит такие серии.

    Reply ↓
  88. igormiro

    (89) igor_1c, Проще будет в сериях найти где ссылка объект не найден и переопределить на др. объект.

    Reply ↓
  89. alida555

    Для ЗУП 8.2 не подходит ?????

    Reply ↓
  90. igormiro

    (91) alida555, Что ошибку выдает, или что?

    Reply ↓
  91. alida555

    (92) Ни как не реагирут … ошибки не дает ..не запускается безединого коментария …Жаль очень нужен …

    Reply ↓
  92. igormiro

    (93) alida555, Добавь как объект в конфигурацию и 100% откроется.

    Reply ↓
  93. mybracho

    Скачал. Спасибо

    Только не то что нужно. Теперь для 8.1 буду качать.

    Reply ↓
  94. smaznev
    Reply ↓
  95. ZORGE_Tech

    Спасибо огромное автору за эту обработку. Очень полезная вещь. Очень помогла при очистке справочника контрагенты от помеченных на удаление объектов. Прекрасная обработка!

    Reply ↓
  96. commo

    Огромное спасибо за обработку. сейчас как раз очень нужна. однозначно «+»

    Reply ↓
  97. chantonov

    Вышлите пожалуйста эту обработку на chantonov@yandex.ru.

    Очень нужно! Спасибо заранее!

    Reply ↓
  98. super-drema

    Спасибо за обработку

    Reply ↓
  99. agulaev

    Отличная идея и реализация! Удачи Автору! Спасибо!

    Reply ↓

Leave a Comment

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