Удаление помеченных объектов для 8.3 без монопольного режима




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

27 Comments

  1. maxis33

    Хм, в последних редакциях БСП (и БП 3.0) удаление помеченных объектов уже не требует монопольного режима.

    (Администрирование-Удаление помеченных объектов).

    Reply
  2. copti

    (1) maxis33, Да, действительно уже можно в БП 3.0

    Reply
  3. Поручик

    (0) Удаление помеченных объектов (немонопольное) для управляемых (UPD: и обычных) форм http://infostart.ru/public/97936/

    Reply
  4. copti

    (3) Поручик, когда у меня возникла потребность, ни где не мог найти готовой обработки, поэтому стал сам ковырять. А теперь и штатная работает не монопольно, и столько готовых, АБЫДНА!

    Reply
  5. ALLES

    Интерфейс Такси. Ошибка в строке 832

    Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);

    Переменная не определена (ДлительныеОперации)

    Reply
  6. copti

    (5) ALLES, Видимо вы используете старую платформу, либо нетиповую конфигурацию. Функция «ЗаданиеВыполнено(ИдентификаторЗадания)» вызывается после выполнения основных действий программы, что бы закрыть все активированные процессы. Если не получается обратиться к длительным операциям при завершении, значит они не создавались до этого. Видимо, в вашей конфигурации длительные операции не предусмотрены, Такая ошибка нештатно завершит работу, но не должна помешать выполнить основные действия. Если все так, попробуйте закомментарить строку 832 в коде.

    Reply
  7. ron1

    БП 3.0.33.19

    Запускаю обработку. На доли секунды что-то открывается и тут же закрывается. И всё.

    Reply
  8. copti

    Скорее всего, вы зарегистрировали ее в программе как внешнюю обработку. Я об этом в говорил в описании: «Запускать обработку следует через меню ФАЙЛ_ОТКРЫТЬ в режиме предприятия, вставить ее в справочник внешних обработок не получится.»

    Reply
  9. masticore

    Интерфейсу «такси» менее месяца, старой версией не может быть по определения.

    Reply
  10. copti

    (9) masticore, под интерфейсом такси я не тестировал обработку. Он предназначен для веб клиента. Я пока пользователей на него не переключил. Возможно, экран без графики быстрее крутится, но пользователям прежний привычнее.

    Reply
  11. ron1

    Спасибо. Через Файл-Открыть обработка работает.

    Но если честно, она нужна была не мне, а главбуху, потому что при переходе на версию 3.0 оказалось, что у неё нет прав на удаление.

    Я решила обмануть программу и поставить ей внешнюю.

    Но не вышло.

    То ли потому что Вы все берете за основу типовую, то ли потому что 1сники внутри прописали какую-то проверку, но обработки внешние, которые я тут скачала, подо мной работают, а под главбухом не даже открываются.

    Reply
  12. copti

    (11) ron1, Никакая обработка не сможет делать то, на что у пользователя не хватает прав. Вы либо давайте своему гл.буху админские права, либо удаляйте сами то, что она вам наотмечает. А вот почему внешняя обработка не стартует после регистрации в базе, но стартует через «открыть файл» я пока не разобрался. Трудность в том, что после помещения в базу, отладчиком уже ее не посмотреть. А когда она живет в виде файла снаружи, она работает и ничего не видно.

    Reply
  13. Гость

    Заходим в раздел «Администрирование» и выбираем «Удаление помеченных объектов»

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

    Объекты, которые не могут быть удалены (те самые что в левой части) удаляются так:

    -Просто открываем каждый объект и помечаем его на удаление.

    -Если это элемент справочника (например Контрагент или Номенклатура) который используется в документе, тогда:

    -Открывает документ и удаляем из него все упоминания справочника.

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

    Reply
  14. KliMich

    Спасибо! Возму на вооружение

    Reply
  15. BUKINSER

    Спасиббо!

    Reply
  16. SemenovaMarinaV

    А ЗУПе требует монопольного режима

    Reply
  17. copti

    (16) SemenovaMarinaV, Возможно, мы ЗУП на управляемых формах еще не юзали. Мне даже потестировать не на чем. Мои бухгалтеры категорически отказались зарплату переводить на тройку. Марина, положите где-нибудь на FTP копию вашей базы для моих тестов и мне в личку напишите. Попробуем обойти ЗУПовский запрет.

    Reply
  18. SemenovaMarinaV

    Спасибо. Нашла обработку. И правильно сделали, что отказались. У нас просто новая организация, а начинать на 2.5 нет резона.

    Очень неудобно сделали индивидуальные и бригадные наряды. Не видела как в 8.2, а в 7-ке были сделаны изумительно.

    Спасибо.

    Reply
  19. Ekater

    Скачал. У меня платформа 8.3 Конфигурация 2.0. Не работает. Запускаю через файл->открыть. И ничего не происходит.

    Reply
  20. Ekater

    copti, поправьте характеристики обработки — на конфиге бух 2.0 не работает, даже если платформа 8.3. Чтобы люди зря не скачивали. Мне пришлось другую обработку скачать, для платформы 8.2 и как ни странно вот она немонопольно удаляет у меня.

    Reply
  21. copti

    (20) Ekater, Да, вы правы это только для 3.0 (на управляемых формах), но уже неактуальна, т.к. штатная все это уже умеет делать. Анонс сейчас поправлю. Если пришлете в личку ваш адрес, я вышлю вам такую обработку для 8,2

    Reply
  22. Поручик

    (21) Почему только для Только для БП 3.0

    Reply
  23. Поручик

    (21) Почему Только для БП 3.0? В УТ 11 и других конфах на управляемых формах не пройдёт? По-моему ты слишком слабо разбираешься в матчасти.

    Reply
  24. codervv

    Большое спасибо !

    Reply
  25. KAV2

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

    Хочется понять что происходит.

    Reply
  26. copti

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

    Reply
  27. lstep

    Скачал, проверил, все работает. Спасибо.

    Reply

Leave a Comment

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