Создание пользовательских уведомлений (бизнес-событий) в 1С: Документооборот, редакция 1.3




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

13 Comments

  1. natarezn

    Хочется как в штатах как в астериксе. модно и нелепо. с закрытием кода. Такое возможно ?

    Reply
  2. anton_sh

    Можно и как в астериксе, почему бы и нет ;)! Можете, например, создать собственный общий модуль закрытый, и в выражении (в детекторе или в доп. обработчике) обратиться к нужно процедуре или функции, которая будет возвращать лишь результат Истина или Ложь. Так же можно визуально скрыть код, дописав конфигурацию.

    Reply
  3. ivdic

    Можно ли как настроить не уведомление на почту а внутренее встплывающее уведомление как события в календаре?

    Reply
  4. Steelvan

    (1) natarezn,

    А в штатах всегда все через одно место.

    У них и производства даже своего нет, все делают китайцы.

    Только наклейки клеят и нам привозят. Made in China заклеивают на Made in USA (Тьфу).

    Reply
  5. lefthander

    Можно ли таким образом настроить уведомление на почту события календаря?

    Reply
  6. lexxgod

    Здравствуйте!

    Не получается настроить уведомления о новых задачах пользователей!!!

    Версия Документооборот 8, КОРП 1,3

    Системная учетная запись проверку проходит — письмо пришло.

    Напрямую письмо пользователю тоже приходит. А вот уведомления о новой задаче не приходит…

    Подскажите, что может быть не так???

    И еще вопрос! Можно ли как то настроить уведомления на почту, например при вводе документа в котором выбран этот пользователь?

    Reply
  7. baykovsky

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

    Автору стоило привести несколько конкретных примеров с указанием кода обработчиков.

    Reply
  8. KRIHA

    Люди, извините что не в тему — помогите ответом на вопрос: можно ли в 1С:Документооборот в качестве исполнителя выбрать группу (или роль, или еще что) таким образом, что задача на исполнение приходит всем пользователям группы, но кто первый «схватил» и согласовал тот и собственно и завершает процесс согласования. Может быть я коряво написал — заранее приношу за это извинения.

    Reply
  9. Kotovskij

    (8) KRIHA,

    выбрать группу пользователей нельзя, роль — да.

    что касается «но кто первый «схватил»» — используйте механизм принятия задач к исполнению (принятая к исполнению ролевая задача становится персональной), либо достаточно просто исполнить задачу каким-либо из исполнителей ролей, чтобы она стала «персональной» (при выполнении задачи отметка о принятии к исполнению устанавливается автоматически)

    не забудьте назначить исполнителей в регистре «Исполнители ролей»

    Reply
  10. lexxgod

    (6) lexxgod,

    Подскажите пожалуйста кто нибудь!!!

    Так и не получается настроить уведомления о новых событиях на почту…

    Что еще нужно сделать?

    Reply
  11. Raduga

    (10) lexxgod:

    1. В Настройках программы: флаги Использовать уведомления и Использовать бизнес-события

    2. Настроить системную почтовую учетную запись (это видимо есть) — Настройка и Администрирование — Учетные записи

    3. Настроить уведомления по умолчанию (в частности — для новых задач) — Настройка и Администрирование — Общие — Использовать уведомления — Настройка

    4. Ввести адреса для уведомлений (по умолчанию должны браться из карточек пользователей) — Настройка и Администрирование — Общие — Использовать уведомления — Настройка — Адреса уведомлений

    5. Включить регл. задания:

    — «Обработка произошедших бизнес-событий»

    — «Уведомление пользователей о произошедших событиях»

    Reply
  12. Taliesien

    Какова ценность данного инструмента? Насколько я понял это извращённый вариант регламентного задания? Что мешает просто настроить регламент, без этих плясок? Или я упустил какие-то преимущества?

    На мой взгляд единственное преимущество, не надо редактировать конфу и всё…

    Reply
  13. JohnConnor

    нужно было код в качестве примера, а не пустые окна

    Reply

Leave a Comment

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