Получение изображений, сохраненных в 1С:Предприятие 8.x, прямым доступом из SQL Server + пример кода на Asp.Net




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

9 Comments

  1. Gilev.Vyacheslav

    >>>Основной трудностью, с которой пришлось столкнуться и решать, явилось извлечение изображений из справочника ХранилищеДополнительнойИнформации.

    это потому что освоил C#, но не стали изучать 8ку

    задолбал, минус

    Reply
  2. Душелов

    >Разработчикам следует более пристально приглядеться к стандартным механизмам сохранения в 1С файлов на предмет совместимости с другими общедоступными технологиями

    Зачем? К чему это все?

    Может для таких случаев проще использовать общую папку с картинками?

    Reply
  3. Elisy

    (1) gilv, есть что по делу сказать без эмоций? Можно подумать, что я бегаю конкретно за вами и упрашиваю читать мои публикации 🙂 . Может лучше не читать вам мои заметки, чтобы не расстраиваться и «не задалбываться»? Заметьте, я не захожу в каждую вашу публикацию и не оставляю гнусные комментарии. Хотя и в вашем случае можно выдрать отдельную фразу из контекста и на славу покритиковать ее, как поступили вы в данном случае.

    Поясняю: в названии статьи используется выражение «прямой доступ», это означает, что речь в ней идет о прямом доступе к базе данных MSSQL без участия 1С. Трудности, о которых говорится, относятся к получению содержимого файла изображения именно из базы данных МССКЛ через, например, C#.

    Поясняю для Gilv 🙂 : Базовое образование в сфере ИТ, сертификат по 1С и опыт работы с 1С к статье прилагаются. Опыт работы с С++, С# прилагаются также.

    Reply
  4. Gilev.Vyacheslav

    Пиши:

    ЗАЧЕМ это нужно, почему другие варианты не подходят

    далее — почему выбран именно этот метод, какие есть альтернативы

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

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

    а что получается в результате,

    мне постоянно приходится на проектах разгребать подобные «подделки», потому что новички как следует не разобравших ТАКОЕ творят, что иногда проще вместо исправлений вообще все заново написать

    когда что то выкладываешь, надо осозновать ответственность за возможные последствия

    уж молчу про нарушения лицензионной политики, тут и без нее видно кучу технических проблем, которые вызовет предложенный подход как в этом посту так и в других

    Reply
  5. Elisy

    (2) Извиняюсь за задержку с ответом. Предложенное мной решение хорошо интегрируется в стандартные механизмы 1С. Т.е. добавленные изображения выложенной обработкой нормально отображаются из 1С, но вместе с тем имеют достоинство — к ним можно без проблем обратиться методом прямого доступа (ПДД).

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

    Метод с общей папкой имеет право на существование, но как мне кажется, не в случае, когда есть прямой доступ к БД. А, например, в случае удаленного веб-сайта.

    Reply
  6. Elisy

    (4) Ни я и никто другой на Инфостарте не несут ответственности за то, что натворят другие, выкладывая разработки по принципу «AS IS» (как есть). Пусть за это несут ответственность их непосредственное руководство. Это первое.

    Второе, с каких это пор ссылки на статьи должны быть оформлены в виде научных статей с введением, описанием аналогов, выводами?

    Третье, что касается лицензионного соглашения. Разговор об этом с тобой был уже в других постах. С твоего молчаливого согласия пришли к выводу, что лицензионное соглашение 1С нарушает Гражданский Кодекс РФ, где сказано, что владелец базы данных может обращаться к ней любыми способами. Но возникает другой закономерный вопрос, почему из 60 тысяч пользователей Инфостарт только тебя заботит судьба этого нового спорного пункта лицензионного соглашения?

    Четвертое, почитай раздел Цели Инфостарта http://infostart.ru/about/ и впредь будь добр «создавать атмосферу доброжелательного общения».

    Пятое, когда освоишь .net framework, о котором идет речь в моих публикациях, мы сможем с тобой на равных обсудить «технические проблемы» всех моих публикаций. Потому что .Net нормально внедрили в С++, Visual Basic, Delphi, Python, Ruby, Axapta и особых проблем в них не возникало.

    Reply
  7. d.snissarenko

    интересные костыли.

    Reply
  8. Elisy

    (7) Действительно «костыли», лучше определение не подберешь

    Reply
  9. Anyxwar

    чет Гилев выделывается дофига.Понаполучал сертификатов и строит из себя бога

    Reply

Leave a Comment

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