Работа с трёхмерными объектами штатными средствами




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

30 Comments

  1. Неопределено

    (1)

    Какое же это 3Д если объекты при удалении не уменьшаются?

    3D — это пространство с тремя осями координат. Их здесь три, просто в той проекции, которую я использую, нет перспективы, о чём я написал в статье. Объёмная фигура остаётся объёмной в своём виртуальном трёхмерном пространстве, но проецируется на экран она без учёта расстояния до каждой точки, что не мешает воспринимать её как объёмную фигуру и не делает её не трёхмерной. Это проблема метода проекции, а не виртуального объёма. Я не ставил перед собой цель научить как делать правильно, а просто хотел сказать «народ, я этого не видел раньше, но вот так тоже можно в 1С, посмотрите, вдруг понадобится, в этом направлении тоже можно развивать идеи». Я просто выбрал интересную для себя задачу и решил её так, как я умел, чтобы отдохнуть от регистро-отчётной рутины. Мне было интересно сделать это самостоятельно, размять мозги, подумать в новом для себя направлении без посторонней помощи. Меня этому не учили и поэтому меня это привлекло. Я сторонник идеи «используй готовую библиотеку», но эта статья — не решение проблемы, а попытка расширить кругозор, сказать что 1С умеет больше, чем мы привыкли. Сказать это своими словами, а не автора учебника по компьютерной графике. В конце концов, в завершении я написал что буду благодарен за описание работы с трёхмерными объектами с помощью матриц. Я примерно представляю что так можно сделать, но это очень далеко от моей специализации.

    еще в древнем мире объемный куб изображали так

    Вот вы пишете что у меня не 3D, а я могу то же самое написать про этот куб. Или это прямоугольный параллелепипед? Или усечённая пирамида? Или квадрат с рисунком? Или труба с квадратным сечением? Это проблема удобства восприятия. Я сделал его удобнее. Не идеальным, но удобнее чем никак и в статье я написал, что можно сделать лучше, просто я в силу своих способностей пока не могу так сделать.

    Reply
  2. madonov

    Ждем 1С:САПР =)

    Reply
  3. CyberCerber

    (1) Интересные вещи на ИС происходят, как-то одновременно появилось несколько авторов, занимающихся графикой, так у них еще и полемика начинается.

    Прямо 1С-ные компьютерно-графичные войны!

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

    Reply
  4. Неопределено

    (4)

    Прямо 1С-ные компьютерно-графичные войны!

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

    Reply
  5. Неопределено

    (3) Скорее появится 1С: DOOM

    Reply
  6. ivanov660

    (1)Коллега прежде чем ругаться почитали бы сами немного теорию по компьютерной графике. Есть проекция изометрическая, а есть ортографическая. В учебниках по азам OpenGL, DirectX это идет в первых главах. Автор как раз нам и продемонстрировал вариант ортографической проекции.

    Reply
  7. HAMMER_59

    (7) Знание Вами теории нужно еще проверять, подозреваю только что поисковиком и нашли термины о которых раньше и не слышали.

    Если отбросить все лишнее останется только: коллега просто отбросил координату Z при выводе изображения на экран. Ну мягко говоря, так себе 3Д.

    Подозреваю что на банальный вопрос в чем отличие Direct 3D от Open GL не сможете дать ответ, а я могу и поглубже копнуть, намного глубже.

    Reply
  8. HAMMER_59

    (7) Если придираться то DirectX включает Direct3D, и в книгах по DirectX, как раз про Direct3D не пишут.

    Но я ведь не об этом писал. Я писал, что теория компьютерной графики и для OpenGL, и для Direct 3D она везде одинаковая.

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

    Лично я бы хотел, чтобы Инфостарт был познавательным ресурсом, а не развлекательным.

    Reply
  9. HAMMER_59

    (2)

    Вот вы пишете что у меня не 3D, а я могу то же самое написать про этот куб. Или это прямоугольный параллелепипед? Или усечённая пирамида? Или квадрат с рисунком? Или труба с квадратным сечением? Это проблема удобства восприятия. Я сделал его удобнее.

    Может оно так прозвучало, но я не об этом писал.

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

    Не просто так рассматриваются все преобразования на плоскости. Этому есть понятная причина — восприятие такого материала намного проще.

    И после правильно изложенного материала на плоскости, переход в 3-х мерному пространству крайне прост. Фактически появляется ось Z, которая расположена по центру экрана и направлена в глубь экрана. Матрицы преобразований остаются практически такими же, конечно с учетом появившейся координаты. Т.е. изменения в коде минимальны, все работает точно так же.

    И если нет изометрической проекции, определения передней и задней части грани, что тогда нового, о чём тут рассказывать, чем это отличается от 2Д?

    Reply
  10. ivanov660

    (9)Соглашусь в том, что данный пример не несет смысловой нагрузки. Пример можно рассматривать как забавный пример, эксперимент или что-то в данном духе.

    Reply
  11. ivanov660

    (8)1. Сомневаюсь, что человек не знакомый с работой 3д графики обладает данными понятиями. К тому же, чтобы что-то найти надо знать что искать.

    А так мне довелось заниматься работой с графикой до работы в 1С, на протяжении 10 лет.

    Думаю вам знакомы понятия GLUT, GL_TRIANLE, z-buffer, стенсельные и объемные тени, GLSL (вертексные и пиксельные шейдеры),VertexBufferArrayи т.д.

    2. Мериться размерами знаний просто так не вижу смысла. Вот если бы вы поставили на кон что-то 😉

    3. В свое время, когда изучал графику, мне Dircet не пришелся по вкусу 5,6 версии были очень сложными в понимании и только с 9-й версии появилось удобство в работе как с OpenGL. Думаю что в качестве основного отличия будем считать программный интерфейс и поддержку видеокартами специфики команд расширения. Ну, и директы доступны, только под виндой.

    Reply
  12. HAMMER_59

    (12)

    Думаю вам знакомы понятия GLUT, GL_TRIANLE, z-buffer, стенсельные и объемные тени, GLSL (вертексные и пиксельные шейдеры),VertexBufferArrayи т.д.

    Из всего вышеперечисленного знаю только z-buffer.

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

    Reply
  13. ivanov660

    (13)Сейчас на самом деле пора собственных движков прошла и эти знания по сути не нужны.

    Достаточно взять готовый фреймворк. К примеру, самый простой и удобный Unity3d. Тут есть и прекрасный IDE, и набор плагинов и вообще прикольная штука.

    Написать мобильное приложение для меня приятнее в нем, нежели в EDT или конфигураторе.

    Reply
  14. Casey1984

    (6) Финальные боссы — ФНС, ПФР и Меркурий 😉

    Reply
  15. MuI_I_Ika

    Автор жги. Никого не слушай

    Reply
  16. pm74

    (4)

    Прямо 1С-ные компьютерно-графичные войны!

    действительно забавно получается .

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

    Reply
  17. Неопределено

    (16) Спасибо, давно не виделись (я Golickoff с сам знаешь какого форума).

    Reply
  18. HAMMER_59

    (14) Я смотрю на графику с другой точки зрения. Для меня представляет интерес — математическая модель.

    Мне реально интересно как с помощью математики, физики можно смоделировать модель реального мира.

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

    С другой стороны 1С тоже ведь моделирует хозяйственную деятельность.

    Еще добавлю, чем меня восхищают графические движки, они ведь не точную модель строят, а приближенную, но при этом выглядит реалистично, современную 3Д графику которая на ходу рендерит, пускай даже 60 кадров, уже не отличить от видео. Реальный мир ведь не из треугольников состоит, а свет из просто гигантского числа фотонов, которые еще и ведут себе не линейно.

    Reply
  19. SlavaKron

    (7) Разве изометрическая не является вариантом ортографической?

    Reply
  20. Неопределено

    (10)

    чем это отличается от 2Д?

    Всем:



    Слева 3D, справа 2D.

    Reply
  21. HAMMER_59

    (21)

    По мне так в обоих случая 3Д, просто геометрические фигуры разные.

    Зачем выдергивать фразу из контекста?

    Я ведь написал не как визуально выглядит, а про математическую модель. И в следующей статье, я покажу, что ничего менять даже в коде не надо, чтобы перейти от 2Д к 3Д. Матрицы преобразований станут 4х4, а не 3х3, но заполняться они будут абсолютно точно также.

    Т.е. это самая настоящая декомпозиция, из сложной задачи, мы получили несколько простых. А в случае перехода к 3Д, даже никаких усложнений не произойдет. Конечно, пока не введем новые преобразования, но это именно будут уже новые преобразования.

    Reply
  22. Неопределено

    (22) Показывайте. Никто же не против. Я ведь уже объяснил: я просто придумал задачу и решил её своим путём. Почему-то так получилось, что одновременно с этим вы решили написать статью на ту же тему и хотите сделать её своим путём. Вы выбрали матрицы, а я выбрал треугольники. Я сделал как смог, без подготовки. Вы хотите сделать как по вашему мнению правильнее, имея знание теории. Это же наоборот здорово. Людям будет с чем сравнить.

    Reply
  23. HAMMER_59

    (23) В чем предмет спора?

    Я высказал свое мнение, что прежде чем решать задачу, стоит поискать накопленный опыт. В случае с компьютерной графикой, такой опыт есть, информация крайне доступна. Это 20 лет назад, были проблемы с интернетом, документация сплошь на английском. А сейчас всё очень доступно.

    А Вам вот захотелось так — это Ваше право. Я всего лишь высказал свое мнение, что, на мой взгляд, есть вариант проще и эффективней.

    Reply
  24. Неопределено

    (24)

    В чем предмет спора?

    Я и не спорю.

    Я всего лишь высказал свое мнение

    И я каждый раз согласился с ним за исключением того момента, что это не 3D. Просто не смотря на то что я с вами соглашаюсь, вы раз за разом повторяете что я делаю неправильно, хотя все и так всё поняли с первого раза.

    Reply
  25. madonov

    (15) ЕГАИС, 6-НДФЛ, Онлайн-Кассы, смена ставки НДС…

    Reply
  26. WalterMort

    (14) Достаточно долго занимаюсь Unity и эти знания очень даже нужны. Особенно если пишешь плагин, а что-то серьезное без своих плагинов не напишешь.

    Reply
  27. ivanov660

    (27)всегда можно купить, у них замечательный магазин.

    По опыту, пробовал писать 2d скроллеры, все что нужно есть, кодил только логику и поведение.

    Reply
  28. Неопределено

    (19)

    Если посмотреть на картинку с википедии, становится понятно что изометрия, диметрия и триметрия являются частными случаями аксонометрии. Про ортографию я не нашёл ни слова, но есть схожее с аксонометрической проекцией описание на других ресурсах. Поэтому, если это одно и то же, понятие изометрической проекции уместно для чертежа на бумаге, но не для объёмной фигуры, на которую можно смотреть с любой стороны. Но в целом да, получается что изометрическая проекция это частный случай ортографической, который мы увидим, наблюдая фигуру под строго определёнными углами. А в целом этот тип проекции с построением параллельных линий википедия зовёт аксонометрической проекцией.

    Reply
  29. banch46 Вы можете связать свой профиль с профилями

    Добрый день. что то я не понял. Это сделано штатными средствами без использования компонент? А что за объект используется «ТаблицаКординат» и куда производится вывод?

    Reply
  30. Неопределено

    (30) Здравствуйте. Да, исключительно штатными средствами. ТаблицаКоординат — это таблица значений с реквизитами Х, У и З, имеющими тип число. Всё выводится в табличный документ, но это сделано просто потому что у меня был готовый шаблон обработки. Как я написал в статье, вывод можно осуществлять в векторном, а также в растровом форматах. Здесь я просто хотел показать что так в принципе можно делать. Ниже привёл скриншот обработки, открытой в конфигураторе

    Reply

Leave a Comment

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