[GoogleCalendar] ActiveX-компонента для 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='\

26 Comments

  1. Душелов

    Документация оформлена в стиле MSDN

    Reply
  2. Ish_2

    Скриншот , хоть один, стоит добавить.

    Reply
  3. Душелов

    (2) А скриншот чего выкладывать? Гугла? Или проверочной обработки с 1 кнопкой?

    Reply
  4. Ish_2

    А что тут смешного ? Я , например, первый раз вижу такую картинку.

    И первый раз слышу ,что в Гугле есть календарь.

    Пока даже не могу понять как это использовать в 1с .

    Ты того.. ты нас не обижай. Не знающих, не ведающих про ВК и для чего они вообще нужны. «Нас тьмы и тьмы и тьмы..».

    Reply
  5. Gilev.Vyacheslav

    хорошая штука

    Reply
  6. Maxis

    А есть что-то для интеграции с MS Outlook?

    Reply
  7. Душелов

    (6) А что именно? Список событий оутлука получать?

    Reply
  8. afanasko

    Какая шикарная документация! Чем такое можно сделать?

    Reply
  9. Душелов

    (8) Это только для .NET проектов — Sandcastle.

    Reply
  10. Душелов

    Добавил описание самого сервиса 🙂

    Reply
  11. artmicro

    Штука прикольная, но пока нету идей для чего бы интересного ее использовать.

    (9) Такое можно сделать далеко не только для .NET-проектов и не только Sandcastle 🙂

    Reply
  12. Душелов

    (11) Можно, но надо писать 😉

    А для автоматической генерации в 1С — тут совсем тяжко 🙂

    Reply
  13. Yashazz

    Спасибо, буду иметь в виду.

    Хотя мне вот однажды пришлось еврейский религиозный календарь делать, на Гугле всё равно такого нету.

    Reply
  14. DIvanmgn

    народ как освоить эту тему? где почитать азы про ВК?

    Reply
  15. serborisov

    ПолучитьСобытия() Возвращаемое значение

    Массив объектов

    Значит в 7.7 его получить нельзя?

    Reply
  16. Душелов

    (14) Какую именно тему? Может это поможет? http://infostart.ru/community/groups/8/

    (15) ComSafeArray — можно, 1С++ что ли умеет.

    Reply
  17. serborisov

    (16) Пробовал с помощью OLEExSup http://infostart.ru/public/20041/ ,выдает тип данных VT_UNKNOWN

    Подобная проблема обсуждалась в http://www.1cpp.ru/forum/YaBB.pl?num=1234282554/30 .

    «Да, Андрей, расскажи. Я так понимаю, ты получаешь фигурки от компоненты Душелова?

    Пральна.

    И по подсказке trad’а Василий наладил компоненту.

    Теперь все возвращается правильно, VT_DISPATCH»

    Можно ли это решить подобным образом?

    Reply
  18. serborisov

    Пробовал создать событие по примеру.

    Код:

    АтрФормы=СоздатьОбъект(«АтрибутФормы»);

    АтрФормы.УстановитьАтрибут(Форма,»Календ»);

    ТекКалендарь=СоздатьОбъект(«АктивИкс»);

    ОбъектФорма.СоздатьЭлементУправления(ТекКалендарь, «Календ»);

    ТекКалендарь.СоздатьЭУ(«Душелов.GoogleCalendar»);

    Календарь=ТекКалендарь.Объект;

    Логин = «бла бла бла»;

    Пароль=»бла бла бла»;

    Календарь.Идентификация(Логин, Пароль);

    НовыйКалендарь = Календарь.Новый(«Календарь»);

    НовыйКалендарь.Заголовок = «График платежей»;

    СозданныйКалендарь = Календарь.ДобавитьКалендарь(НовыйКалендарь);

    //изменяем заголовок

    СозданныйКалендарь.Заголовок = «График поставок»;

    СозданныйКалендарь.Обновить();

    Календарь.УстановитьТекущийКалендарь(СозданныйКалендарь);

    НовоеСобытие = Календарь.Новый(«НовоеСобытие»);

    НовоеСобытие.Заголовок = «Встреча с поставщиком»;

    НовоеСобытие.Текст = «Не забыть захватить презентации»;

    Местоположение = Календарь.Новый(«Местоположение»);

    Местоположение.Значение = «Москва, ресторан Дурдин»;

    НовоеСобытие.Местоположения.Добавить(Местоположение);

    Период = Календарь.Новый(«Период»);

    Период.Начало = Дата(‘20091127’);

    Период.Окончание = Дата(‘20091127’);

    Напоминание = Календарь.Новый(«Напоминание»);

    Напоминание.Минуты = 1;

    Напоминание.Метод = «email»;

    Период.Напоминания.Добавить(Напоминание);

    НовоеСобытие.Периоды.Добавить(Период);

    СозданноеСобытие = Календарь.ДобавитьНовоеСобытие(НовоеСобытие);

    СозданноеСобытие.Обновить();

    Новый календарь создается, а вот событие нет. Что не так?

    Reply
  19. buzzzard

    А есть ли планы на развитие компоненты?

    Reply
  20. Душелов

    (19) Пока нет.

    Reply
  21. Gamm

    (20) Не удаляются события

    МассивСобытий = ВК.ПолучитьСобытияПоОписанию(ТекстОписания);
    Для каждого Эл из МассивСобытий  цикл
    Эл.УДалить();
    КОнеццикла;
    

    На Эл.Удалить() вылетает Exception

    «{ОбщийМодуль.GАвтоматическиеОповещения(31)}: Ошибка при вызове метода контекста (УДалить): Произошла исключительная ситуация (Dushelov.GoogleCalendar): Execution of request failed: http://www.google.com/calendar/feeds/default/private/full/hid0sgc2r8tnobpfo81l­6e64a8/63403920840»

    Василий подскажи в чем дело.

    Reply
  22. Душелов

    (21) Видимо, гугл изменил API.

    Будем время — посмотрю.

    Reply
  23. Новенький

    Объясните новичку, можно ли работать с сервисом, если у нас инет через прокси? И как это сделать?

    Reply
  24. rasswet

    не перестают меня удивлять такие штуки 🙂

    круто ❗

    Reply
  25. GrafB

    конфигурация УТ 11.1, запустил тестВК в обычном приложении, логин пароль по датам все события и в результате:

    {Форма.Форма.Форма(50)}: Ошибка при вызове метода контекста (ПолучитьСобытия): Произошла исключительная ситуация (Dushelov.GoogleCalendar): Execution of authentication request returned unexpected result: 407

    {Форма.Форма.Форма(19)}: Ошибка при вызове метода контекста (ПолучитьСобытияЗаПериод): Произошла исключительная ситуация (Dushelov.GoogleCalendar): Execution of authentication request returned unexpected result: 407

    пароль проверил верен. может из-за прокси? но вроде где-то в настройках конфигурации указывал.

    Reply
  26. GrafB

    (22) dushelov, получается вообще не было смысла качать? компонента не актуальна и не работоспособна?

    Reply

Leave a Comment

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