Просмотр метаданных и структуры хранения данных в режиме предприятия




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

38 Comments

  1. diletant

    Может кому пригодится. Конечно такая обработка — это изобретение велосипеда, причем довольно старинного, наверное таких разработок много (жаль не могу посмотреть, сравнить, оценить, нет денег ;)). Понятно и создание этой обработки дело не благодарное, конфигурация постоянно меняется, но наверное в ней пока достаточно информации для работы. В конце концов если нужно, можно добавлять в списки новые свойства. Сильно не критикуйте, первый блин … 😉

    Reply
  2. diletant

    Хотя нет, лучше наоборот больше критиковать и указывать на ошибки (тихо сам с собою, я веду беседу )))

    Reply
  3. json

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

    Интересная идея по переключению между идентификаторами и наименованиями в дереве

    Критика:

    1) при позиционировании на ветке Реквизиты, Измерения выскакивает ошибка

    2) код задублирован в обычной и управляемой форме. Одинаковые функции лучше было бы вынести в модуль обработки, а из форм вызывать (по принципу MVC). Это бы упростило модификацию

    Reply
  4. diletant

    (3) yurii_host,

    список открывается из раздела дополнительно — Открыть список, хотя можно сделать и из дерева метаданных, сделаю, не вопрос

    1). — Ошибку посмотрю,

    2) — Я как раз и хотел это сделать, но не смог сделать (мало опыта) из управляемой формы не вижу процедуры и функции в модуле объекта

    Reply
  5. diletant

    (3) yurii_host,

    Ошибку исправил

    Reply
  6. diletant

    (3) yurii_host,

    добавил возможность открывать список объектов из дерева, только нужно поставить галочку «Открывать список»

    Reply
  7. kiruha
    Ошибка формата потока

    по причине:

    Ошибка преобразования данных XDTO:

    Значение: BeginsWith Тип: {http://v8.1c.ru/8.1/data-composition-system/settings}DataCompositionComparisonType

    по причине:

    Ошибка отображения типов:

    Отображение лексического значения ‘BeginsWith’ в значение типа ‘ВидСравненияКомпоновкиДанных’

    Убило предприятие

    Открыл в конфигураторе — убило и конфигуратор

    Reply
  8. diletant

    (7) kiruha,

    Проверял на 1С:Предприятие 8.3 (8.3.6.2076) УПП 1.3 (1.3.63.3) ошибок вроде не было

    Reply
  9. kiruha

    У меня 8.2 (8.2.19.102) — не годится ?

    Reply
  10. diletant

    (9) kiruha,

    да по идее без разницы, а какая конфигурация?

    Reply
  11. kiruha

    Бух 2.0. От этого тоже зависит ?

    Может отдельно скомпоновать для 8.2 и 8.3 ?

    Большинство на 8.2 еще

    Reply
  12. diletant

    (7) kiruha,

    Вопрос, а что значит :»Открыл в конфигураторе — убило и конфигуратор», может это пакет такой пакет такой?

    Reply
  13. kiruha

    Это значит, что при открытии в предприятии/конфигураторе — предприятие/конфигуратор падает с критической ошибкой описанной выше.

    Вам нужно просто открыть последнюю версию 8.2 платформы и в любом режиме убедиться что она в нем работает ваша обработка.

    Если нет — скопировать формы модули и выложить рядом

    Reply
  14. diletant

    (13) kiruha,

    попробую, если получится

    Reply
  15. diletant

    (13) kiruha,

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

    Reply
  16. kiruha

    Я открыл в 8.2 и 8.3 по конфигуратору.

    В 8.3 открыл Вашу обработку .

    В 8.2 создал новую. Копи паст обычной формы из 8.3 обработки в 8.2 обработку — ОК.

    Сохранил.

    Заработало. Спасибо ! Симпатично

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

    В других обработках не все объекты и не такой красивый дизайн — рекомендую )

    Reply
  17. tormozit

    (3) yurii_host, это смотрел http://infostart.ru/public/15324/ ?

    Reply
  18. json

    (17) tormozit, в этой публикации только обычные формы, разве нет?

    Дизайн у данной работы поинтереснее, согласен с kiruha

    Reply
  19. diletant

    (16) kiruha,

    Пожалуйста, рад что все получилось.

    Reply
  20. kiruha

    (19) Да, но лучше Вам проделать такую же операцию и выложить версию для 8.2 ))

    Reply
  21. vasyak319

    Так симпатично, что даже жаль, что ненужно.

    Reply
  22. Dmitryiv

    Полезный инструмент. Вот только не нашёл как посмотреть список предопределенных элементов справочников, планов счетов и т.д.

    Reply
  23. izidakg

    возможность сохранения структуры еще бы

    Reply
  24. diletant

    (22) Dmitryiv,

    В старых версиях платформы пока не нашел как показать предопределенные значения (в новой: ПолучитьИменаПредопределенных())

    Reply
  25. diletant

    (23) izidakg,

    Если «возможность сохранения структуры еще бы», это отчет, то сделал

    Reply
  26. diletant

    (7) kiruha,

    «Убило предприятие Открыл в конфигураторе — убило и конфигуратор» нашел наверно чем убивает, исправил

    Reply
  27. diletant

    (3) yurii_host,

    «2) код задублирован в обычной и управляемой форме. Одинаковые функции лучше было бы вынести в модуль обработки, а из форм вызывать (по принципу MVC). Это бы упростило модификацию»

    Сделал, правда по принципу MVC или нет, я пока не понимаю.

    Reply
  28. kiruha

    Кинул обработку соседним отделу —

    1. не видно как реквизит называется в структуре хранения. Можно перейти по ссылке структура хранения — но там отсутствует табличное представление полей

    надо тыкать по 30 реквизитам пока не найдешь нужный

    Было бы удобно если бы на странице описания реквизита был бы отдельный раздел с именем поля в структуре хранения

    2.У реквизита есть тип и гиперссылка в обработке на этот тип (например справочник Контрагенты). Вместо ожидаемого перехода по гиперссылке в дерево — попадаешь в малопонятное окно без какого либо функционала

    Reply
  29. diletant

    (28) kiruha,

    1. По первому пункту как понял, сделал в разделе «Структура», кроме вывода на странице описания реквизита поля с именем поля в структуре хранения, сделаю позже как будет время

    2. по второму пункту — переход сделан для того что если тип реквизита — составной его полный состав показать в отдельном окне, т. к. в строку может не поместиться

    Reply
  30. V.Nikonov

    (26) У платформы 1с8 до сих пор не устранена ошибка: При редактировании объектов Конфигуратором под 8.3 они иногда перестают работать под 8.2.

    Спросите у Интернета «Ошибка формата потока 8.2» — много ругательств прочитаете…

    Reply
  31. kiruha

    Спасибо !

    теперь ошибок нет и видно имена в структуре хранения

    Reply
  32. diletant

    (31) kiruha,

    Да всегда пожалуйста

    Reply
  33. diletant

    (30) V.Nikonov,

    У меня тоже была такая ошибка из-за того что я в управляемой форме в настройках условного оформления выбрал оформление, которое отсутствовала в предыдущих платформах, после изменения оформления ошибка ушла.

    Reply
  34. diletant

    (28)

    1. не видно как реквизит называется в структуре хранения. Можно перейти по ссылке структура хранения — но там отсутствует табличное представление полей

    надо тыкать по 30 реквизитам пока не найдешь нужный

    Было бы удобно если бы на странице описания реквизита был бы отдельный раздел с именем поля в структуре хранения

    Хоть поздно, но сделал.

    Reply
  35. kiruha

    Спасибо !

    Reply
  36. kiruha

    На мой взгляд — самый красивый отчет по структуре метаданных — рекомендую

    Reply
  37. yku

    Скачал. Код — это жесть. Мне кажется, надо предупреждать, что обфускация.

    Reply
  38. yku

    Т.е. вот получаю ошибку:

    {ВнешняяОбработка.Метаданные.МодульОбъекта(44)}: Значение не является значением объектного типа (Скопировать)

    Если Н=»Под» Тогда Д=M[12].Скопировать(); С0=Д.Строки[0]; ОтобратьПодсистемы(С0,З,1); М=?(Ф=0,С0.Строки.Количество(),С0);

    И как её исправить? Верю, что много времени на эту обработку убито, но блин.

    Reply

Leave a Comment

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