Пометка на удаление неиспользуемых элементов справочников и документов




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

52 Comments

  1. AnryMc

    Все

    Reply
  2. ChinChin

    {Форма.Форма(30)}: Поле объекта не обнаружено (Адресные сокращения)

    Выборка=Справочники[ТЭ.НаименованиеСправочника].Выбрать();

    Reply
  3. ChinChin

    И можно было бы кнопки управления флажками разметить — муторно по всем строкам галки ставить 🙁

    Reply
  4. ChinChin

    Добавь «ОбработкаПрерыванияПользователя» в циклах.

    И на Банковских счетах тоже вспоткнулся (2)

    Reply
  5. ChinChin

    Жесть в отладчике:

    Выборка=Справочники[ТЭ.НаименованиеСправочника].Выбрать()

    Отгадай что подставляешь в квадратных скобках для поиска метаданных?

    «АдресныеСокращения» или «Адресные сокращения»??? Поэтому ошибок нет только в справочниках из одного слова!!!

    И нафига спрашивается в цикле по каждому элементу запускать «НайтиПоСсылкам»? Для чего, по твоему, на вход предусмотрена подача массива ссылок на объекты — что бы туда одну ссылку загружать? Необоснованно увеличил скорость выполнения обработки раз в 100 (если не больше)!

    Reply
  6. Borisych

    товарищ AnryMc еще «зеленый» прогер 😀

    Reply
  7. ChinChin

    (5) Конечно не «скорость», а «время»!!! 😀

    Reply
  8. AnryMc

    (All) Извините выложил версию с ошибкой. Исправлено.

    + тоже самое по документам НО НА СВОЙ СТРАХ И РИСК!

    (7) А скорость меня и не волновала 😉

    Reply
  9. AnryMc

    (3) Не делал пециально — чтобы было время «одуматься» 😀

    Reply
  10. AnryMc

    (6) А почему слово ЗЕЛЕНЫЙ в кавычках?

    Чуть доделал — (3)

    Reply
  11. AnryMc

    (2) Добавил

    Reply
  12. Borisych

    (10) ну дык в переносном же смысле 😀

    Reply
  13. ChinChin
    Reply
  14. ChinChin

    При установке пометки по Номенклатуре выскакивает такая бяка:

    «Перед записью необходимо определить единицу измерения!»

    Думаю надо использовать режим обмена данными перед записью.

    «ТУО.ОбменДанными.Загрузка = Истина;»

    Reply
  15. AnryMc

    (14) + (13) Спасибо. В ближайшее время добавлю

    Reply
  16. AnryMc

    Добавлены выраженные пожелания

    Reply
  17. boogie

    В статусе быстро-быстро мелькает «На удаленте«,

    Хорошо бы добавить прогресс — я тут кууучу мусора удалял и не знал когда уже наконец

    а так +!

    Легко удалил неиспользуемые договоры контрагентов.

    И ещё: при отметке галочками нескольких видов элементов, хотелось бы, чтобы если есть ссылки только между собой у объектов, они бы тоже считались неиспользуемыми, например у объекта договор контрагента есть ссылка на владельца, а у контрагента — ссылка на основной договор, в итоге циклическая ссылка и они не отмечаются, а выявить очень сложно. Конечно, это бага проектирования базы жесточайшая, но так делает 1С.

    Reply
  18. average

    Обработка ничего не дает при работе со справочниками Номенклатура и Контрагенты

    По следующей причине:

    В элементах этих справочников есть реквизит основная единица измерения и основной договор.

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

    Reply
  19. Ольга_tmp

    да, с номенклатурой грустно

    Reply
  20. Vitko_freedomcars

    Автор, доделай обработку. Интерес к ней есть, а вот номенклатуру — не почистишь!

    Reply
  21. AnryMc

    (17) boogie, (18) average, (19) Ольга_tmp, (20) Vitko_freedomcars,

    Это задача из серии: «что первично – курица или яйцо?»

    Не вижу необходимости добавлять исключение (номенклатура – единица измерения) в более менее общий алгоритм поиска. Данная ситуация должна разрешаться стандартной обработкой «Групповая обработка справочников и документов» (например, делается отбор элементов справочника «Номенклатура» по нужной позиции значения реквизита «Базовая единица измерения» и для отобранных элементов выполняется обработка установки реквизита в другую единицу или «пустую»).

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

    Reply
  22. firuzji

    Хорошая идея!

    Если у кого есть для 7.7- ки, выложите плиз.

    За идею «+».

    Reply
  23. AnryMc

    (22) firuzji,

    К сожалению для 7.7 не делал…

    Reply
  24. Alex_E

    (22) firuzji, На ИТС —

    Для 7.7 ObjDel.ert

    Reply
  25. AnryMc

    (24) Alex_E,

    Может я отстал, но раньше эта обработка не искала ссылок на объекты, а просто отбирала их.

    Reply
  26. Alex_E

    (25) Не совсем понял, что значит не отбирала а искала — но смысл в том, что с её помощью можно пометить на удаление объекты, на которые нет ссылок.

    Reply
  27. AnryMc

    (26) Alex_E,

    ПАРДОН. Давно это было — забыл.

    Reply
  28. Alex_E

    (27) Давно, я просто пользовался, и однажды круто налетел (в доработанной конфе удалил служебные справочники, на кот. реально не было ссылок, а они использовались при создании документов) — поэтому и запомнилось — особенно как я потом с помощью FoxPro восстанавливал dbf 🙂

    Reply
  29. firuzji

    (24)Спасибо нашел.

    Reply
  30. AnryMc

    (17) boogie, (18) average, (19) Ольга_tmp, (20) Vitko_freedomcars,

    Для справочников добавил колонку «Исключение» можно исключить из проверок ссылки определенного справочника, например:

    «Контрагенты» — «Договора контрагентов»,

    «Номенклатура» — «Единицы измерения», …

    Reply
  31. agulaev

    «Зеленый», спасибо! Плюс!

    Reply
  32. yuraos

    что-то скромненькая обработочка…

    есть и покруче функционально:

    под 8.х (автор, правда, решил деньги брать, изначально было бесплатно)

    под 7.7 (бесплатно)

    Reply
  33. AnryMc

    (32) yuraos,

    1) Для 7.7 см. пост (24)

    2) Моя появилась 02.02.2010 20:57, а та для 8.х — 09.02.2012 22:06 Разница в 2 года

    Reply
  34. yuraos

    (33) мда …

    много воды утекло с тех времен

    😉

    мго чего наделадось.

    Reply
  35. AnryMc

    (34) yuraos,

    Опять таки «шара»

    Reply
  36. alonzomozley

    Спасибо, помогло.

    Reply
  37. AnryMc

    (36) alonzomozley,

    Можно ещё «плюсик» поставить

    Reply
  38. alonzomozley

    пожалуйста )

    Reply
  39. AnryMc

    (38) alonzomozley,

    Спасибо

    Reply
  40. SEvAn

    Не хватает «Сохранить настройки» и чтобы их можно было восстановить на другой базе!

    Reply
  41. Поручик

    В УТ 11.1 есть обработка Удаление неиспользуемых элементов справочников.

    Reply
  42. AnryMc

    (41) Поручик,

    Эта публикация от 02.02.2010 20:57

    Когда она (обработка) появилась в УТ 11.1?

    ЗЫ Может «предьяву» 1С сделать — за плагиат? ;-)))

    Reply
  43. AnryMc

    (40) SEvAn,

    Область отбора для поиска строиться каждый раз заново — «обходим метаданных».

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

    Reply
  44. SEvAn

    (43) в «совсем» другой да, но часто сливаем несколько в одну и тогда не помешало бы)

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

    Жду)

    Reply
  45. AnryMc

    (44) SEvAn,

    Сделал сохранение и чтение настройки через файл — поиск «соответствия» по имени и типу (как текст).

    Смотрите 4 версию.

    Reply
  46. SEvAn

    (45) кнопки называются почему-то одинаково и еще бы крыж «пометить/разметить все»

    Reply
  47. AnryMc

    (46) SEvAn,

    кнопки называются почему-то одинаково

    Упс — это всё лень матушка. исправлю…

    Reply
  48. AnryMc

    (46) SEvAn,

    2015/03/19 Версия 5

    Добавлены кнопки «пометить все» и «снять пометки у всех»

    Reply
  49. vasyak319

    Какой-то неоправданно скромный выбор объектов. А где бизнес-процесс, планы счетов, обмена, видов характеристик и расчёта?

    Reply
  50. AnryMc

    (49) vasyak319,

    А ещё можно сделать чтобы 1С-ка сама работала — без оператора….

    Reply
  51. vasyak319

    (50) не надо юродствовать. То, что написал я, сделать проще простого и странно, что вы этого не сделали.

    Reply
  52. AnryMc

    (51) vasyak319, Сделать проще простого. Надо просто потратить немного времени, но пока я не могу себе этого позволить…

    Можно написать много разного… Просто делал то что нужно было самому — потом выложил…

    В моем случае — такой функционал был мне достаточен.

    Навряд ли Вы найдете базы с сотнями введенных видов расчетов которые ни где не используются… А вот, например, справочник Номенклатура или Контрагенты — эти почти всегда с мусором…

    ЗЫ Извините, если если «задел» своим постом.

    Reply

Leave a Comment

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