Обработка в помощь переводящему конфигурацию на управляемые блокировки




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

15 Comments

  1. German

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

    Reply
  2. Ruler

    Возможно Вы правы, но есть Регистры Сведений например в УТ «ЗначенияСвойствОбъектов» которые не подчинены регистратору, но у них есть измерение например «Объект» которое имеет значение «ДокументССылка» и признак «Ведущее» и при удалении из базы документа платформа попытается очистить все записи с этим документов в регистре и если его не модифицировать получим ошибку и документ не удалиться. Для нахождения таких регистров и предназначена моя обработка.

    Reply
  3. JIGIT

    Полезная вещь…но кнопочка снять все галочки не работает 🙁

    Reply
  4. Ruler

    Упс, исправил поправил.

    Reply
  5. Ruler

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

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

    Reply
  6. greystone

    Обработка Зе Бест. Хорошо бы кто нибудь написал конструктор управляемых блокировок документа, а то регистров у документа реализация полно, что-то я запарился писать.

    Reply
  7. legawww

    Документ Заказ покупателя делает движения только по одному регистру «Товары в резерве», тем не менее перевода документа и регистра не хватает для установки режима блокировок «управляемый». Что еще ему надо не понимаю. Может эта обработка поможет. Вот пишу это сообщение чтобы заработать какие то балы и скачать обработку, а то самому жалко времени писать сначала.

    Для того чтобы было больше текста привожу рекомендации по модификации конфигураций при переходе к режиму управляемых блокировок:

    Конвертируем конфигурацию из версии 8.0 в конфигурацию версии 8.1. Режим управляемых блокировок — автоматический.

    Если в процессе эксплуатации информационной базы возникают проблемы с параллельностью работы пользователей — например, часто стали появляться сообщения о превышении времени ожидания блокировки или о конфликтах взаимных блокировок, то составляем список документов, работа с которыми приводит к появлению вышеупомянутых проблем.

    Постепенно переводим конфигурацю в управляемый режим. Устанавливаем свойство Режим управления блокировкой данных всей конфигурации в целом в режим Автоматический и управляемый.

    Для указанных в списке видов документов переводим свойство Режим управления блокировкой данных в значение Управляемый. Также в управляемый режим переводим все регистры, по которым эти документы выполняют движения и все транзакции (явные и неявные), открываемые в процессе проведения документа.

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

    Устанавливаем управляемые блокировки на найденные нами данные. При этом разделяемая блокировка устанавливается для того, чтобы данные не были изменены другими транзакциями. Исключительная блокировка, помимо этого, обеспечивает запрет не только изменения этих данных, но даже их чтения другими транзакциями, устанавливающими управляемые блокировки. Можно сказать, что исключительная управляемая блокировка является средством борьбы с конфликтами блокировок (deadlock) и может использоваться аналогично ключевому слову ДЛЯ ИЗМЕНЕНИЯ языка запросов в режиме автоматических блокировок.

    Reply
  8. legawww

    Уже 0.8, еще 0.2 надо. просьба к админам небанить меня, уж очень нужна обработка!

    Reply
  9. legawww

    Не помогло 🙁 Поставил управляемый режим всем регистрам, а все равно «Автоматический режим блокировок недопустим в этой транзакции»

    Reply
  10. kovgard

    (9) legawww,

    Запустите отладку, наверняка, где-нибудь в модуле набора записей увидите программный вызов записи в дополнительные регистры.

    Reply
  11. tango

    (6) посмотри, как в УНФ сделано

    Reply
  12. legawww

    Оказалось последовательность надо перевести в управляемый режим

    Reply
  13. ProgaN

    Оказалась полезной в свое время обработкой.

    Reply
  14. pradd19@mail.ru

    (12) legawww, подскажите как перевести последовательность в управляемый режим

    Reply
  15. legawww

    (14) pradd, так же как и остальные объекты в свойствах последовательности на закладке Прочее выставить свойство «Режим блокировки» в значение «Управляемый»

    Reply

Leave a Comment

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