Использование внешних наборов данных в системе компоновки данных.




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

43 Comments

  1. coder1cv8

    Эта… А как теперь код выделить в тексте?!… Какими тегами?…

    Reply
  2. Душелов
    Код
    //Как и раньше - code в квадратных скобках
    

    Показать полностью

    Reply
  3. Душелов

    Хорошая статья, для меня даже своевременная 😉

    Reply
  4. coder1cv8

    (2) Если бы как раньше, я бы не спрашивал! )

    Вот смотри, первый запрос в теги заключил — толку ноль! (

    Reply
  5. Душелов

    (4) Предлагаю по этому поводу наябедничать Доржи 😉

    Reply
  6. PeRom

    Отлично!

    А про программное управление СКД (ПроцессорКомпановки, ОбработкаРасшифровки и тд) где можно поподробней почитать?

    Reply
  7. coder1cv8

    (6) «1С:Предприятие от 8.0 к 8.1», у Хрусталевой тоже говорят про СКД хорошо написано (правда я всё бумажного варианта не дождусь), ну и диски ИТС.

    Reply
  8. PeRom

    7 Про СКД то говорят, а вот про программное управление мало чего есть 🙁

    Но и меня сейчас на клюшках подзагрузили, 8-кой пока в фоновом режиме занимаюсь.

    Reply
  9. coder1cv8

    (8) Тут главное понять механизм, а уж нюансы реализации можно и в СП уточнить! )

    Reply
  10. rasswet

    по больше бы таких подробных статей. мегареспект!

    Reply
  11. rasswet

    побольше бы таких подробных статей. мегареспект!

    Reply
  12. KMA82

    (8)как уже было сказано: «…у Хрусталёвой хорошо написано…»

    книгу (эл. вариант) не очень хорошего качества, но читаемо, можно взять отсюда http://ifolder.ru/9620253

    Reply
  13. KMA82

    (7) тоже жду, можешь пока посмотреть эл.вариант(качество не очень, но читать можно). ссылка выше

    Reply
  14. coder1cv8

    (13) Спасибо! Электронный вариант у меня давно есть… 😉

    Не люблю просто с монитора читать…

    Reply
  15. coder1cv8

    +(14) А вообще, на курсы по СКД записался, в общеобразовательных целях так сказать… )

    Reply
  16. coder1cv8

    (11) Лучше бы мегаплюс поставил! 😀 А то на первую страницу так и не вылезет статья… )

    Reply
  17. rasswet

    (16) фаерфокс притупливает, ещё и но-скрипт 🙂

    З.ы. Мегаплюс ставлю!

    Reply
  18. maloi_a

    Поставил +, себя не вижу.

    У меня колонка «Остаток внешние данные» выводится как целое число, хотя в табличной части «ВнешниеДанные» «ОстатокВнешняяБаза» описал как Число(15,3).

    Reply
  19. maloi_a

    Вот появился после комментария.

    Reply
  20. coder1cv8

    (18) Нужно в наборе данных указывать для поля тип значения.

    (19) Это с кэшем тут всё эксперементируют! )

    Reply
  21. maloi_a

    (20) Это противоречит «мягкой типизации» 1С. Вообще-то я могу не знать типа, который получаю.

    Reply
  22. coder1cv8

    (21) Почему же противоречит?… Если ты указываешь тип в наборе данных, то значения в строках приводятся именно к этому типу, если нет — то тип любой. Это как с ТаблицейЗначений, можно добавлять колонки уже типизированными, а можно и нет… Я просто хочу сказать, что тип в колонке таблицы из которой загружаем набор данных, роли не играет. Важен именно тип в наборе.

    Reply
  23. sea-man

    Еще бы во внешние наборы источники данных ADO добавили — цены бы им не было))

    А так — приходится извращаться через подсовывание виртуальных таблиц…

    Reply
  24. coder1cv8

    (23) Я думаю, дальнейшее развитие СКД пойдет как раз по такому пути. Недаром ведь кроме наборов, есть «Источники данных», где пока редактируется только имя.

    Reply
  25. adrian

    (0) Делаю НаборДанных — Объект , передаю ТаблицуЗначений

    При вызеве процедуры Процедура ВывестиОтчет()

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки) — в этом месте ошибка «Не найден внешний набор данных ВнешниеДанные» в чем дело?

    Reply
  26. coder1cv8

    (25) Так написано же по-русски все! ) «Не найден внешний набор данных ВнешниеДанные» Что здесь еще можно добавить?… Нет его в структуре ВнешниеНаборыДанных.

    Reply
  27. Bolik

    Можно ли во внешних наборах, использовать характеристики также, как они используются в наборе данных — запрос?

    Reply
  28. luns

    (27) Да. Если тип значения поля задан, то оно также будет связываться с описанием характеристик.

    Reply
  29. Bolik

    (28) А как же тогда описать характеристики в этом случае?

    Reply
  30. luns

    Точно так же.

    Принцип действия характеристик заключается в следующем:

    Мы как бэ говорим компоновке: вот поле с типом значения «СправочникСсылка.Номенклатура» и вот описания его характеристик. После этого компоновка для все полей с таким типом даст возможность выбора характеристик. Т.е. характеристики привязываются не к конкретному полю/полям из наборов данных а к типу значения.

    Reply
  31. Bolik

    (30) Проблема в том, что в запросе есть ключевое слово «ХАРАКТЕРИСТИКИ» и харакетристики описываются в наборе данных-запрос, а в самой компоновке они не описываются. Если описать 2 источника и в наборе данных запрос описать только характеристики — они подхватятся и для набора-объект?

    Reply
  32. luns

    (31) Нет. Опишите типы полей для набора данных объект и опишите характеристики ТОЧНО ТАК ЖЕ как и для набора данных запрос.

    Reply
  33. Bolik

    (32) А можно точно ткнуть — где это сделать? )) В конструкторе СКД не нашел, где можно для набора-объект описать характеристики

    Reply
  34. luns

    (33) Это я туплю )))) нельзя блин..

    Reply
  35. Bolik

    (34) А может можно как-то в наборе-запрос использовать таблицу значений, например через временные таблицы или еще как хитро? )))

    Reply
  36. luns

    вообще я думаю что если сделать набор-заглушку с описанием характеристик то возможно в наборе объект подхватиться..

    Reply
  37. poZZitive

    Ошибка. Нужно задать схему компановки данных. иначе не находит куда вставлять внешнийнаборданных и вываливается с ошибкой.

    СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    Reply
  38. 666Oleg666

    Большое спасибо

    То что надо а я думал все кодом делать (Сверку 1С и Биллинга)

    Reply
  39. it-kostya

    Прикольно то прикольно. Только возвращаемое значение из внешней базы COM-объект. Неудобно блин. Особенно когда с документами нужно работать

    Reply
  40. sergei_tekh

    А в строке:

    МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);

    что нужно передавать в переменную ДанныеРасшифровки?

    Reply
  41. sergb1979

    в 8.2.14 добавили метаданные «внешние данные»

    Reply
  42. Eugenio

    =======

    С учетом этого, определим для поля табличного документа «Результат», процедуру «ОбработкаРасшифровки»:

    =======

    А не подскажете, как это сделать в неуправляемой форме? На какие кнопки нажимать? 🙂

    Reply
  43. Mishka_78

    день добрый! coder1cv8 перезалейте пожалуйста скрины в статью. Похоже фотохостинг http://www.picamatic.com «закруглился». Спасибо.

    Reply

Leave a Comment

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