Поздравление с Новым Годом 2010 для 1С 8.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='\

30 Comments

  1. shaganel

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

    Reply
  2. Аmazonkа
  3. dobraleks

    прикольно.. 😀 ..

    Reply
  4. fikuz@mail.ru

    Все работает, отлично. Правда, считает странно 🙁 . Пишет «Сегодня 29 декабря. До Нового года осталось 1 дней». Это по-нашему стопудово 😀

    Reply
  5. artbear

    Версия 1.2

    — исправлен подсчет дней до НГ — Спасибо (4)

    * доработан показ дней (1 день, 2 дня, 5 дней и т.п.)

    Reply
  6. oberonm

    Молодец

    Reply
  7. e-katerina

    Отлично! 😀

    А что касается идей: кол-во дней до нового года можно сделать бегущей строкой, а при открытии волшебник выдает небольшое «предсказание» методом случайного выбора.

    Reply
  8. AKV77

    Спасибо, сделано со вкусом

    Reply
  9. kenshin

    Я б все таки тигра оставил на первой картинке, год тигра как ни как

    Reply
  10. kenshin

    http://infostart.ru/public/61649

    В тексте ошибки насчет года 20010

    Reply
  11. kenshin

    {Форма.Форма(67)}: Ошибка при вызове метода контекста (Speak): Произошла исключительная ситуация (Agent.Control.2): Параметр задан неверно.

    гПерсонажАгента.Speak(наименование);

    по причине:

    Произошла исключительная ситуация (Agent.Control.2): Параметр задан неверно.

    при повторном нажатии на поздравления ошибка вылазить подправь и будет счастье

    Reply
  12. artbear

    (11) Спасибо. Посмотрю

    ЗЫ вроде все тестил 🙂

    Reply
  13. artbear

    (10) Не понял, ты про что написал?

    Reply
  14. artbear

    Выложена версия 1.2.1 — исправлена ошибка при работе с поздравлениями.

    (11) Исправил

    Reply
  15. strange2007

    СУПЕР!!!!!!!!!!! Как я раньше не догадался?

    Reply
  16. elisabet

    все прикольно, но только у нас год будет 2010, а не 20010 как у автора в одной примете, а так «+»

    Reply
  17. KIT_VIA

    Большое спасибо, очень понравилось всем клиентам!!!

    Reply
  18. aipnnov
    Для новичков — для использования при начале работы пользователей необходимо в модуле приложения конфигурации 8.1 в процедуре ПриНачалеРаботыСистемы добавить следующий код:

    Если НачалоДня(ТекущаяДата())= НачалоДня(Дата(2009,12,30)) ИЛИ НачалоДня(ТекущаяДата())= НачалоДня(Дата(2009,12,31)) Тогда
    Попытка
    Открытка = ВнешниеОбработки.ПолучитьФорму(«W:артПоздравлениеСНовымГодом_2010.epf», «Форма»);
    //Открытка = Обработки.артПоздравлениеСНовымГодом_2010.ПолучитьФорму(«Форма»);
    Открытка.Открыть();
    Исключение
    //ОписаниеОшибки()
    КонецПопытки;
    КонецЕсли

    Показать

    По моему лучше этот код добавить в модуль самой обработки, а обращение к ней добавить в любой общий модуль, который вызывается из модуля приложения ПриНачалеРаботыСистемы, например в ЗавершениеРаботыПользователей -> УстановитьКонтрольРежимаЗавершенияРаботыПользователей() и конечно же между операторами препроцессора #Если Клиент Тогда и #КонецЕсли.

    Это гораздо лучше т.к. можно добавлять в обработку любой праздник.

    Reply
  19. artbear

    Выложил обработку в свободный доступ для всех — качайте сколько хотите 🙂

    (18) Я специально написал «для новичков».

    Более опытные разработчики могут придумывать различные варианты 🙂

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

    Reply
  20. DarkSign

    А что-то не стартует оно при загрузке. Модуль поправил, права есть, интерфейс соответствует. Работает только с пинка, т.е. вручную…

    Reply
  21. welik

    Спасибо, идея очень нужная. Пошлые анекдоты пришлось удалить. ))

    Reply
  22. TLS

    Спасибо большое, поставила, наших порадовала )))

    Reply
  23. DanilovaOlga

    Просто СУПЕЕЕР!!!! Пока всё работает! СПАСИИИБО!!!! От восторга прям распирает ))) :{}

    Reply
  24. artbear

    (23) Всегда пожалуйста! 🙂

    (21) Насчет пошлых — пока никто не жаловался, тем более, что самые пошлые я предпочитаю рассказывать лично уже самым достойным 🙂

    Reply
  25. artbear

    (20) Случайно хранилище не юзаешь? У меня лично была проблема, когда в конфу, подключенную к хранилищу, я пытался загрузить данный файл как обработку. Забыл флаг рекурсии поставить, и в итоге форма не грузилась.

    Больше никаких проблем не было, как видишь, никто не жалуется, ищи у себя 🙁

    Или пиши более подробно.

    Reply
  26. DanilovaOlga

    До сих пор наши вспоминают этот подарок под Новый год )) никто не работал, все анекдоты читали ))

    Reply
  27. DanilovaOlga

    Ждем на 2012 год ))

    Reply
  28. DanilovaOlga

    Наши уже спрашивали ))

    Reply
  29. artbear

    Спасибо!

    Подумаю.

    Reply
  30. milkers

    (0) Поздравление на управляемых формах https://infostart.ru/public/960899/

    Reply

Leave a Comment

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