BDD в 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='\

19 Comments

  1. Silverbulleters

    ссылка на Google табличку — Расчет окупаемости

    Reply
  2. orefkov

    Дико извиняюсь, но имхо, приведенный пример не сильно отличается от «2 + 2».

    Сгенерировалась какая-то обработка, но как её использовать дальше в конфигурации — совершенно непонятно.

    И не превратится ли разработка стройного внутреннего устройства (архитектуры) решения в тупое рефлексирование сиюминутных хотелок заказчика в индусо-спагетти-стайл?

    Reply
  3. orefkov
    С ее помощью IT-специалисты могут производить демонстрацию функциональности заказчику: они загружают фичу в feature-плеер, нажимают кнопку, и начинают появляться окошки, где автоматически вводятся данные, проводятся документы и пр.

    Вот эта вот магия и непонятна.

    Из вашего же примера первый шаг — «Клиент Контрагент хочет оплатить сумму 2000 рублей». Как фиче-плеер это обработает? Он как поймет, что это надо создать банковскую выписку или ПКО с нужным контрагентом и поставить там сумму 2000? Тут какая -то магия сработает или как-то это надо особо интегрировать со своей конфигурацией и учить фиче-плеер этому?

    Reply
  4. orefkov

    По поводу «Выполнено», «Не выполнено» и «В ожидании реализации»

    Если я напишу реализацию в виде

    Процедура ФормируетсяПроводкаАвансаПоСчетуТрамПамПам()

    Сообщить(«Реализовано. Честно-Честно»);

    КонецПроцедуры

    она зелёненьким засветится в отчёте?

    Или какой-то магией поймёт, что результатом должно быть появление проводки и её таки нету?

    То есть как от фич перейти к конкретным натурным тестам?

    Reply
  5. nixel

    @orefkov вы как будто выпали из всего потока информации по VB.

    2) Запускать и проверять поведение, очевидно

    3) Фича-плеер отработает то, что написано в фиче. Никакой магии тут нет. Есть библиотечные шаги, которые кликают по раз

    Reply
  6. pumbaE

    (4) orefkov, да, честность реализации — это и есть главное правило. Но даже когда есть описание шагов, уже более ясно, что ожидается от системы, т.к. чаще всего сталкиваемся с задачами устно или «вот тут на 5 минут, а через пол года уже никто и не вспомнит».

    Reply
  7. orefkov

    (5) nixel,

    вы как будто выпали из всего потока информации по VB.

    По началу статьи создалось впечатление, что её цель как-раз таки помочь «войти в поток».

    Фича-плеер отработает то, что написано в фиче. Никакой магии тут нет. Есть библиотечные шаги, которые кликают по различным кнопкам интерфейса и заполняют формы. Есть не библиотечные шаги, которые вы описываете сами.

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

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

    И как потом это состыковать с обработкой проведения например.

    Reply
  8. Pr-Mex

    (7) orefkov,

    Ни в какие библиотечные шаги попадать не надо.

    Саш, посмотри мой вебинар по VB, многие вопросы пропадут.

    http://infostart.ru/webinars/537546/

    Эта статья обзорная. Больше практики ищи в видео.

    Reply
  9. HAMMER_59

    Хорошо когда задачка такая маленькая.

    В реальности проблемы возникают не в разговоре на разных языках, а в объёмах информации.

    13 на 6 многие легко перемножат, что совсем не означает, что также легко они перемножат 324655 и 348.

    Отсюда вытекают проблемы тестирования, параметров — много, а сочетания параметров — очень много.

    Например, IDEF0 как раз помогает сложную задачу декомпозировать на легкие задачи, которые понятны и заказчику, и программисту.

    Вспомнил пример преподавателя на предмете моделирование:

    — Вам табуретку с какой точностью сделать?

    — С лучшей. (прямо как в статье, сейчас мы вам все протестируем)

    Какая там лучшая сейчас точность? Микрометры? Точно нам нужна табуретка с такой точностью?

    Reply
  10. gubanoff

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

    Пока это из серии «тем временем в параллельной вселенной» — не верится, что где-то это реально работает, но выглядит очень круто.

    Reply
  11. Pr-Mex

    (10) Приходите на мой доклад на инфостарте. Будут и примеры и ещё более «крутые» штуки.

    Reply
  12. webester

    (8)Сложновато осилить с первого раза. Больше пауз, богу пауз! ЭЭЭ.. нууу.. эммм… нуууу…. собственно… ну давайте…. постоянно в неограниченном количестве, мб имеет смысл написать сценарий и сверяться с ним со второго монитора? Постоянно примеры «давайте напишем простой сценарий, который не будет иметь ничего общего с реальностью и никаким образом не будет демонстрировать как все должно происходить» мб я не дожил (осилил первые40 минут только) до нормальных примеров? Как насчет нормальных примеров запилить? Похожих на обычную разработку? Не хочется обижать Леонида, он наверняка старался, но как то не бодро совсем получилось, в видео на канале чуть бодрее, но там тоже примеры «из воздуха».

    Reply
  13. Pr-Mex

    (12)Буду стараться развиваться как ведущий.

    Не совсем понятно что такое «нормальные» примеры.

    Вебинар обзорный, по конкретному инструменту. Показывает как им пользоваться.

    Reply
  14. Glebis

    Как я понял суть: предлагается способ динамического формирования ToDo листа, который разработчик предоставляется заказчику на понятном бизнесу языке (в виде таблицы) и воспроизведением демонстрационной последовательности действий прямо на форме 1С.

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

    Reply
  15. Serg O.

    Подскажите Vanessa-Behevior только для 8.3.9 и выше? Для 8.2 будет работать?

    xUnit и СнегоПат работает и для 8.2

    Думаю еще многие на 8.2.19 сидят

    Reply
  16. artbear

    Да, для 8.2 работает.

    Просто для 8.2 нет, например, авто-тестирования форм и кнопочек, которое появилось только в 8.3

    Все остальное работает

    Reply
  17. AKnyazkov

    (10)

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

    Reply
  18. ZOMI

    Просто космос

    Reply
  19. Pr-Mex

    Вот статья с похожим подходом — только про мобильные приложения

    https://habrahabr.ru/company/alfa/blog/335278/

    Reply

Leave a Comment

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