Записки про metadata.js




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

59 Comments

  1. Timur.V

    Не хватает ссылок, для тех, кто первый раз читает про metadata.js

    Metadata.js для построения дешевых высоконагруженных сервисов

    https://infostart.ru/public/535370/

    Hello world на metadata.js

    https://infostart.ru/public/540168/

    Reply
  2. yogaga

    Все это очень хорошо, но решён ли вопрос с актуальной документацией для разработчика?

    Reply
  3. 1c-intelligence

    (2) нет, на документацию времени решительно не хватает.

    Reply
  4. unpete

    (3)

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

    его не хватает не только на документацию, но и на базовый функционал — по полю ввода, динсписку и компоновке, задачи в github висят годами

    Reply
  5. 1c-intelligence

    (4) так, тсс, здесь не исповедальня и не жалобная книга.

    Reply
  6. Ziggurat
    Так получается благодаря разным способам кеширования. Например, номенклатура у нас с типом кеширования «ram». Это значит, что при первом старте приложения, подключенного к интернету, весь справочник номенклатуры грузится в ОЗУ, и сохраняется в базе данных браузера (кажется, она называется IndexedDB).

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

    Reply
  7. TODD22

    (6)Скорее всего «версией» рулит CouchDB при обмене. Хотя наверное можно и самому в процесс вмешаться.

    Reply
  8. leemuar

    (6) как написал TODD22 возможны 2 варианта — отдать разруливание серверу CochDB, либо написать функцию на JS, разруливающую такие конфликты.

    Reply
  9. yogaga

    (3)Это проблема — как тогда JS-разработчику использовать фреймворк на сторонних проектах?

    Reply
  10. 1c-intelligence

    (9) проблема, кто спорит. Точнее — задача, которую надо решить. Решим когда-нибудь.

    Reply
  11. yogaga

    (10) Для вас — задача, а для других проблема :)) Хотя, если нет планов более-менее широкого распространения, то нормально.

    Reply
  12. unpete

    (2)

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

    (6) Там не обмен и вообще не УРБД. Если есть реальные задачи, тогда есть смысл расширить кругозор, но это потребует много времени — комментариями на инфостарте тут не ограничишься.

    Reply
  13. unpete

    (9)

    как тогда JS-разработчику использовать фреймворк на сторонних проектах?

    Подключиться к нашему проекту и разработать те разделы документации, которые востребованы в первую очередь.

    Код мы комментируем тщательно, но автоописание API через JSDoc — это ведь, не документация. Нужен художественный текст с интересными примерами.

    Reply
  14. yogaga

    (13) Это, конечно, хорошо. Но это тогда должен быть энтузиаст, заказчик оплачивать доработку фреймворка, вместо реализации проекта, не будет.

    Reply
  15. unpete

    (14)

    должен быть энтузиаст, заказчик

    С этим особых проблем нет — денег хватает. Трудность в том, что задачи по платформе некому делегировать. Готовых специалистов нет, а однобокий Гуру в 1С или JS не хочет (не может себе позволить) на год-два превращаться в стажера.

    Reply
  16. CheBurator

    Оффлайн.

    в оффлайне «вносят» данные в базу.

    за вреям оффлайна поменялась «структура» базы. Добавлены новые реквизиты, которые обязательно должны быть заполнены, причем заполняет юзверь, интерактивно. Что будет при сливе оффлайновых данных в базу? как отработает заполнение обязательных данных?

    Reply
  17. Sapiens_bru

    (16) Не знаю как это разруливается именно в metadata, но в похожих по смыслу веб проектах используется для обмена информацией набор данных типа 1С Структура. Где идёт перечисление всех свойств и их значений. Получив неполную структуру данных сервер всё равно пишет её в БД, ровно как и получив избыточную — пишет те поля, которые знакомы базе.

    Допустим, программист БД решил добавить новое, обязательное свойство к уже имеющейся базе. Это свойство не может заполнятся исключительно интерактивно, иначе уже имеющаяся БД перестанет работать сразу же. Ведь в имеющихся записях этого свойства нет. Эта коллизия разрешается на этапе создания свойства — либо автозаполнением существующей базы неким значением по умолчанию, либо ,что более правильно, в логику процесса записи данных в базу вносится значение по умолчанию, если свойство не заполнено.

    То есть программист-конфигураст создающий новое обязательное интерактивное свойство должен предусмотреть некое значение по умолчанию, если всё же пользователь не задаст свойство. Либо же программист разработчик платформы предусмотрит значения по умолчанию для всех возможных типов данных. Как например это сделано в платформе 1С с пустой датой, булевым — Ложь, ПустаяСсылка итд.

    Reply
  18. 1c-intelligence

    (16) для хранения данных используется CouchDB, она не табличная, и про метаданные ничего не знает. Поэтому структура данных в двух разных объектах одного типа может различаться, это совершенно нормально.

    Про метаданные знает приложение. Оно запросит объект из CouchDB (сырые данные, по сути), и заполнит этими данными объект, соответствующий метаданными. Отсутствующий реквизит будет на месте, только не будет заполнено его значение.

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

    Reply
  19. 1c-intelligence

    (7) сейчас, насколько я знаю, внутрь процесса управления версиями CouchDB глубоко залезть нельзя. Указать rev (идентификатор версии) можно, таким образом сказав CouchDB, что это тот же самый объект. Но в механизмы сравнения версий доступа нет.

    Reply
  20. yogaga

    (15) Понятно. На текущий момент получается, что для запуска своего проекта на метадате надо сначала присоединиться к разработке метадаты.

    Reply
  21. 1c-intelligence

    (20) мнения по этому поводу разделяются. Один парень считает, что… Ну, выше почитайте, что считает этот парень.

    Второй парень считает, что ждать, во-первых, нечего, а во-вторых — бессмысленно. Платформа никогда не будет «законченной», «готовой», «полностью документированной» и т.д. Надо просто брать и делать.

    Ну и не забывать, что платформа — открытая. Это означает, что, делая любой проект на metadata.js, вы не заметите, как стерлась грань между платформой и приложением.

    1С нас приучила, что платформа — это святое, неизменное и закрытое. Поэтому всегда есть четкое разделение между платформой и приложением. Вы пишете только приложение.

    А тут все едино. Просто файлы с кодом приложения лежат в одной папке, а файлы с кодом платформы — в другом.

    Reply
  22. yogaga

    (21) Допустим, мы начинаем проект на метадате. Идеальным видится команда из 1С-ника и JS-ка. Если с 1С-ником всё вроде понятно — он может разобраться с концепцией метадаты, но использовать грамотно сразу не сможет. Средний JS-ник же привык работать с хорошо документированными фреймворками, и «въехать» в метадату без документации и качественных примеров ему будет тяжело (и неинтерсно, скорее всего). JS-ник выше среднего не будет работать на голом энтузиазме, ему бабло рубить надо. И вот вопрос — а кто сможет «взять и делать»? Пока — никто, кроме компании Окнософт, имхо.

    Reply
  23. 1c-intelligence

    (22) лично мое мнение — лучше получится у 1Сника, потому что объектная модель больше похожа на 1С.

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

    Reply
  24. yogaga

    (23) А нужна ли метадата для несложных проектов? И соотношение затраченного времени и полученного результата будет не очень хорошим.

    То, что это работа на перспективу понятно, но, как написано в (15) 1-2 года работы «стажером» — это очень много. Я сейчас вижу потребность у бизнеса в подобном продукте, но «продать» бизнесу метадату на текущий момент очень сложно…

    Reply
  25. 1c-intelligence

    (24) 1-2 года — это мнение «того парня».

    Лично мне кажется, что успех как раз кроется в несложных проектах. Несложная там реализация, а не выхлоп.

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

    Reply
  26. yogaga

    (25) Да вот в том и проблема, что без вашей помощи «с нуля» даже такое реализовать будет очень сложно. Хотя, если выложите этот проект в готовом к применению виде — уже будет намного проще.

    Reply
  27. 1c-intelligence

    (26) да, так и собираемся сделать (выложить, в смысле).

    Reply
  28. user1025004

    (23)

    фикса

    Штатный программист обычно называется «фикси». А «фикса» это металлическая коронка на зубе.

    Reply
  29. 1c-intelligence

    (28) ценное замечание. Ну а чо.

    Reply
  30. unpete

    (22)

    Средний JS-ник же привык работать с хорошо документированными фреймворками

    А можно пример? Какой такой JS фреймворк не про интерфейс, а про ссылочную типизацию и распределенные данные? С подписками на события, модификаторами, допреквизитами.

    imho, выбор у этого «Среднего JS-ник» простой: писать движок данных с нуля или задействовать нашу математику. Поправьте, если ошибаюсь.

    Reply
  31. unpete

    (16)В мире NoSQL куча проблем, но вот этой «структура базы» — там нет.

    как отработает заполнение обязательных данных?

    Нормально отработает. Представьте, что база — это вы и вам принесли накладную на старом бланке или вообще, написанную от руки. Вы ведь, сможете понять, что там написано?

    Reply
  32. yogaga

    (30) Я не про возможности фреймворка, я про отсутствие качественной документации и небольшое количестве примеров.

    Reply
  33. unpete

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

    Reply
  34. unpete

    (16)У нас, структура хранения данных не тождественна структуре метаданных прикладного решения.

    Если перевести на 1С-ный язык, у вас может быть одна база SQL, к которой одновременно подключены УТ и Бухгалтерия. При этом, они будут иметь общие справочники, состав реквизитов у которых будет разный. У номенклатуры может быть склад по умолчанию, видимый только из УТ и счет учета, видимый только из БП.

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

    Reply
  35. yogaga

    (33) При чем тут схожие задачи? У вас есть проблема с документацией, вы проблему признаёте. Иван пытается проблему как-то решить. Я же просто говорю, что на данном этапе «продать» метадату бизнесу кому-то, кроме компании Окнософт, будет очень сложно. Надеюсь, что проблема в конечном итоге будет решена в обозримом будущем.

    Reply
  36. unpete

    (35) Сейчас метадата не предназначена для «продажи бизнесу». Она может быть полезна программисту, если он хочет расширить кругозор. На большее мы не претендуем.

    Reply
  37. CheBurator

    ну, веб — это вообще отдельная песня. Интернет — на 95% куча ..овна, и базы там такие же (не от хорошей жизни, конечно).

    Reply
  38. yogaga

    (36) Но в будущем вы планируете претендовать на большее? Или нет?

    Reply
  39. pm74

    (0) Иван спасибо за статью. После отпуска буду пробовать разобраться с метадатой. Как раз появится больше свободного времени (я надеюсь), т.к перехожу полностью на удаленку.

    Пока интересуют следующие моменты.

    Есть ли в метадате какой то аналог регистров накопления (остатки , обороты ), и /или каким образом их можно синхронизировать с регистрами в 1с.

    Вобще по большей части интересуют пока вопросы синхронизации различных объектов с 1с и настройка прав доступа к объектам в метадате.

    Reply
  40. 1c-intelligence

    (39) аналог регистров накопления — индексы. Это временное решение, вроде мы хотим сделать регистры более полноценными. Пока просто задач насущных нет на эту тему.

    Reply
  41. yogaga

    (40) Лучше займитесь документацией, пользы от этого будет больше, чем от аналогов регистров. Ведь метадата даже близко не для замены 1С :))

    Reply
  42. 1c-intelligence

    (41) мне вот кажется, что документация ничем не поможет.

    Как-то так в жизни постоянно получается, что захочешь — сделаешь без документации, а не захочешь — не сделаешь с документацией.

    Reply
  43. yogaga

    (42) А вот разработчики реакта, ангулара и т.п почему-то так не считают…

    Reply
  44. 1c-intelligence

    (43) да кто их разберет, нерусей

    Reply
  45. yogaga

    (44)Хорошо, ваш продукт — вам решать, что и как с ним делать. Решили оставить его уделом немногих энтузиастов — тоже выбор.

    Reply
  46. unpete

    (43) 1. Зачем противопоставлять? React мы активно используем для рисования интерфейса, есть возможность рендерить картинку с помощью vue, ember, angular или сырого dom — как человеку удобнее.

    2. Большая часть документации по react, redux, router и т.д., написана вовсе не разработчиками, а совсем другими энтузиастами, решившими заработать на модной теме.

    Reply
  47. unpete

    (38)

    будущем вы планируете претендовать на большее? Или нет?

    Где там матери и ее кастрюлям уцелеть в перспективе, удлиняемой жизнью сына

    Reply
  48. nyam-nyam

    (28)А может быть фикса это женский пол фикси?

    Reply
  49. ifilll

    Не «привыкательный» мозг получается однако 😉

    Reply
  50. kiruha
    Пока можно привести две цифры — 400 и 700. Столько пользователей держит приложение «Заказ дилера», созданное на metadata.js, у двух наших клиентов.

    Как решается вопрос с лицензиями ?

    Есть ли какая то позиция 1С ?

    Reply
  51. Sybr

    Не понимаю, зачем городить какие-то промежуточные абстракции между 1С и вебом. Очень похоже, что вы пытаетесь выдать локальную разработку за универсальное решение. Во многих крупных организациях есть подобные штуки, например на ASP.Net.

    Reply
  52. yogaga

    (50) А кто сказал, что эти клиенты работают с 1С? Из того, что их данные каким-то образом используются в 1С, не следует, что они работают с 1С.

    Reply
  53. Ibrogim

    Добрый день.

    Давно присматриваюсь метадате

    Что есть:

    Есть ребята которые сидят в лесу и бурят скважину, у них нет интернета. В экселевский несложный документ заносят данные, потом когда интернет появляется отправляют этот экселевский документ в центр. В центре этот документ загружают в базу на 1С.

    Вопросы:

    1. смогу ли я сделать (metadata.js) некую локальную базу, в которую офлайн смогут ребята вносить данные и при наличии интернета чтобы эти данные сами синхронизировались с 1С ?

    2. Сколько человекодней мне примерно понадобиться чтобы разобраться и это реализовать ?

    p.s. имею небольшие знания по php, jquery, ajax (например https://infostart.ru/public/385143 https://infostart.ru/public/543838 https://infostart.ru/public/465073/)

    Спасибо !

    Reply
  54. unpete

    (53) Сможете, но со стереотипами php, jquery, ajax придётся расстаться — у нас совсем другой подход к работе с данными.

    Reply
  55. unpete

    (51)

    зачем городить какие-то промежуточные абстракции между 1С и вебом

    Так никто и не городит абстракций «между».

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

    Reply
  56. unpete

    (53) По описанию, ваша задача решается за несколько часов, а у нас, иногда случаются приступы альтруизма. Можем сделать работающий стенд с исходниками в github абсолютно бесплатно.

    Reply
  57. Ibrogim

    (56) Спасибо за ответ! Я тогда уточню все детали и вам напишу. Если попаду в приступ альтруизма — замечательно, если нет, буду ковыряться сам.

    Хотя в любом случае ваша направление очень меня интересует ! Это реально круто, вы молодцы!

    Reply
  58. gudun_ku

    Решил попробовать.

    Не могу установить последний найденный релиз

    npm install -g metadata-js@0.12.231

    Error while executing:

    C:Program FilesGitcmdgit.EXE ls-remote -h -t https://github.com/unpete/react-panels.git

    remote: Repository not found.

    fatal: repository ‘https://github.com/unpete/react-panels.git/’ not found

    Reply
  59. gudun_ku

    (58)

    Отвечу сам себе: npm install -g metadata-js@0.12.225.

    Далее: нужен Python 2.7 установленный локально.

    Windows — переменные окружения не прокатят, нужно путь задать к python в npm config.

    npm config set python c:\pythonpython.exe

    gulp 4 не прокатит — нужно установить 3 версию. Но там тоже есть проблемы

    Reply

Leave a Comment

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