Симулятор 1С-ника




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

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

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

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

    Какого такого фрилансера. Начинают часто с развоза ИТС )

    Reply
  2. baton_pk

    Похоже, работа в пятницу закончилась… 🙁

    Reply
  3. ololoanonim

    (2) baton_pk, круто же

    Reply
  4. baton_pk

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

    Reply
  5. Serovkir

    (4) baton_pk, Дааа, с этим как раз проблемы и возникли. Дело в том, что обработчик ожидания работает всегда по разному, поэтому время нельзя посчитать точно. Ещё заметил такую штуку, что если неистово жать на любую точку формы то все обработчики ожидания начинают работать быстрее. Это Вам чит))

    Reply
  6. baton_pk

    ААА! Прорисовка адово затупила!

    Reply
  7. baton_pk

    Всё, сдохло. Снял задачу. Видимо, задерзил на рынке и пацаны пришли.

    Reply
  8. Serovkir

    (7) baton_pk, Такое тоже было один раз, я тогда упростил состав формы (убрал группы лишние), вроде помогло. Смог дойти до конца игру. На какой платформе пробовали? Такси или УФ?

    Reply
  9. yukon

    Даешь код на гитхаб!

    Reply
  10. baton_pk

    (8)

    8.3.5.1443, такси.

    Reply
  11. Xershi

    На такси сдохла форма, на УФ пока все ок.

    Reply
  12. baton_pk

    Зачем там восемь(!) обработчиков ожидания, которые делают почти одно и то же?!

    PS. АААА! И каждый доступность элементов меняет!

    Reply
  13. Serovkir

    (12) baton_pk, «Во-вторых, будут ли стабильно работать около 10-ка обработчиков ожидания, запущенные одновременно.» — это из статьи. А так сначала было в планах засунуть в один обработчик, но получилось так массивно, что всё тормозило. Поэтому и разделил. А с доступностью элементов я немного не понял, я не встречался с тем, что изменение доступности как-то тормозило. Да и сервер не вызывается при изменении. Просветите пожалуйста)

    Reply
  14. baton_pk

    (13)

    просто, просто куча-кучу ненужных действий.

    PS. запустил на управляемых. авось тут дойду до конца.

    Reply
  15. makas

    …. ах, да, вспомнился по данной теме Анекдот 🙂

    Reply
  16. baton_pk

    УФ, 7 уровень, полёт нормальный, ничего не лагает. правда, форму пришлось в конфигураторе подрихтовать (только внешний вид, не читил!)

    Reply
  17. fjay69

    Когда я был в двух шагах от Штата программистов, всё сломалось. Повторный запуск не помог. 8.3.5.1383 Такси.

    Reply
  18. Xershi

    На УФ стабильно все купил щелкает на ура конфа БСП платформа 8.3.5.1248. На БП3 в «Такси» начинаются глюки с отрисовкой, а затем вовсе виснет.

    Reply
  19. baton_pk

    Всё! Нанял БГ на работу! УФ, 8.2.19.83.

    Reply
  20. baton_pk

    Такси проиграла этот стресс-тест!!!

    Reply
  21. yukon

    (13)

    А так сначала было в планах засунуть в один обработчик, но получилось так массивно, что всё тормозило.

    Ничего не массивно:

    Процедура Процессинг()
    Для Каждого Уровень из ДанныеУровней Цикл
    ДанныеУровня = Уровень.Значение;
    ИмяУровня = Уровень.Ключ;
    
    Если ДанныеУровня.Выполняется Тогда
    ПроцессингУровня(ДанныеУровня);
    ЭтаФорма[«Состояние»+ИмяУровня] = ДанныеУровня.Состояние;
    КонецЕсли;
    КонецЦикла;
    УправлениеФормой();
    
    ПодключитьОбработчикОжидания(«Процессинг», 0.1, Истина);
    КонецПроцедуры

    Показать

    Reply
  22. asved.ru

    А на 8.3.6 стабильнее работает или так же?

    Reply
  23. PrinzOfMunchen

    (22) asved.ru, так же. Потестил, тоже форма полетела уровне на 5 (Такси). Но идея прикольная. Автор молодец.

    Reply
  24. kalaratra

    (23) PrinzOfMunchen, Такси зло!))))

    Reply
  25. kalaratra

    (5) Очень классная игра) Особенно когда начальство не дремлет, а делать нечего)

    Всегда можно оправдаться нагрузочным тестированием)

    Reply
  26. dj_serega

    За идею плюс. Скачать еще решаюсь 🙂

    Reply
  27. Программулькин

    За идею и реализацию — плюс, сделай что-нибудь с показателями заработка за единицу времени.

    Как нуралиева нанять? денег миллиард уже, а кнопка нанять не активна.

    Reply
  28. Программулькин

    на такси зависает )))

    Reply
  29. for_sale

    вы бы описали в статье, что за игра, что надо делать, скриншотов > 3 выложили бы. А то качать кота в мешке — не очень.

    Reply
  30. Dvornik

    Когда считается, что ты прошел/победил?

    Reply
  31. DAnry

    В 1С работать надо. А играть (для разрядки, отдыха и т.д.) надо в нормальные профессионально сделаннные игры. Хотя учитывая специфику работы програмиста (или пользователя) 1С, лучшим отдыхом считаю активный.

    Reply
  32. baton_pk

    (31) DAnry,

    лучшим отдыхом считаю активный

    а ещё лучше экстремальный — нервишки сталью покрывает.

    Reply
  33. flintic

    Скачал, немного подправил форму, и… забил на работу!!!

    Reply
  34. fillin

    Круть!

    Reply
  35. dj_serega

    Я бы добавил паузу. А то фрилансить когда у тебя уже сеть франчей работает в 5м уровне не сильно хочется :-))

    Reply
  36. dj_serega

    Ну… день времени… результат.

    Хорошо что есть манагеры… Пол дня работали… Пришел, снял бабло и дальше работать :-))))

    Reply

Leave a Comment

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