Управление списком пользователей из режима 1С:Предприятие.




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

26 Comments

  1. support

    Улет! Круто! Класс!

    А конфигурацию случайно открыть нельзя? 🙂

    Reply
  2. Гениально!

    А можно открыть Автообмен таким образом?

    Не будет проблем при совместном открытии таких вещей разными юзерами? В конфигураторе такое в принципе невозможно, а в Предприятии?

    Reply
  3. vasilykushnir

    +1

    Reply
  4. Robert

    Автообмен и конфигурацию открыть нельзя. Предприятие не грузит необходимые библиотеки для этого.

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

    Reply
  5. Bobak

    Не будет проблем при совместном открытии таких вещей разными юзерами? В конфигураторе такое в принципе невозможно, а в Предприятии?

    Почему же невозможно!? Вполне даже возможно.

    Я для изменения списка пользователей никого из программы не выгоняю :).

    Reply
  6. Robert

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

    Reply
  7. logarifm

    Разобрался, просто я не спал совсем, Фича просто рульнаЯ!))

    Reply
  8. ZirgaGalva

    Хорошая статья. Просто замечательная, я бы даже сказал.

    Автору – респект.

    Reply
  9. ZirgaGalva

    Хм…

    Reply
  10. ZirgaGalva

    Хорошая статья.

    Reply
  11. CheBurator

    Завтра у себя прикручу…

    Reply
  12. Евгений1с

    что-то выдает пустой пункт меню и ничего не запускает 🙁

    Reply
  13. vasilykushnir

    Жаль, конечно, что нельзя еще плюсануть — работает аки зверь. И это на моей не типовой (она так похожа на стандартную, как Лужков на папуаса). А вопрос вот в чем:

    мнСервис.ДобавитьКоманду(«Плзв», «Пользователи», «#32854»);

    Читаю:

    Скрипт на внутреннем языке 1С, выполняемый при выборе пункта меню.Также это может быть текст вида #xxxx, где xxxx — числовой идентификатор команды, посылаемой системе.

    Откуда цифирь «#32854» и где найти идентификаторы других команд?

    Reply
  14. Robert

    Цифирь получен методом тыка. Метод тыка описан в комментариях к разработке RWidjets за 11.11.2006

    Reply
  15. vasilykushnir

    Ага. Саму обработку давненько скачал, а вот применить руки не доходили. А тут твоя статья обббалденная просто. Счас буду смотреть комментарии. Спасибо.

    Reply
  16. CheBurator

    т.е. типа если у юзера пава Администратора — то при входе его в систему можно добавить этот пункт меню..* типатак?

    это хорошо…

    Но было бы хорошо, если можно было бы сделать «Обвеску», т.е. типа пользователь поиграл с юзерами, закрыл окошко юзеров — а это куда-нить «прологгировалось» — это как-нибудб можно прикрутить? или можно данное окошко «вызывать» не через пункт меню, а как-то иначе?

    Reply
  17. nnvlad

    Замечательно!

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

    Reply
  18. lero@riz

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

    Reply
  19. Robert

    Поточнее пожалуйста. Ни одно меню не отображается? Файл, Помощь? В разных базах разные конфигурации?

    Reply
  20. Robert

    Конфигурации разные в базах?

    Скорей всего, неверно грузится компонента. RWidjets.dll следует грузить ПОСЛЕ 1С++ и ТОЛЬКО в глобальном модуле.

    Проверь этот момент.

    Reply
  21. lero@riz

    спасибо тебе. у меня наверное пальцы кривые.сейчас все работает

    Reply
  22. nikolega

    А на сайте то вирусняяяяяяяяяяяяяяяяк — не переходите по ссылке !!!!

    Модераторы …. где вы ?

    Reply
  23. nikolega

    Имею ввиду про ссылку _http://robert2.by.ru

    Reply
  24. unichkin

    А по аналогии с этим можно вызывать какие-то системные меню? Например, для обработки вызвать меню журнала (поиск по номеру, ввод нового документа)?

    Reply
  25. ManyakRus

    работает отлично 🙂

    Reply

Leave a Comment

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