Универсальный обмен данными




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

    необходимо добавить обработку ситуации на уникальность

    {Форма.ФормаОбработки(268)}: Ошибка при вызове метода контекста (Записать): Не уникальный номер документа

    Объект.Записать();

    по причине:

    Не уникальный номер документа

    Reply
  2. itmind

    В чем отличие от стандартной ВыгрузкаЗагрзукаДанныхXML с диска ИТС ?

    Reply
  3. Re:аниматор

    расширение ep. это сокращенный варьеант epf?

    Reply
  4. ZyMik

    Как произсходит поиск объектов в базе — приемнике? Или как в обраьотке с ИТС по внутреннему идентификатору?

    Reply
  5. chainiknew@yandex.ru

    Пишет

    {Форма.ФормаОбработки(268)}: Ошибка при вызове метода контекста (Записать): Код не уникален!

    Объект.Записать();

    по причине:

    Код не уникален!

    Судя по комментариям одни вопросы, а ответы где…

    Reply
  6. bugmaster

    На диске ИТС есть «Универсальные подбор и обработка объектов», там же можно и вынрузить…. Вот куда нужно стремиться….

    Reply
  7. WiseSnake

    (6) Есть конфигурация «Конвертация данных» с помощью нее пишутся правила, хоть между одинаковыми или разными и выгружай стандартными средствами сколько хочешь с отборами или без один вид документа или сразу все… Тем более множество правил уже существует…Вот куда нужно стремится… Но эта обработка имеет право на существование, не все же умеют пользоваться КД

    Reply
  8. bugmaster

    Согласен, «узкое решение» с «узким» применением

    Reply
  9. Lapin

    согласен

    Reply
  10. Evga

    {ВнешняяОбработка.УниверсальныйОбменДаннымиМеждуСхожимиКонфигурациями(234)}: Ошибка при установке значения атрибута контекста (Значение): Неверный тип значения

    перемПостроительЗапроса.Отбор[Счетчик].Значение = перемТекущаяСтрокаОбъекта.Отбор[Счетчик].Значение;

    по причине:

    Неверный тип значения

    Reply
  11. almas

    Народ конфигурация «Конвертация данных» на мой взгляд достаточно еще сырая, поверьте настраивать из нее правила обмена достаточно неудобно. А данная обработка имеет право на жизнь. Хотябы за идею….

    Reply
  12. anig99

    движения по бух регистрам идут без субконто

    Reply
  13. Katik

    Отбор по дате документа не работает! Задаю условие Ссылка дата => <=. Выбираю даты периода. Показать результат — ничего не дает. Убираю условие, выводит документы, причем именно в этом периоде.

    Reply
  14. Katik

    Интерфейс жуткий какой-то

    Reply
  15. Psylocibine

    Вот так:

    {ВнешняяОбработка.УниверсальныйОбменДаннымиМеждуСхожимиКонфигурациями(224)}: Ошибка при установке значения атрибута контекста (Текст): {(1, 1)}: Ожидается выражение «ВЫБРАТЬ»

    перемПостроительЗапроса.Текст = СтрЗаменить(перемТекущаяСтрокаОбъекта.ТекстЗапроса, «ПЕРВЫЕ 0», «»);

    по причине:

    {(1, 1)}: Ожидается выражение «ВЫБРАТЬ»

    Reply
  16. fedorova_tv

    Смогу ли я выгрузить с помощью данной обработки документы «Приходной кассовый ордер» за определенный период?

    Reply
  17. leonidt84

    Спасибо, интересная штука.

    Reply
  18. Vigesha

    Скачалась с расширением *.ep дописал f. Не работает. Пишет «Не может быть прочитана текущей версией…»

    Reply
  19. TeMochkiN

    (18) Vigesha, через конфигуратор сначала открой, он сам сконвертирует её

    Reply
  20. TeMochkiN

    у меня почему-то не может преобразовать данные XML

    {Форма.ФормаОбработки.Форма(267)}: Ошибка при вызове метода контекста (ПрочитатьXML)
    Объект = ПрочитатьXML(ЧтениеXML);
    по причине:
    Ошибка преобразования данных XML: [file://D:/TeMochkiN/Documents/1C/123.xml][10,2]
    

    кто знает причину?

    посмотрел код, так там вроде все норм, тип явно назначается

    ЗаписатьXML(ЗаписьXML, Результат.Ссылка.ПолучитьОбъект(), НазначениеТипаXML.Явное);

    че ему не нравится — непонятно

    хотя в СП говорится:

    ПрочитатьXML (ReadXML)

    Синтаксис:

    ПрочитатьXML(<ЧтениеXML>, <ТипЗначения>)

    Параметры:

    <ЧтениеXML> (обязательный)

    Тип: ЧтениеXML.

    Объект, через который происходит чтение XML.

    <ТипЗначения> (необязательный)

    Тип: Тип.

    Тип значения, которое должно быть прочитано из XML

    Если тип не указан, то будет произведена попытка определения типа значения непосредственно из представления XML.

    Возвращаемое значение:

    Тип: Значение считанного типа; Неопределено.

    Описание:

    Считывает значение в формате XML. Прочитаны могут быть значения тех типов, которые могут быть записаны методом ЗаписатьXML.

    Доступность:

    Сервер, толстый клиент, внешнее соединение.

    Примечание:

    Если задан тип, значение которого не может быть прочитано из XML или значение не может быть прочитано по причине неподходящего представления в XML, то будет вызвано исключение.

    Reply
  21. TeMochkiN

    понял, я просто попытался из БП выгрузить номенклатуру в УТ, а структура реквизитов элемента данного справочника в обеих конфигурация различается

    Reply
  22. Serge_ASB

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

    Сам же себе и отвечу: из-за какого-то различия в конфигурациях выдавал ошибку. Заменил конфигурацию — «узкое место» прошел. Смотрю дальше.

    Reply

Leave a Comment

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