Особенности работы платформы 1С с СУБД OracleDatabase




Принцип обмена данными из 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='\

45 Comments

  1. zavedeev

    Автор, а если оракл использовать на винде, то смысла вообще нет, так как появляется больше минусов чем плюсов и проблема в разработке.

    Reply
  2. DoctorRoza
    А в других случаях лучше обойтись MSSQL.

    Основной и главный вывод! 🙂

    Reply
  3. h-rx

    Огромное спасибо за статью, очень основательный подход, такую сразу в закладки)

    Не соглашусь только в 2х вещах:

    1. DBA на MsSQL и на ~200х пользователях еще ни разу не понадобился, вообще. Даже мысли не возникало никогда о его необходимости

    2. Обзывать постгрес проектом для энтузиастов — крайне забавно.

    Reply
  4. comol

    (1) zavedeev, Нуу… на Windows с Oracle конечно не всё так ужасно как может показаться на первый взгляд, это всё-таки не 1С на Linux :). Просто куча мелких деталей говорит что Oracle на Windows это не Enterprise уровень…. Но SE One с 50+ пользователями вполне, если плюс в том, к прмеру, что Oracle уже куплен 🙂

    Reply
  5. comol

    (3) h-rx,

    DBA на MsSQL и на ~200х пользователях еще ни разу не понадобился, вообще

    Да все привыкли обходиться без DBA, но ИМХО это не совсем правильно. Разработчик должен заниматься разработкой… Очень часто MS SQL бывает «запущен» так что у грамотных администраторов «Волосы встают дыбом», не говоря уже о том что пользователи страдают… А если говорить о SLA то всем становится грустно… 90% 1С решений с 200+ пользователями не используют даже Fail Over кластер… в лёгкую MS SQL ставят на виртуальные машины… даже модель резервного копирования Simple можно встретить… Не, DBA нужен, даже если «можно обойтись» без него.

    Reply
  6. comol

    (2) DoctorRoza, Ну всё-таки в контексте… в контексте… Хотя бы надо оценивать потребность в кластеризации…

    Reply
  7. DoctorRoza

    (6) подскажите, пожалуйста, какой примерно может быть выигрыш в шекелях от использования СУБД Oracle, исходя только из расходов на системного администратора, относительно администратора, знающего MSSQL? 🙂

    Reply
  8. comol

    (7) DoctorRoza, Вопрос как я понимаю риторический. Проиграем раза в 2-3 минимум :). Но подскажите пожалуйста как вы будете использовать СУБД MS SQL если у вас в одной базе работает 3-4 тысячи пользователей, при этом это не бухи, а операционка? Купите мэйнфрейм и поставите на него один MS SQL? При этом MS SQL-овский FailOver всё равно скинет вам всех пользователей при переключении…

    Reply
  9. Gilev.Vyacheslav

    (8)

    как вы будете использовать СУБД MS SQL если у вас в одной базе работает 3-4 тысячи пользователей

    да вообще то работают

    оракл «валиться» на временных таблицах, называть его «ентерпрайз решением под 1С» язык не поворачивается

    Reply
  10. comol

    (9) Gilev.Vyacheslav, Ну это очень «смелые» клиенты… которые вам доверяют :)… Когда вы будете вести дискуссии с не 1С специалистами, использование не кластерной СУБД им аргументировать будет очень и очень сложно….

    ну у Oracle есть «особенности» которые «немного не так как хотелось бы» сделали в 1С, и временные таблицы тут не самое страшное… Конечно для «Enterprise» придётся в решении очень и очень много перерабатывать…. я думаю вы же со мной согласитесь что временные таблицы это не панацея на все случаи жизни а вложенные запросы это не абсолютное зло…

    Reply
  11. Gilev.Vyacheslav

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

    смелые не смелые, а работает

    Reply
  12. comol

    (11) Gilev.Vyacheslav, Генерирует конечно… но не в каждом запросе… это уже «не убийственно» ИМХО.

    1С то как раз не проблема убедить запускать: формально 1С — отказоустойчивый кластер HA с балансировкой нагрузки… А вот с MS SQL уже хуже… MS SQL кластер весьма «условно», притом направление развития судя по всему не в эту сторону… вместо кластеризации появляется «в дань моде» in-memory…

    Reply
  13. Gilev.Vyacheslav

    (12) не можете запустить на скуле масштабируемое решение — обращайтесь к нам, все организуем

    Reply
  14. comol

    (13) Gilev.Vyacheslav, Сделаете кластер на MS SQL? О_о может вам тогда Microsoft-у предложить свои услуги :). Там где MS SQL и более 1000 пользователей там РИБ и никуда от него не деться… На Oracle пока просто не решили… может ещё годик другой и 1С с ним будет «душа в душу работать»… но пока это тоже не Enterprise…

    Reply
  15. Gilev.Vyacheslav

    (14) может удивлю, но с Microsoft мы плотно работаем http://www.gilev.ru/results/

    Там где MS SQL и более 1000 пользователей там РИБ и никуда от него не деться…

    а ты где был на инфостарте, когда люди про 5000 на скуле в «Деловых линиях» рассказывали, спал? )))

    Reply
  16. comol

    (15) Gilev.Vyacheslav, Нее… ну это «самые смелые» 🙂 там много «интересного порассказали» :).

    но с Microsoft мы плотно работаем

    так когда в MS SQL появится кластер? 🙂 Люди из софтпоинта уже даже какой-то HandMade на эту тему сделали…

    Reply
  17. zarucheisky

    (0)

    >>ORACLE – это продукт, который изначально разрабатывался под LINUX

    Дальше можно не читать. Скорее всего, автор больших проектов с использованием СУБД Oracle в глаза не видел.

    Reply
  18. comol

    (17) zarucheisky,

    автор больших проектов с использованием СУБД Oracle в глаза не видел.

    . не то чтобы автор не видел, а их просто нет. Это выясняли специально — искали специалистов. :))))). Ну по крайней мере на момент написания статьи (2 года уже как) не было… наш должен был быть первым такого масштаба…

    Дальше можно не читать

    Нуу… я тоже не фанат *nix. Но это абсолютно не значит что если речь идёт о решениях на этой системе все они заведомо плохи… В эту систему тоже вложены N-е суммы денег теми же Oracle и IBM…

    Reply
  19. zarucheisky

    (18) Искали специалистов применительно к 1С?

    Да, ораколоиды на такое добро не падки, совершенно правильно считая 1С для себя гемммороем, им вполне хватает обSAPпленных компаний.

    Про Linux. Просто не пишите в следующих раз подобное, если не хотите стать посмешищем на ресурсах типа sql.ru/LOR (linux.org.ru).

    Касательно убогости GUI-ёв для *NIX решений: для администрирования в *NIX GUI практически не используется т.к. всё админится через командную строку.

    Reply
  20. zarucheisky

    (18) Вклад самой oracle в разработку/поддержку linux минимален.

    Просто наследие покупки Sun.

    Reply
  21. alex_sh2008

    Что Oralce, что MS для 1С на текущий момент одинаково, ни у того ни другого сервера нет явного преимущества друг перед другом. По одной простой причине 1С сервер не интегрируется глубоко в архитектуру серверов.

    Reply
  22. zarucheisky

    (21) «Интегрируется» применено неверно, ИМХО, скорее, 1С не использует все возможности движков и диалектов СУБД.

    Reply
  23. alex_sh2008

    (22) zarucheisky, Смысл от этого не меняется. Что касается статьи в которой автор указал что якобы «ОС для Oracle вообще бесплатно», я не соглашусь с этим, пару раз сталкивался с развернутым Oracle на linux, полный комплект linux + Oracle стоил хороших денег, а linux была специально скомпилирована под определенную версию Oracle, без всяких графических оболочек и прочей не нужной фигни которую обычно ставят.

    Reply
  24. zarucheisky

    (23) Кому как. По мне, так интеграция и использование СУБД совершенно разные понятия.

    Reply
  25. alex_sh2008

    (24) zarucheisky, Вы можете написать универсальный ANSI SQL сервис доступа к серверу СУБД, и ваш сервис сможет работать с любым сервером СУБД — это использование, но если вы начнете использовать специфику определенного сервера, то уже с другими серверами не сможете работать, вот это уже интеграция.

    Reply
  26. comol

    (19) zarucheisky,

    если не хотите стать посмешищем на ресурсах типа sql.ru/LOR (linux.org.ru)

    оу оу… посмешишем стать можно если совсем ничего в них не понимать. Тут речь идёт скорее о «религиозных войнах». Это дааа… это возможно. Ну с позиции «лагеря 1С-ников» вполне оправдано. «true» линуксоиды конечно «забрызгают слюной» 🙂

    Reply
  27. comol

    (19) zarucheisky,

    Искали специалистов применительно к 1С?

    . Ну мы вообще-то в принципе про 1С говорим… :). Сам по себе Oracle тут вряд ли кого интересует…

    Reply
  28. comol

    (23) alex_sh2008, Бесплатно только сыр в мышеловке :). На конференции я говорил что конечно условно бесплатно… просто в статью это как то не попало….

    Reply
  29. alex_sh2008

    (28) Да я смотрю много чего не попало в статью, и стоимости СУБД и редакции СУБД которые вы сравнивали, и среду в которой использовались эти СУБД для сравнения, нагрузки под который рассчитывалась конфигурация. Использование Oracle с 1С было выбрано надеюсь не 50 пользователей, а как минимум 5000?

    Reply
  30. comol

    (29) alex_sh2008, Почему, стоимость попала, и редакция (SE ONE). Но вообще цели сравнения с MS SQL как бы не озвучивалось…. Зачем описывать среду??? Проект рассчитывался на 25-50 тыс. пользователей примерно… тестировалось на 500, ну команда разработки и проектирования работала это и правда 50-70 пользователей…

    Reply
  31. alex_sh2008

    (30) На 50-70 пользователях, вы вообще ничего не заметите, у эти серверов в редакциях Enterprise разность в производительности начинает ощущаться в разных режимах работы это порядка 10тыс одновременных соединений.

    Reply
  32. alex_sh2008

    (30)

    Почему, стоимость попала, и редакция (SE ONE)

    Эта редакция, маловероятно что вытянет у вас 25 тыс пользователей, с на тягом может 5000 и то не уверен.

    Reply
  33. zarucheisky

    (25) если вы начнете использовать специфику определенного сервера, то это, опять таки, не интеграция.

    Reply
  34. comol

    (31) alex_sh2008, Спасибо, вы открыли мне глаза :)))) А то я уж думал :)))

    Reply
  35. comol

    (32) alex_sh2008, Хоть бы статью перед комментом прочитали… хотя бы первый слайд…. там просто для сравнения цены MS SQL SE и Oracle SE One :))) А дальше я пишу что оно не особо нужно… Но на 50 пользователей, естественно, только его использовали.

    Reply
  36. alex_sh2008

    (35) Ясно.

    Reply
  37. wunderland

    По поводу тестирования 1С на Оракле я тут когда-то писал http://infostart.ru/public/118362/ — как все было грустно, так и осталось.

    Статья зачетная.

    Reply
  38. ZLENKO

    (9)

    называть его «ентерпрайз решением под 1С» язык не поворачивается

    Называть саму 1С энтерпрайз решением язык не поворачивается 🙂 Не в том смысле что 1С нельзя заставить работать с достаточно большими базами или достаточно большим количеством пользователей, но есть множество неприятных особенностей, которые все старания 1С сводят на нет. Реальный недавний пример, программное лицензирование — админ расширил размер диска на виртуалке, слетела лицензия и вся розничная сеть остановилась. Особенно порадовал факт что когда 3 пина закончились то резервный пин уже не дают, только взамен текущего 🙂

    Reply
  39. ZLENKO

    (5)

    в лёгкую MS SQL ставят на виртуальные машины…

    Я уже устал бороться с админами которые рассказывают что виртуалки им удобны, а замедление незначительное 🙁

    Reply
  40. Evil Beaver

    (39) А вы статью напишите с аргументацией что и как. И потом можно будет всем ссылку давать в качестве объяснения.

    Reply
  41. comol

    Ох не на простой вопрос это вы замахнулись… Я недавно еле книгу осилил по виртуализации скуля… А вы говорите статью. Там не всё просто, не всё однозначно, и более того не стоит на месте. Есть разные гипервизоры с разными глюками…

    Reply
  42. roman77

    Автор лукавит и сам себе противоречит:

    дело в том, что ORACLE – это продукт, который изначально разрабатывался под LINUX

    Про Postgre ничего плохого сказать не хочу, это бесплатная СУБД, проект энтузиастов. Лично я не рассматриваю его как СУБД для серьезных проектов.

    То есть он рассматривает бесплатный линукс как ОС для серьезных проектов и не рассматривает бесплатный постгрес …

    Лично я из статьи вывод сделал такой: с учетом того, что и для Postgre, и для ORACLE требуется DBA, но Postgre при этом бесплатный а лицензии ORACLE стоят примерно столько же, сколько и MS и, кроме того, поддержка оракла со 2 года (=возможность обновляться) стоит ощутимых денег (про которые автор умолчал), и с учетом того, что 1с всё равно не использует фишек оракла нужно выбирать между MS SQL и Postgre.

    Reply
  43. AlexeyFreeLife

    (42) а с учетом того, что наши админы ms sql «крякают» — то и выбирать не надо 🙂

    Reply
  44. alex_sh2008

    (39)А чем вам не нравится виртуализация MS SQL, при правильном архитектурном решении ни какого падения производительности нет?

    Reply
  45. Сурикат

    (44)

    А чем вам не нравится виртуализация MS SQL, при правильном архитектурном решении ни какого падения производительности нет

    А никто не думает, что потерей производительности при виртуализации СУБД можно пренебречь в сравнении с проблемами производительности самого кластера 1С?

    Вот Fresh на Postgres работает и нормально поговаривают.

    Reply

Leave a Comment

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