Альтернативный "хоткейный" стартер 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='\

35 Comments

  1. Душелов

    А еще стоит добавить ведение логов + задания по расписанию. И можно сделать в виде сервиса

    Reply
  2. sound

    (1) с этого момента поподробнее 🙂

    Reply
  3. Душелов

    (2) Что именно?

    Reply
  4. sound

    (3) ну для чего логи то, что в них писать? И зачем сервисом? Оно и так само умеет запускаться, а на сервер я такое ставить не стану, да и регламентные задания для этого есть. Насчет расписания можно подумать, но сейчас у меня нет поддержки ключей пакетного режима конфигуратора, мне кажется что если уж делать запуск по расписанию, дак именно для пакетного запуска. В общем, я пока сути не догоняю 🙂

    Reply
  5. sound

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

    Reply
  6. sound

    Исправил

    Reply
  7. dj_tol

    А можешь сделать чтобы группы были, это очень удобно

    Reply
  8. sound

    (7) что ты имеешь ввиду?

    Reply
  9. dj_tol

    в трее нажимаешь а там элементы и группы в группах ещё елементы

    Reply
  10. sound

    (9) подпункты меню сделать конечно можно, только я практической пользы не вижу. Это как: типа у меня есть группа баз например относящиеся к одной организации, и у каждой организации есть еще список только «своих» баз чтоли? Переделывать структуру базы, чтобы список был не линейным, а с подчиненными таблицами. Или просто группировать отдельные базы по какому то признаку и назначать этой группе произвольное имя?

    Или я не так понял?

    Reply
  11. YVolohov

    удобная вещь, плюс однозначно

    Reply
  12. coder1cv8

    1. Нет возможности просто указать командную строку, на закладке «Ключи», как я понимаю?… Например у меня уже есть инструмент для генерации ком. строки 🙂 и я хочу вставлять готовую, в независимости от поддерживаемых в данный момент ключей.

    2. Я думал это возможность повесить запуск конкретных баз на настраиваемые хоткеи 🙂 Например Alt + 1,2,3,4

    Иначе в чем смысл? В иконке в трее?… В таком случае, стандартное окно выбора баз, ИМХО, удобнее…

    Reply
  13. sound

    (12)

    1. Возможность вручную вводить всю строку специально нет и не планировалось. Можно сказать что был сделан упор на то, чтоб не «светить» пароль. Если у тебя есть инструмент для генерации ком. строки, значит ты и так крут и тебе эта программа точно не пригодится.

    2. А если у меня 30 баз, я должен в голове держать все хоткеи? Имхо, ни к чему.

    А смысл, по крайней мере для меня, в хоткее и выбора из списка и в шифте при запуске (нажатом или нет). А иконка в трее — это так понт 🙂

    Reply
  14. sound

    (12) Теперь я понял почему ты так отреагировал 🙂

    http://infostart.ru/projects/2803/

    http://infostart.ru/projects/2514/

    ну и т.д.

    Как это чувство называется не помню 🙂 Мог бы просто ссылками поделиться, я бы поглядел, я ж не претендую на уникальность решения 🙂

    Reply
  15. dj_tol

    ну я имею ввиду как в стандартно 1с 8, там можно создат группы например файлоые базы и SQL базы ну и т.д.

    Reply
  16. sound

    (15) Дошло, слушай а я реально этими штуками никогда не пользовался 🙂

    Reply
  17. sound

    (15) Это типа если нажать кнопку «Настройка» и поставить галку «Отображать в виде дерева» так?

    Reply
  18. coder1cv8

    (14) наверное это чувство называется черной завистью??? )))

    Вот так за замечания по делу, чуть завистником не обозвали ))

    Мне действительно кажется, что можно для «продвинутых» пользователей добавить возможность подредактировать командную строку непосредственно. А уж возможность закрепить за 2-3-мя часто используемыми базами хоткеи — это само название утилиты велит! )

    Reply
  19. sound

    (18) Люблю не обидчивых людей с чувством юмора 🙂

    Будет тебе белка, будет и свисток (С) 🙂

    Надо будет на досуге подумать над всеми предложениями.

    Может тогда кто-нибудь знает как разобрать слово по составу, ну то есть описание файлика ibases.v8i? А то ничего путнего про него найти не могу и сам не все параметры понимаю чо там к чему.

    Reply
  20. sound

    (18) Я сначала кстати вообще хотел, чтобы все ключи были в отдельной таблице. Т.к. они от версии к версии могут меняться/добавляться/упраздняться, уж ты то должен это знать:), а потом при изменении названия ключа или параметров к ключу просто изменять (и т.д.) их название. Но потом форму динамически красиво нарисовать не получилось, пришлось отказаться в пользу жесткой прошивки. И поэтому чо то мне кажется, что не очень то тогда уж и нужно менять что-то руками, тем более опять же пароли светить!

    А насчет запуска по хоткею отдельных баз подумаю

    Reply
  21. coder1cv8

    (19) Здесь на ИС есть пример разборки файла ibases.v8i с группировками и т.д.

    (20) У меня в «Конструкторе параметров» посмотри как сделано, там и файлик xml отдельный с параметрами есть… )

    ЗЫ: Плюс авансом 🙂

    Reply
  22. sound

    (21) ну наверно сделаю потом, но точно не в рабочее время 🙂

    Reply
  23. sound

    (21) Добавил хоткеи на запуск любой базы, правда писал уже ночью, но вроде работает :), попробуй плиз

    Reply
  24. sound

    и еще бару багов нашел до кучи 🙂

    Reply
  25. salexdv

    Предлагаю вместо окна запуска (CTRL+SHIFT+F12) показывать popup как в трее по центру экрана 😉

    Reply
  26. salexdv

    Я вообще сделал при нажатии на среднюю кнопку по позиции курсора всплывающее меню — очень удобно. Рекомендую 😉

    Reply
  27. sound

    (26) типа сижу я такой в браузере, нажал на среднюю кнопку и тут любимая 1С? 🙂 Так чтоли?

    Reply
  28. salexdv

    Конечно 🙂 Нее, можно конечно добавить список приложений, в которых такая фишка работать не будет, но это уж совсем если правильно делать 🙂

    Reply
  29. sound

    (28) Конечно можно, а разве есть что-то такое что нельзя? 🙂 Только нужно ли? Мне лично нет 🙂 По моему и этой функциональности хватает (см название). А по потом получится как в Nero: писали дисковую тулзятину, а написали операционку 🙂

    Reply
  30. salexdv

    Но предложение то внести можно было попробывать? 🙂

    Reply
  31. sound

    (30) да не, я как бы согласен, это я просто так тупо отмазался 🙂

    Reply
  32. salexdv

    31) Отмазка принята :))))

    Reply
  33. sound

    (32) Спасибо, а то работать надо 🙂

    Reply
  34. salexdv

    Посмотри личку, плз

    Reply
  35. sound

    (34) посмотрел

    Reply

Leave a Comment

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