Удаляем конфиденциальную информацию на платформе 1С:Предприятие 7.7




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

41 Comments

  1. Ёпрст

    не работает для подчиненных справочников..

    Reply
  2. Ёпрст

    +1 исправь на ОбрабатываемыйСправочник.ВыбратьЭлементы(0);

    Reply
  3. tomvlad

    (2) ОК, поправил, спасибо

    Reply
  4. Ёпрст

    И еще, неплохо бы, хотя-бы нумер документов править…

    Reply
  5. Ёпрст

    +4 и Кода у справочников…

    Reply
  6. tomvlad

    (5) А смысл? Перенумераторов хватает. Зато ориентироваться по номерам или кодам будет можно при поиске ошибок.

    Reply
  7. Ёпрст

    (6) Ну, по кодам /нумеру дока влёт восстановишь наименования…

    а вот без них — ужо полный аут..

    А кода-нумера на всех бумажных носителях — прайсы/накладные…

    Reply
  8. Ёпрст

    +7 а так будет свой код/своя нумерация…

    Так точно не докапаются, что базу слил..налево..

    Reply
  9. anbxp

    (7)(8) Так теряется весь смысл обработки. Передают обработанную базу в поддержку, а потом говорят — «косяк в документах с контрагентом «0000100»». Поддержка не знает ни наименования, ни вообще ничего о реальном контрагенте. А как вы предлагаете — никто ничего никогда не найдет:) Смысл?

    Reply
  10. tomvlad

    (8) Скорее всего, для выявления ошибок в клиентских базах, перенумерация не так актуальна.

    Reply
  11. Ёпрст

    (9) Ну как, тупо взять ID например за основу кода… всё лучше, чем открытый код/нумер дока..

    И вообще, смотря для каких целей и кому сливать базу…

    Имхо.

    Reply
  12. Ёпрст

    +11 Еще неплохо бы выкусить период какой нить… а то в оборотке/в регистрах всё самое вкусное и валяется..

    Reply
  13. anbxp

    (12) Что там интересного?:) Был «Газпром», стал «010101».

    Reply
  14. Ёпрст

    (13) Я наковырял прайс и вычислил, что 010101 — это код газпрома… продал васе на 13 триллионов…

    Reply
  15. anbxp

    (14) Откуда наковырял? Есть только обработанная база

    Reply
  16. Ёпрст

    (15) Счет фактура/торг 12 … код клиентоса завсегда можно поднять…

    Reply
  17. anbxp

    (16) Так и представляю сопровожденца-Штирлица:) Для этого надо сгонять в фирму-владельца базы и прошмонать все по боевой базе. Если допустят.

    Reply
  18. Ёпрст

    (17) Нужно просто исключить все лазейки… имхо, а наковырять коды..плёвое дело..

    Reply
  19. anbxp

    (18) Хорошо. Допустим, поменяли все коды справочников и номера документов. Клиент звонит: неправильный расчет НДС в с/ф 100. Как мы ее искать будем? По сумме догадываться?:)

    Reply
  20. Ёпрст

    (19) я предлагал внутренний ID пихать в кода/нумера документов..

    ищется всё не быстро, в очень быстро…

    🙂

    Reply
  21. anbxp

    (20) Т.е. клиент должен сказать: проблемы в с/ф с ID «5X6W»? Или я что-то не понимаю?

    Reply
  22. Ёпрст

    (21) именно… Так по крайней мере — полная конфедициальность, по крайней мере невозможно определить по бумажным носителям ничего…

    Reply
  23. Ёпрст

    +22 Возможно, это паранойя — но я бы делал так..

    Reply
  24. anbxp

    А откуда бух Марья Ивановна узнает об этом ID? Откроет dh*? Или пусть в копии отправленной на поддержку базе найдет свой документ? И еще. Все-таки я не понимаю — откуда появляются бумажные документы?

    Reply
  25. Ёпрст

    (24) Ээхх… узко мыслишь…Кнопочку нажмет — посмотреть ID и привет..

    А бумажный носитель тебе любой торговый даст..

    или магазин..

    и прайс лист с кодами номенклатуры — сама фирма. у который ты базу взял…

    🙂

    Автор же не указал — для каких именно целей и кому он базу собрался таким способом отдавать… мот конкурентам.. для продажи.. да мало ли…

    🙂

    Reply
  26. Ёпрст

    +25 и обработка в 2 строки кода select from where … найдет сам объект по ID

    Reply
  27. anbxp

    (25) 🙂 Если конкурентам — зачем обработка? Чтобы совесть не мучила?:)

    Reply
  28. Ёпрст

    (27) Нет.. обработка — если на поддержку… чтоб когда марь ивановне сказали — ошибка в документе «qwe45» она с помощью обработки нашла документ по ID. ..

    Reply
  29. anbxp

    (28) Это Марья Ивановна должна поддержке сообщить ID документа. Ведь ошибка у нее. А саппорт по нему док у себя в базе найдет

    Reply
  30. Ёпрст

    (29) Ё… я и грю обработка + кнопка… по кнопке посмотрет ID объекта, если нужно по ID найти сам объект — запустит обработку… а кто — не важно…

    Reply
  31. anbxp

    (30) А потом спросит ненавязчиво про код контрагента — и пошло-поехало:)

    Reply
  32. unpased

    не ну на сколько я понял это для аудиторов все верно???

    тогда все каменты выше верны на 100%

    Reply
  33. tomvlad

    (32) Как раз аудиторов это касается менее всего. Просто довольно часто встречаются ситуации, когда для поиска ошибки необходимо предоставить информационную базу. Не всегда это можно сделать без боязни, что твои данные попадут в надежные руки. А получив базу без контактной информации (пустые ИНН, измененные даты рождения или штрих коды) будет спокоен и клиент и доволен внедренец.

    Reply
  34. 1snik

    tomvlad — клевая идея! заморочься уж и для восьмерки сделай, что ли!

    Reply
  35. tomvlad

    (34) Вот как раз для 8-ки делать-то ничего и не нужно. Она уже есть, причем давно, и находится на диске ИТС

    Reply
  36. victuan

    Такую вещь сам планировал делать, а, оказывается, уже есть.

    Reply
  37. 1snik

    (35) век живи — век учись, а дураком помрешь 🙂

    Reply
  38. Variag27

    В чем схожи священник, врач и адвокат?

    Если с ними работают, то выдают им всю информацию без утайки, либо — нет доверия, нет работы.

    Можете добавить к этой тройке внедренца.

    Требовать качественного внедрения закрывая инфу — бред:))).

    Reply
  39. tomvlad

    (38) И кто от тебя чего-то требует? Не всякий клиент пойдет на предоставление информационной базы, например, с черной зарплатой.

    Reply
  40. iov

    как пример… конфа на конфе работали несколько прогеров разного уровня..

    появилась необходимость перенумеровать справочник.. пришёл франч…..

    Все работа встала потому как в 50 строках были явно указаны коды элементов… Я понимаю что кданной обработке это уже не относится но просто имейте ввиду когда будете пользоваться.

    Reply
  41. tomvlad

    (41) Александр, я пардон, сильно извиняюсь, профессионалу не приходилось сталкиваться с тем, что клиент базу отдать не соглашается (намекая на ее ценность), а ошибку исправить требует? Причем на рабочем месте клиента или нет возможности работать или нет условий. Вопросы «стырить» здесь не рассматриваются. А вопрос про инспекцию вообще мог родиться только в воспаленном воображении.

    Reply

Leave a Comment

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