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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *