Задача. Простая и любопытная




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

30 Comments

  1. awa

    Пишем в табло Константы.Пароль.Получить() — получаем «HelloWorld!))»

    Reply
  2. Serj1C

    (1) Шустрый ты ))

    Reply
  3. tango

    Во внешнюю обработку копируем форму констант и снимаем у реквизита галку «РежимПароля»

    Reply
  4. Serj1C

    (3) Облом. Нарушение прав доступа!

    Reply
  5. Serj1C

    (4) В конфигурации единственная роль с отключенными внешними обработками, отчетами и COM-соединениями.

    Reply
  6. tango

    Да ну? Все равно скачивать твою поставку не буду 🙂

    **

    а табло не отключается?

    Reply
  7. kostia3005

    ХешАвторизации = ПользователиИнформационнойБазы.ТекущийПользователь().СохраняемоеЗначениеПароля;

    ХешАвторизации это SHA завернутое в base64, декодируешь и получаешь счастье 💡

    Reply
  8. Serj1C

    (7) табло и просмотр выражений являются неотъемлемой частью платформы

    **

    По-моему прикольная задачка 😉

    Reply
  9. kostia3005

    ХешАвторизации = ПользователиИнформационнойБазы.ВыбраныйПользователь.СохраняемоеЗначениеПароля;

    ХешАвторизации это SHA завернутое в base64, декодируешь и получаешь счастье 💡

    Reply
  10. Serj1C

    (9) Вход в Предприятие — Администратор без пароля.

    А нам нужна константа ))

    Reply
  11. Душелов

    Ну а еще, думаю, можно через ОЛЕ подсоединиться к этой базе и посмотреть значение константы.

    Reply
  12. Serj1C

    (11) Думаю, нельзя

    Reply
  13. tango

    a DDE?

    Reply
  14. Душелов

    (12) Почему? У пользователя нет прав на ком-соединение?

    Reply
  15. Serj1C

    (14) Да

    Reply
  16. Serj1C

    (13) Аналогично

    Reply
  17. Душелов

    Ну тогда табло, отладчик и т.п.

    Reply
  18. awa

    Плюс за пиар Tool_1CD ))

    Reply
  19. maloi_a

    Зайдите в Отладчик и всё получите.

    1. Зайти в Модуль приложения,

    2. поставить точку останова на оператор ПолучитьОбщуюФорму(Метаданные.ОсновнаяФормаКонстант.Имя).Открыть();

    3. войти в 1С

    4. остановились в отладчике, получаете «HelloWorld!))» всё, что угодно вычислив выражение и без табло.

    Reply
  20. Трактор

    Глупейший вопрос. Ответ очевиден.

    Есть 1001 способ узнать значение константы. Начиная с табло и заканчивая консолью запросов или конструктором отчётов.

    В пофигуратор входить необязательно.

    А за слова

    Первый комент с решением плюсую +))

    хочется поставить минус

    Reply
  21. Serj1C

    (19) Я так же делал, думал мож еще есть идеи? ))

    (20) Ты невнимателен. Консоли запросов и конструкторы отчетов в данном случае проблемно запустить. Расскажи хотябы один из своих 1000 и одного способа, чтобы он сработал.

    Reply
  22. Трактор

    (21) >> Ты невнимателен. Консоли запросов и конструкторы отчетов в данном случае проблемно запустить.

    В чём проблема?

    А решения могут быть такими:

    1. Посмотреть в отладчике.

    2. Если нет прав на данные, но есть конфигурация, то найти в конфигурации функцию в привилегированном модуле которая возвращает эту константу или записывает её куда-нибудь в доступное место. Обратиться к этой функции.

    3. Посмотреть в конфигурации в какие другие переменные/реквизиты копируется значение константы. Порыскать по ним.

    4. Самый надёжный способ: Взять копию базы, снести всех пользователей, стать админом, дать себе достаточно прав и посмотреть таки в табло/консоли.

    Reply
  23. Serj1C

    (22) Так и есть, решение в отладке. Права на данные есть, пользователь и так админ, но прав на внешние отчеты и обработки ему не дашь (вся конфигурация только чтение).

    Аудитория на ИС подкованная, решение видит сразу. Почему бы такое задание, например, не дать на собеседовании? или дополнтельного задания студентам?

    Reply
  24. lcd-boost

    пароль можно посмотреть с помощью опенпасс. наводим курсор на *** и читаем. надеюсь я не повторил чьих либо мыслей:) все посты не читал. всех с новым зулом!!!

    Reply
  25. Serj1C

    (24) Дай ссылку на такой опенпасс, а то мой не подошел.

    Мы об этом думали, как альтернативное решение.

    Reply
  26. fishca

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

    Reply
  27. Niberu

    Не археолог я, просто тема только сейчас на глаза попалась.

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

    В 7.7 в глобальном модуле базы когда-то давно писал функцию и вызывал её из табло у юзеров.

    Функция делала что мне надо с константами и т.п. и возвращала 1 при успехе, 0 при исключении.

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

    Интересно, надо бы попробовать, в 8-ке процедуры из табло вызываются?

    Reply
  28. tango

    (27) Niberu, Табло

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

    Для показа табло выберите пункт «Сервис — Табло».

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

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

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

    Каждая формула вводится в первую колонку таблицы и должна находиться на отдельной строке. Результат вычисления формулы выдается во второй колонке справа от формулы. Если формула введена неправильно, то вместо результата появится фраза «Ошибка в выражении!».

    Результат расчета может быть скопирован в буфер обмена выбором пункта «Копировать результат» контекстного меню второй колонки.

    Для некоторых типов данных возможен просмотр значений в отдельном окне.

    Если в процессе работы исходные данные, используемые в формулах, изменились, то для получения актуальных результатов расчетов необходимо выполнить обновление. Для этого в контекстном меню табло выберите пункт «Пересчитать» или «Пересчитать все».

    прикинь, просто нажать ф1 !

    Reply
  29. Niberu

    (28) я знаю, что вы умный.

    А я писал про юзерское табло в 7.7 в режиме «enterprise».

    Reply
  30. Niberu

    > процедуры из табло ?

    Конечно нет.

    Благодаря вам, tango, мысли из куч по полочкам расставляются.

    Reply

Leave a Comment

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