"Троянский конь" или "скрытые" возможности таблиц 1С




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

36 Comments

  1. Свой

    эту бы энергию, да мирных целях 🙂

    Reply
  2. MRAK

    (0) эх… кризис, походу у тебя, раз такой ерундой маешься….

    Reply
  3. Tatitutu

    (2) таки да… зубов нет, зрение ослабло…песок — зато не скользко

    Reply
  4. larisab

    (0)

    На этом мой «курс» по EXCEL на этом сайте заканчивается — больше не буду отвлекать Вас от важных дел. Я всем сердцем понимаю , что Вы это все безусловно знаете и знали еще тогда когда солнце было молодым, но все равно напишу хоть для себя , чтобы не забыть

    Нет, многие не знают. Многим нужно. Это прекрасная серия статей. Продолжай, пожалуйста!!!

    Reply
  5. MRAK

    (4) 😀

    Reply
  6. larisab

    (1)(2)

    Лукавите, господа! Часики и рабочие столы вам не кажутся такими уж бесполезными 😉 Про иконки я уже не говорю — это вообще хиты 😀

    Reply
  7. ded00786

    Ща добрые люди наплодят макровирусов из 1С 😀

    А статья — отличная, кратко и по делу….

    Reply
  8. Kertman

    Долго искал применение к екселю и на тебе на блюдечке, с синей каемочкой. 🙂

    Reply
  9. Tatitutu

    (8) что искал — расскажи (подскажу) или вместе запустим

    Reply
  10. Доня

    Ставлю плюс

    Поигралась чуть-чуть, но для меня это пока сложно, надо долго доходить.

    Даже такие возможности, как вставка в таблицу «екселя» уже заманчиво.

    Програмного язака я не знаю, а вот в XLS работаю давно.

    Это конечно мне пригодиться.

    Спасибо

    Reply
  11. Димча

    Да. 1С без окружения — это уже не интересно.

    Однозначно полнезная информация !!!

    Reply
  12. Доня

    Автору:

    Теперь при входе в XLS всегда высвечиваетсч панель Формат_1С

    А как ее убрать совсем

    Я убираю через сервис/… а при новом открытии XLS она опять есть

    Куда зайти и удалить ее, где она прячестся?

    Она мне мешает пока

    Reply
  13. marsohod

    Доходчиво 🙂

    Как бы не началось движение 1С-хак 😀

    Reply
  14. CheBurator

    за код

    имяпапки=»c:ljrevtync унд сеттингс итд «- тебя рас пять надо…

    Reply
  15. CheBurator

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

    http://www.infostart.ru/public/14134/

    1.0 (17.10.2005, выложена в общий доступ), на Исе 08.06.2006 — сделал по решению Абрахамса — голову ломал минут 10…

    Reply
  16. Арчибальд

    (14)

    тебя рас пять надо…

    😳

    Reply
  17. Tatitutu

    (12) посмотри код — так указан путь как пишет уважаемый (14)

    и там удалите файл Personal.xls — это и есть личная книга макросов.

    (14) я понимаю Вашу агрессию, но чем она вызвана ))) — это пример

    ту строчку Имяпапки …. мог бы написать 16 -ю различными способами

    — пример из (12)

    Reply
  18. gaglo

    …разоблачение магии все-таки наступило! Рад. Доволен. Пишите ещё. Да побольше!

    Reply
  19. WKBAPKA

    Статья однозначно полезная. Автору плюс

    Reply
  20. Доня

    (17) Прошу, напишите мне путь дословно, не могу найти!

    Reply
  21. Tatitutu

    (20)

    Как удалить панель РАЗ И НАВСЕГДА

    е EXCEL правой кнопкой по любой панели инструменов (например по слову «файл»)- настройка — Панель инструментов — выбрать «Формат_1С» удалить.

    удалить вот этот файл:

    «C:Documents and SettingsВАШЕ ИМЯ ПОЛЬЗОВАТЕЛЯApplication DataMicrosoftEXCELXLSTARTPERSONAL.XLS»;

    или

    Запустить обработку из шапку «Удалить книгу макросов»

    Reply
  22. strax

    это шутка такая Новогодняя ? — ведь этого не пожет быть в принципе

    можнаж скорее всего

    на третьем рисунке в коде написано

    Привет посетилю , а на пятом рисунке уже Привет посетителю

    Но развод прикольный, если бы все мечты были явью

    Reply
  23. Tatitutu

    (22) Ну что за люди ?

    Какой монтаж где и причем тут развод ?

    Reply
  24. maljaev

    (22) Что конкретно тебя удивляет? И о чем твои мечты? Аффтару респект, всё вроде как логично но мысль внедрять макросы в объекты почему-то не приходила. Люблю я всякие извраты, но чисто в порядке хобби.

    Reply
  25. Tatitutu

    (24)

    Люблю я всякие извраты, но чисто в порядке хобби

    ну вот прям, мою мысль озвучил. Спасибо

    Reply
  26. Lars Ulrich

    классно 🙂 плюсик

    Reply
  27. vesax

    Автор, продолжай.

    Reply
  28. vligm

    однозначно плюс.

    Reply
  29. Tatitutu

    (28) ну как интереснее стало, что сам нашел и без подсказки ?

    Reply
  30. vligm

    (29) конечно!

    Reply
  31. Шёпот теней

    ТиТаТуТу … не могу тебе написать сообщение в личной карточке…. выдаЁт ошибку …

    … всЁ хорошо ..? … всЁ хорошо..! …

    … рад за тебя … с Уважением к тебе Александр Шишкин (Шёпот теней) …

    … вот …

    Reply
  32. Джиневра

    Спасибо, спасибо. Как раз искала: как обратиться программно к объекту Лист Эксель. А все — как всегда — легко и просто оказалось 🙂

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

    ЗЫ. Да, и про 25-й релиз я в курсе… ну просто: вдруг нет возможности обновиться, а использовать вертикальный текст хочется… тогда можно и этим объектом обойтись 😉

    Reply
  33. int18h

    Гыг… Эдак подытожу за всех: колбасим оле злой мегакулхацкерскийсуперсистемадробильныйпаролетырующий сервер тарим гденть затем ваяем инклудер автоматом интегрирующий оле объект в мxl… Конфикер курит, убыдки миллиардные, бухи пачками стреляются и выкидываются из окон… И наступит АРМАГЕДОН. 🙂 (дядь Жень матай на ус…)

    Reply
  34. modul

    Я так понял сдесь описана работа с оле объектом.

    Reply
  35. Zergil

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

    Reply
  36. CheBurator

    Это и еще куча всего, что делает 8-ку совершенно ненужной %-)

    http://infostart.ru/public/15540/

    Reply

Leave a Comment

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