Обработка рассылки сообщений через net send




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

24 Comments

  1. ARL

    Действительно простая и реально удобная. Куда приятней, чем пользоваться командной строкой.

    Reply
  2. Angeros

    А на windows 7 будет работать?

    Reply
  3. Alav

    А в терминале? 🙂

    Reply
  4. CheBurator

    очередная «переделка» старых 7-ых решений (см. у меня в профиле). Сделали хотя бы логгирование отосланных сообщений в файл (по ответу нетсенда можно понять доступен юзер или нет) и поддержку быстрого выбора «типовых» сообщений…

    .

    Reply
  5. CheBurator

    (3) можно и в терминале…

    Reply
  6. Jogeedae

    «net send» это как-то не кошерно 🙂

    Reply
  7. pirit

    (6) Написано простая обработка net send — если бы я написал «рассылка сообщений» был бы понятен ваш комментарий, а так это просто лишь бы написать гадость.

    Reply
  8. pirit

    (4) я поискал решение рассылки сообщений через net send — не нашел, решил что не помешает. Насчет логов можно подумать. Ответ от net send можно понять по галочкам, которые при доставке сообщения переходят в пустое значение.

    Reply
  9. Jogeedae

    (7)

    Ваш комментарий, к сожалению, также не понятен:

    Написано простая обработка net send — если бы я написал «рассылка сообщений»

    Смотрю в название — «Простая обработка рассылки сообщений через net send». хмм…

    Ну ладно, извините, не буду пререкаться 🙂 обосную мою «гадость»:

    1) а) если необходимо рассылать сообщения всем сотрудникам, независимо от того работают они в 1с предприятии или нет, зачем делать это через 1с?

    б) если необходимо рассылать сообщения только пользователям 1с почему бы не реализовать средствами 1с?

    2) не во всех сетях разрешен net send

    3) не во всех ОС есть эта команда

    4) есть команда msg

    Reply
  10. pirit

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

    Reply
  11. shvo65

    Хорошее решение — просто и элегантно. Видно. кто из пользователей находится в базе.

    А net send открывается в групповой политике.

    А по поводу «типовых сообщений» — хорошая мысль, можно реализовать…..

    Reply
  12. vasilykushnir

    (1) А что, WinSent не такая приятная и удобная?

    Reply
  13. ARL

    (12) Не такая.

    1) Net send уже подключена на всех компьютерах, озадачивать сисадмина установкой программы не надо.

    2) Сообщения передавать надо только пользователям 1С

    3) Окно сообщения вылетает поверх всех окон, если человек за компьютером, не заметить не возможно.

    Минус — только в перспективе — не на всех ОС есть служба.

    Reply
  14. Jogeedae

    (13)

    Минус — только в перспективе — не на всех ОС есть служба.

    пишу прямым текстом: net send убрали, но добавили команду конкретно для этих целей — cmd.

    эта команда намного веселей и интересней 😀 , и включать вроде ничего не надо.

    если автор переделает под неё, то будет честный плюс 🙂

    Reply
  15. Abadonna

    (4)

    очередная «переделка» старых 7-ых решений

    Типичный подход «одноэснега»:

    — Ваше любимое произведение Огинского?

    — Полонез

    — Ваш любимый полонез?

    -Огинского

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

    Reply
  16. CheBurator

    потому что менеджер/оператор должен РАБОТАТЬ, а не переключаться из приложения в приложение для выполнения требуемых действий…

    Reply
  17. Abadonna

    (16)

    потому что менеджер/оператор должен РАБОТАТЬ

    Ты еще манагеру сделай возможность вести переговоры по телефону из 1С!

    Это, между прочим, его основная работа.

    А вот операторы существуют только заевшихся московских конторах, в Расее это менеджеры 😉

    P.S. В наш холдинг входит завод КЭМЗ, где рулят конструкторы и ИТР. Им net send в Компас встраивать? 😀

    Reply
  18. vasilykushnir

    (13) «3) Окно сообщения вылетает поверх всех окон, если человек за компьютером, не заметить не возможно.»

    — не нравятся мне кошки…

    — вы просто не умеете их готовить.

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

    (14) cmd конечно чумная вещь. но она по-моему всегда была, разве что в хомке какая-то ущербная. 😉

    Reply
  19. Jogeedae

    (18) тьфу ёлке… не «cmd» а msg там должно быть. очепятка 🙂

    Reply
  20. vasilykushnir

    (19) А вообще-то прикольно через cmd слать сообщения… изврат по высшему разряду 😀

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

    Reply
  21. echo77

    Помнится качал с infostart’а обработку для 8.1 «Завершение работы пользователей«, но сейчас не могу её найти здесь. Так же может отсылать сообщения, но еще и отключать пользователей в режиме клиент-сервер

    Reply
  22. Rustig

    внедрил обработку в небольшой фирме: два буха + глав. бух. У них админ запретил аськи. Все довольны. За обработку спасибо! 🙂 всем успехов

    Reply
  23. Serggray

    Пробовал использовать в терминале, что-то пока не жужжит 🙂

    Reply
  24. stark.temp

    Спасибо. Действительно простая и реально удобная. Куда приятней, чем пользоваться командной строкой

    Reply

Leave a Comment

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