Синхронизация данных сотрудников ЗУП 2.5 и Active Directory




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

10 Comments

  1. RailMen

    Мы делаем так. Вся контактная инфа заносится кадровиками в ЗУПе. По этому ЗУП по отношению к AD как бы главная база. В AD выгружаем должность, подразделение, номер помещения/офиса, и пр контактную информацию, которая носит корпоративный характер (чтобы не нарушать закон о защите перс данных, например, номер личного моб тел есть в базе ЗУП, но его естественно нет в AD).

    Технически делаем так: создаем в дереве метаданных два (можете больше) Web-сервиса и столько же XDTO-пакетов. В модуле Web-сервиса прописывам как будем заполнять таблицы XDTO. Все.

    Reply
  2. Jokstr

    У нас поднят корпоративный сервер Microsoft Exchenge, все адреса электронной почты хранятся в AD. Также в AD вносятся номера телефонов (используется IP-телефония). До недавнего времени туда же вручную вводились данные по должностям и подразделениям сотрудников, было много ошибок, переводы сотрудников в AD фиксировались через раз — все это вылазило в карточках контактов почты. С другой стороны в ЗУП никто не вносил адреса эл. почты и нельзя было сделать нормальную рассылку по сотрудникам.

    Пришлось написать эту обработку, теперь данные синхронизируются автоматически, в результате смог прикрутить обработку рассылки расчетных листков по сотрудникам. Планирую доработать обработку с целью автоматической синхронизации структуры каталогов AD подобно структуре подразделений в ЗУП, если конечно найду на это время.

    Reply
  3. mvv1969

    А для 3-й редакции ЗУП не пробовали подобное сделать?

    Reply
  4. Neverpoint

    (1) Добрый день! Вы сами писали отправку данных в AD? Есть ли готовые в тч платные решения, чтобы синхронизировать наш справочник контрагентов с AD, желательно из 1С в AD. Достаточно только основные реквизиты.

    Reply
  5. Neverpoint

    (2) Добрый день! Вы сами писали отправку данных в AD? Есть ли готовые в тч платные решения, чтобы синхронизировать наш справочник контрагентов с AD, желательно из 1С в AD. Достаточно только основные реквизиты.

    Reply
  6. RailMen

    (4) Илья,мы все делали своими силами с нуля: 1) программисты 1С создали web-сервисы, опубликовали web-сервер; 2) администраторы AD могли обратиться к функциям, которые создали программисты 1С, и получить данные из 1С, затем обновить данные в AD. Все что касается 1) я могу сделать. Что касается 2) — тут нужен админ AD и я к сожалению не подскажу.

    Reply
  7. Neverpoint

    Как то сложно они у вас закрутили — мы тут подумали вчера и на коленке быстро сделали синхронизацию через команду csvde которая идет с любым windows server. Там просто csv файл достаточно выгружать из 1с и он красиво прописывается в AD без каких либо программистов и любые атрибуты.

    Вообще у нас центром вселенной по данным является AD, так как это де факто стандарт и через этот узел идет синхронизация всего нашего зоопарка включая нашу собственную биометрическую CRM для контроля доступа по лицу, так же телефонная станция. Но поскольку в бизнес-процессах входящей точкой контакта часто бывает какой нибудь чек с реквизитом контакта то и контакт заносится в 1с, отсюда и потребность.

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

    Через web сервисы это конечно красиво, но затратно

    Reply
  8. Jokstr

    (5) Писал обработку сам. Готовых решений касаемо контрагентов у меня нет. Можете более подробно написать что с чем хотите синхронизировать в ЛС — посмотрю, что смогу сделать.

    Reply
  9. Jokstr

    (3) В ближайшее время буду пробовать (переходим на ЗУП 3.1).

    Reply
  10. master_yoda

    (9) Удалось реализовать для ЗУП 3.1?

    Reply

Leave a Comment

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