Подключение других баз 1С из работающей базы (OLE)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

29 Comments

  1. CheBurator

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

    …опишите хотя бы возможные проблемы при подключении…

    Reply
  2. Abadonna

    Вопрос к похвалившим: вы в каком классе учитесь?

    Reply
  3. kwl

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

    Reply
  4. Abadonna

    (3)>Вспомните себя когда у вас то же под рукой никаких подсказок

    Вспоминаю. 2000-й год, купил комп, поставил 7-ку. Смотрел как баран на новые ворота на точки после переменных и тихо хренел. Книжек не было. Через пару недель уже был принят в члены проклаба.

    Reply
  5. Abadonna

    +(4) и это была разработка, ктр. сейчас лежит на инфостарте

    http://infostart.ru/profile/1329/projects/786/

    Reply
  6. kwl

    ты рекламму делаешь свой наработке 🙂

    Reply
  7. Abadonna

    Ты меня ни с кем не спутал? Глянь все мои разработки, там где-нибудь стоит «не забывайте плюсовать рейтинг» и т.п.? И вообще хоть какой-нибудь рекламный слоган найди…

    Reply
  8. Abadonna

    +(7) ссылка была просто для иллюстрации, что там код не из 3-х строчек 🙂

    Reply
  9. svsrus

    (5) Ха ))) Я сейчас как-раз ковыряю КЛАДР… Объясни, почему первая обработка была именно вьювер? И до этого момента ты имел опыт программирования? Хотя помню когда сам начинал изучать Дельфи,тоже первая программа была с БД, вроде телефонного справочника ) Блин, надо к дельфям возвращаться, а то забыл уже совсем…(

    Reply
  10. kwl

    а количество строк в коде не показатель программы ))

    Reply
  11. Abadonna

    (9) До этого я знал 1С 2.0, 1С 6.0 (ничего общего с семеркой), Foxpro и Basic (обычный, не VB). Что такое объектно-ориентированной программирование я и близко понятия не имел. Да и программистом до этого не был, программил просто для облегчения своих служебных обязанностей никак с программированием не связанных.

    А почему вьювер… скорее всего, что там код никак с 1С-кими метаданными не связан

    Reply
  12. kwl

    кркткость сестра таланта 🙂

    Reply
  13. Abadonna

    (11)>кркткость сестра таланта 🙂

    Всё гениальное — просто, но не всё простое — гениально

    Reply
  14. kwl

    так же как и гениально, не все просто ))

    Reply
  15. DDD2005

    Эй специ что вы так все кричите, чел. kwl правильно сделал, от вас та такого дождешься так выложите демки запросите день и в результате хоть бы что нибудь написали? Мне лично сегодня очень помогло сразу разобрался и сделал как правильно!

    Спасибо kwl +1

    Reply
  16. Abadonna

    2 DDD2005

    http://infostart.ru/profile/987/projects/1120/

    Универсальный OLE-перенос объектов между БД с идентичными конфигурациями.

    Доступ — зарегистрированные (надеюсь, регистрироваться религия позволяет?)

    Не только подключение, но и полный код как и что сделать с конфе через ОЛЕ

    Reply
  17. vasilykushnir

    (15) Вот это как раз не надо ля-ля. Демки-ху@мки…

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

    Учится можно по разному: старательно переписывать чужое или действительно УЧИТСЯ на чужих разработках. Взять хотя бы тот же НовейшийОтчет здесь на форуме или разработки Рощина Антона, wolfsoft, (если Абадонны не в нюх) — вот действительно пример добротного программирования, на котором и поучится не грех.

    Reply
  18. Abadonna

    (15) Если ты ДО этого не разобрался, имяе полный пакет документации — меняй профессию. Не скажу за Волгоград, а в Дубовке на рыбзаводе точно раздельщики рыбы требуются

    Reply
  19. kwl

    Ребят, давайте жить дружно. Я помог молодому синтакис найти, и применить его, а уж как он его использовать будет, его проблемы. Поймите наши программы, они хороши бесспорно, но молодому не нужно вытаскивать из наших соображения в коде, то что ему надо. Че вы на парня навалились. Мне то же 13 лет назад говорили мол меняй профессию. Вам нет чтобы помочь молодым, понять нужна им эта трудная специальность или нет, а вы на корню забиваете людей. Да еще на молодых отыгрываетесь, Я написал, ко мне и обращайтесь.

    Reply
  20. vasilykushnir

    (19) Да без проблем. Только, как ты можешь заметить, на товарища наехали не за наличие/отсутствие опыта, а прежде всего за выбранный тон в коммете. Хочет поупражнятся в острословии — прямой путь на мисту (там быстро получит по ушам). Надо усвоить, прежде предявления претензий, золотое правило — никто никому НЕ ОБЯЗАН помогать — и если человек это делает, то только по доброте душевной и при том жертвуя своим временем.

    Reply
  21. Abadonna

    (19)>Да еще на молодых отыгрываетесь

    Я отыгрываюсь не на молодых, а на наглых. NatahaB попросила по-человечьи — так я ваще обработку для нее написал и ей выслал.

    Reply
  22. kwl

    Ой молодец, женщинам помогать надо, но будь проще раз профессионал, а парень тон не выбирал, потому как наезды сразу молодых пошли

    Reply
  23. Abadonna

    >будь проще раз профессионал,

    извини, но мне простым быть не нравится 😉

    Reply
  24. kwl

    Ну ничем помочь не могу, потому и наблюдай, с каким тоном с тобой разговаривют. Как ты с людьми, так и они с тобой 🙂

    Reply
  25. O-Planet

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

    Reply
  26. vasilykushnir

    (25) Молодец Олежа — действительно хватит трындеть, пора бы и делом занятся.

    Reply
  27. Abadonna

    Пиши в ком. строке слово Config — и всех дел 😉

    Reply
  28. O-Planet

    И, стало быть, можно к каким-то его функциям обращаться по OLE — к тем же текстам модулей объектов, например?

    Reply
  29. sergksb

    Написано внешний отчёт , а в архиве текст.

    Тогда надо писать текст внешнего отчёта.

    Reply

Leave a Comment

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