Служба мгновенных сообщений (Lite)




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

19 Comments

  1. CheBurator

    А в версии Супер-ЛайтЛайт будут сняты ограничения по дате … 😉

    хочется сабж для 7.7!!!

    Reply
  2. serezhenko

    Как обкатаю Lite для 8.0 — займусь 7.7

    Схема ее работы будет аналогичной для Lite версии 8.0 (т.е. использование MXL файлов).

    На данный момент интересует отзывы по производительности при сколь нибудь большом числе контактов (более 10)

    По дате, по мере выхода бета версий срок ограниченния будет сдвигаться, т.е.срок «жизни» беты около 1,5 месяца

    Reply
  3. JohnyDeath

    Сhe Burashka, а что ты так навязчево хочешь себе «болтушку» именно в 1с? ИМХО, пихать всё подряд в 1С не есть хорошо. В данном случае можно найти себе абсолютно бесплатную «аську» для локальной сети.

    Reply
  4. serezhenko

    Конечно есть множество софта для общения в локальной сети. Но в свете его использования с 1С у сервисов интегрированных в конфигурацию есть явное приемущество:

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

    2. Отсутствие необходимости установки дополнительного софта на рабочие места пользователей (ведь зачастую админы это запрещают делать)

    3. Возможность генерации сообщений алгоритмами конфигурации (например оповещение об оплате или сборке товара)

    Reply
  5. serezhenko

    Проект Служба мгновенных сообщений (Lite) закрыт!

    Если кому нужен подобный сервис — используйте http://www.infostart.ru/projects/341/?ref=1510

    Reply
  6. support

    А что так? Почему закрыт?

    Reply
  7. CheBurator

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

    Reply
  8. v.l.

    Для ЧеБурашки:

    А в чём проблема с болтушкой?

    У Митичкина в учебнике написана сообщалка с прикреплением объектов базы.

    Ну, и… написать такую по учебнику?

    Reply
  9. e.kogan

    Скажите, а не-бету купить можно? Нужна именно внешняя обработка.

    Reply
  10. serezhenko

    (6) Мне он стал не интересен.

    (9) Поскольку проект закрыт, то «не-беты» нет. Можно ничего не покупать 🙂

    Если есть желение самостоятельно что-то доработать — дерзайте, модкль обаботки для платформы 8.1 без пароля. Если кому потребуется ее довести до ума — обращайтесь…

    Reply
  11. e.kogan

    Спасибо ещё раз за удобную штуку!

    Reply
  12. ost.a

    А как бы её на серверную УТ8.1 зацепить, а то ругается :{ВнешняяОбработка.СлужбаМгновенныхСообщений(132)}: Ошибка при вызове метода контекста (СоздатьКаталог): Ошибка создания каталога

    СоздатьКаталог(КаталогДанных + ?(Владелец = Неопределено, Идентификатор, Владелец));

    по причине:

    Ошибка создания каталога

    по причине:

    Ошибка при выполнении файловой операции ‘\Belfort-srv’

    Reply
  13. serezhenko

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

    Вам необходимо в макете обработки «КаталогДанных» указать путь к общему каталогу, доступному на запись для всех пользователей. По умолчанию там указан каталог \Belfort-srvwork1CСМС, у вас такого ресурса в сети нет — вот и выдается сообщение об ошибке.

    Reply
  14. ost.a

    у нас есть общий для всей компании диск «Z» (виден с любого компьютера) как прописатьпуть к папке SMS на этом диске? «Z:SMS» Так?

    Reply
  15. serezhenko

    да

    Reply
  16. dobruka

    исправил строку в текстовом макете на: \Наш_серверНаш_каталог\r

    все равно выдает :Ошибка при выполнении файловой операции ‘\Belfort-srv’

    Reply
  17. Larkin

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

    1. Путь к данным храню в константе.

    2. При закрытии обработки удаляю файл сообщений, чтобы не забивать место на винте.

    3. Добавил возможность созадние задачи для пользователя.

    Так что однозначно +!

    Reply
  18. Larkin

    (16)

    Нужно перед закрытием дописать:

    ОтключитьОбработчикОжидания(«ИмяПроцедуры»);

    Там при открытии они подключаются, и остаются висеть после закрытия обработки, т.е. фактически обработка остается открыта в фоне.

    Кроме того рекомендую переделать чтение статусов из файлов на регистр сведений, т.к. при большом кол-ве пользователей очень сильно тормозит работу системы вцелом.

    Reply
  19. olo_lo4

    К сожалению, не совсем ясен принцип работы.

    Я открыл 2 окна 1С, зашел под разными пользователями, общую папку прописал.

    И там и там пустое окно без имен пользователей.

    Смотрю он как то странно в папке создал еще подпапки и в каждом положил файл Статус.

    При этом обращается за этим файлом Статус совсем в другую папку.

    Опишите принцип работы данной обработки. Спасиьо!

    Reply

Leave a Comment

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