Построение дерева информационных баз на основе файла ibases.v8i (8.1) C#




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

22 Comments

  1. Amras

    При запуске конфигуратор 1С 8.1.:

    Ошибка:

    Необрабатываемое исключение в приложении.

    Accessibility

    Версия сборки: 2.0.0.0

    Версия Win32: 2.0.50727.1433 (REDBITS.050727-1400)

    CodeBase: file:///D:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll

    —————————————-

    mscorlib.resources

    Версия сборки: 2.0.0.0

    Версия Win32: 2.0.50727.1433 (REDBITS.050727-1400)

    CodeBase: file:///D:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll

    —————————————-

    System.Windows.Forms.resources

    Версия сборки: 2.0.0.0

    Версия Win32: 2.0.50727.42 (RTM.050727-4200)

    CodeBase: file:///D:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll

    —————————————-

    ************** Оперативная отладка (JIT) **************

    Для подключения оперативной (JIT) отладки файл .config данного

    приложения или компьютера (machine.config) должен иметь

    значение jitDebugging, установленное в секции system.windows.forms.

    Приложение также должно быть скомпилировано с включенной

    отладкой.

    Например:

    <configuration>

    <system.windows.forms jitDebugging=»true» />

    </configuration>

    При включенной отладке JIT любое необрабатываемое исключение

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

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

    Reply
  2. Amras

    Тоже самое и при запуске самой конфигурации в режиме предприятие.

    Итог: «Не удается найти указанный файл»

    На ПК:

    Win XP SP3

    1C 8.1.13.41

    Reply
  3. Amras

    Код:

    ProcessStartInfo startInfo = new ProcessStartInfo(«C:\Program Files\1cv81\bin\1cv8.exe»);

    А нельзя разве использовать пути %PROGRAMFILES% (у меня например WinXP стоит не как у нормальных людей), форточки иногда и на других дисках стоят, не только на C:>

    Вот видимо и ответ на мои посты выше 🙂 Разумеется файл не найден будет, т.к. на <C> у меня ничего нет.

    Reply
  4. Amras

    Еще можно на C# вытаскивать путь к этой папке из реестра, что позволило бы оптимизировать доступ к каталогу с 1С. Это как один из возможных вариантов. Просто у меня С# не установленно, а то мог бы поиграться с вашим кодом. Но идея хорошая, за что ставлю «+»

    Reply
  5. fishca

    Учту все ваши замечания, это только начало 🙂

    Кстати как узнать по которому пути установлена 1С или же другой софт?

    Reply
  6. fishca

    Хотелось бы хранить пароли к базам, только вот никак не придумаю где и как.

    Reply
  7. coder1cv8

    Ну зачем же .NET framework для такой ерунды? )

    Reply
  8. Amras

    [5] Например:

    Путь к папке Program Files — %PROGRAMFILES%

    Пример: %PROGRAMFILES%1cv81 (откроет каталог с 1С — при условии, что она установлена по умолчанию)

    Можно попробовать здесь поискать:

    HKEY_LOCAL_MACHINESOFTWAREClassesApplications1cv8.exeshellOpencommand

    HKEY_LOCAL_MACHINESOFTWAREClassesV81.InfoBaseListshellOpencommand

    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion­InstallerFolders

    В моем случае везде был прописан путь к 1С 8.1

    [6] Пароли можно хранить в реестре (правда надо будет использовать какой-нибудь метод шифрования данных)

    Reply
  9. fishca

    (7) а чем это плохо?

    Тем более в винде это уже практически стандартная часть оси 🙂

    Как бы нам не хотелось но за .NET framework будущее. Если уж под линуха создан Моно…

    Reply
  10. Amras

    [6] Еще можно написать алгоритм на С#, который будет шифровать данные о пользователе (например, жуткий способ, делать смещение символов: Была буква А — стала буква Д, можно и посложнее). Раньше в нете лежали коды на С++, где приводился пример написания таких алгоритмов. Дальше можно шифрованные данные хранить а файле настроек или записывать в реестр.

    Reply
  11. Душелов

    Добавляй еще пакетный запуск, регламентные задания… ;))

    Reply
  12. fishca

    (11)Согласен, в этом направлении и двигаюсь.

    Reply
  13. coder1cv8

    (9) А плохо это тем, что «стандартная часть оси» это только для тех кто пишет под .NET 🙂

    А остальным приходится скачивать довольно не маленький дистрибутив или вообще отказываться от подобных разработок, потому что нет прав на установку framework-а (как мне, например).

    Впрочем, я здесь хотел сказать только, что для такой банальной вещи как «стартер» 1С тащить .NET framework вовсе не обязательно…

    Reply
  14. fishca

    (13) у тебя нет прав на установку framework-а дома?

    Ты не можешь скачать порядка 50 Мбайт в век безлимитного инета?

    Если у тебя нет прав на установку framework-а обратись к системному администратору 😉 Думаю он тебя направит в нужное русло 😉 🙂

    А вообще думается за managed языками будущее разработки.

    Ява достаточно широко используется, также будет и использоваться dot NET

    Reply
  15. artbear

    (13) К сожалению, каких-то пару лет и без фреймворка ничего работать не будет.

    Например, Винда 2008, 7, Виста уже юзают фреймворки почти по умолчанию 🙁

    Reply
  16. fishca

    (15) не почти, а по умолчанию стоит 2 framework

    Reply
  17. fishca

    (15) и не к сожалению.

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

    Reply
  18. coder1cv8

    (14)(15)

    Да я в общем-то ничего не имею против framework-а…

    Просто на данный момент ситуация сложилась так, что большинство используют в качестве «рабочей» оси — ХР. И на работе инет, естественно, не безлимитный, не говоря уже о том что я не админ…

    Тут как с 7.7 и 8, ни к чему «стрелять из пушки по воробьям», я могу аналогичный стартер написать просто в блокноте, без всяких фреймворков и т.п., разве что окошко будет чуть попроще может…

    ЗЫ: И читайте Джоеля Спольски, ведь умные вещи пишет, доступно: http://russian.joelonsoftware.com/Articles/PleaseSirMayIHaveaLinker.html

    Reply
  19. fishca

    (18)

    Автор: Джоэл Сполски

    Переводчик: Анар Мустафаев

    28 января 2004

    Пять лет прошло ужо 🙂 Многое поменялось. Когда-то требовалось скачать некоторые dll, к примеру MFC7*.DLL

    Мелкософт не зря двигает именно C#, хотя винда написана на C++ 😉

    <я могу аналогичный стартер написать просто в блокноте>

    я также знаю о существовании функции CreateWindow(…), вот только сколько это займет времени уже другой вопрос.

    Мелкософт наконец то сделал нормальную RAD, почему бы ею не пользоваться. Хотя я сам больше сердцем тяготею к Делфям 😉

    Данная програмуселька написана с целью изучения возможностей C#, а дальше будет видно…

    Reply
  20. SirYozha

    Сыровато конечно, но за реализацию на C# плюсую авансом. Надеюсь будешь периодически обновлять разработку. 😉

    Reply
  21. cleaner_it

    Лучше убрать явный выбор версий 1С, а сделать в корне 2 ветки: 8.1 и 8.2

    Reply
  22. fishca

    (20) постараюсь

    (21) надо бы заняться…

    Reply

Leave a Comment

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