Решение проблемы динамического обновления 1С 8.X




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

21 Comments

  1. kiba

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

    Решается эта проблема путем чистки каталога userLocal SettingsApplication Data1C1Cv81 (или 1Сv8 для версии 8.0) , в котором содержится

    данные кэша 1С. Данная процедура позволяет автоматизировать данный подход при завершении работы пользователя.

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

    Reply
  2. coder1cv8

    Пользовательские настройки вместе с кэшем затираются?…

    Reply
  3. Vitek

    (1)А ты как думаешь? за 30 то деревянных 🙂

    Reply
  4. kiba

    Настройки не затираются. Они хранятся в другом каталоге (userApplication Data1C1Cv81)

    Затирается только кэш (папки Config, ConfigSave, SICache, DBNameCache)

    Reply
  5. PowerBoy

    Я чет, не понял — она каждый раз очищает кэш?

    Reply
  6. coder1cv8

    (4) ну! )

    Reply
  7. PowerBoy

    (5) А потом при старте каждый раз создает! )

    Reply
  8. tormozit

    Удаляет кэш от всех баз сразу?)

    Reply
  9. tormozit

    Кстати под вистой WshShell.SpecialFolders.Item(«AppData») не так работает, как под ранними ОС. Так что эта штука работать под вистой правильно не будет.

    Reply
  10. simol

    Что-то у меня только cachedata удаляет, а cacheStorage оставляет

    Reply
  11. luns

    Вот тут бесплатно можно взять: http://infostart.ru/profile/10590/projects/2562/ 😉

    Reply
  12. simol

    При поиске в модулях спрашивает пароль. Неудобно, так как нельзя отойти.

    Reply
  13. kiba

    По просьбам снят код с модуля обработки.

    Reply
  14. kiba

    Самый главный замеченный минус — все-таки кэш нужен для ускорения работы 1С.

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

    может замедлиться (загрузка, открытие форм и т.д.).

    Как вариант, можно предусмотреть очистку кэша по запросу при выходе из 1С (правда пользователь должен понимать о чем его спрашивает программа),

    очистка по определенным дням, очистка при установленной константе и т.д.

    Reply
  15. awa

    (13) а функцию КонфигурацияБазыДанныхИзмененаДинамически() религия использовать не позволяет?

    Reply
  16. Root Of Life

    Еще вариант автоматического убивателя кэша:

    Создается CMD файл с содержанием:

    rd «%UserProfile%Local SettingsApplication Data1C1Cv81» /s /q

    и ложится сюда:

    «C:Documents and SettingsAll UsersГлавное менюПрограммыАвтозагрузка..»

    При каждом входе каждый пользователь сам себе чистит кэш.

    Reply
  17. Linx-p

    а

    ping 10.0.1.1

    зачем?

    Reply
  18. Mogidin

    у меня вот какая проблема, связанная с динамическим обновлением:

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

    делаем, обновляем конфигурацию (что происходит динамически, т.к. с базой работают пользователи), перезапускаем 1с-ку… и получаем тормоза при загрузке конфигурации.

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

    в чем причина такого поведения?

    Reply
  19. JohnySC

    (17) Mogidin, причина такого поведения я думаю становится понятной из этой статьи http://gilev.blogspot.com/2010/02/1-81.html

    Reply
  20. Ac73

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

    Reply
  21. AlexO

    (19) Ac73,

    А у меня в каталоге 1С8.1 находиться файл ibases который также затирается

    К динамическому обновлению это отношения не имеет.

    Возможно, вам поможет моя статья:

    Администрирование и унификация списка баз пользователей в 8.2 (типовой механизм)

    Там есть и про затирание списка, и масса примеров корреткной реализации, и возможностей работы со списками баз.

    Reply

Leave a Comment

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