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




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

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 не будет опубликован. Обязательные поля помечены *