Автоматическое преобразование схемы СКД в программный код




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

64 Comments

  1. maxis33

    Интересная разработка, попробую на досуге!

    Reply
  2. mxm2

    плюс за идею.

    Reply
  3. Yashazz

    Мощно. Идея лежала на поверхности, но её надо было воплотить.

    Единственно, интерфейс бы дорихтовать — «Группа отбор» это так и задумано, или не поменян заголовок?

    Reply
  4. kiruha

    Да ляп,спасибо — поправлю.

    Reply
  5. semario

    +1 за идею и реализацию… а то в «кишках» копаться иногда ой как неохота)

    Reply
  6. sanches

    Спасибо, интересно. Обработка только для управляемых форм?

    Reply
  7. 0vrcr

    На скринах не увидел (портянку с кодом не изучал) формирует ли она сам процессор компоновки. Формирует? 🙂 Определение внешних источников данных?

    Reply
  8. kiruha

    (6) sanches,

    Да, для управляемых — но добавить обычную не проблема — если кому тонужно

    Reply
  9. kiruha

    (7) 0vrcr,

    Нет, она формирует программно только схему компоновки

    Дальше я же не знаю что захочет сделать с ней программист

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

    потом скопировать и отредактировать код, далее отправить по назначению.

    Reply
  10. Arvend

    Спасибо, сильная вещь.

    Reply
  11. Pechenuych_ka

    Хорошая идея!

    Reply
  12. DoctorRoza

    Поддерживаю, нужная вещица! 🙂

    Reply
  13. SeiOkami

    Плюс!

    Автор, можно реализовать своего рода «конвертёр» отчетов. Чтобы обработка создала файл отчета на основе готового на СКД (ну или просто на основе СКД) и туда прописала этот код. Это так, идея такая в голову пришла)

    Reply
  14. Rebel2007

    Попробую протестить на досуге.

    За идею плюс (+)!

    Reply
  15. kiruha

    (13) SeiOkami,

    да, интересно, надо обмозговать как это сделать получше…

    Все таки отчет не только схема

    Reply
  16. Матрос

    «Плюс».

    Спасибо все кто не поленился дочитать этот текст )

    Не поленился.

    Reply
  17. masik85

    офигеть +, одно дело мысль, другое дело -реализовать, просто преклоняюсь…

    Reply
  18. psih12

    А для обычных форм можете выложить?

    Reply
  19. amadeus2011

    спасибо автору за интересную разработку, очень помогает при разработке отчетов

    Reply
  20. wowik

    На 8.2.13 не работает.

    Reply
  21. kiruha

    (20)

    8.2.17

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

    Reply
  22. integragirl

    Респект автору! Очень полезная вещь, хоть увидеть все кишки скд-шки можно.

    Reply
  23. Yran

    (15)

    Плюс однозначно, а если еще реализует «конвертёр» (13)SeiOkami тогда 5 плюсов.

    Reply
  24. revril

    Начала изучать СКД. Долго получилась с программной установкой отбора! Думаю с помощью вашей разработки станет более понятнее механизм СКД! Спасибо!

    Reply
  25. Al-X

    + !!! Мне эта обработка точно пригодиться !!! 😉

    Reply
  26. zba

    Супер!!! + однозначно

    Reply
  27. Alister
    для обычных форм можете выложить?

    Присоединяюсь к просьбе.

    Reply
  28. amiralnar

    Крута! Спасибо, пригодилась!

    Reply
  29. sheff161

    выложите для обычных форм

    Reply
  30. oberonm

    Спасибо за идею

    Reply
  31. ivanov660

    Интересная идея. Будет время попробую поискать с практической точки зрения, вроде и задачка похожая есть.

    Reply
  32. AlexO

    (9)

    Нет, она формирует программно только схему компоновки

    Т.е. «иммитирует» программное создание Отбора, Настроек, Добавление полей, Параметры, Запрос и все?

    Т.е. основного кода принципа создания и «контроля» за СКД — не формирует?

    (13) SeiOkami,

    Чтобы обработка создала файл отчета на основе готового на СКД

    Какого «готового» СКД? Здесь нет создания самого отчета, его обработки и вывода. Только — схема.

    (3) Yashazz,

    Мощно. Идея лежала на поверхности, но её надо было воплотить.

    Если мощно — то надо написать, что не сам СКД делает программно, а схему настроек.

    (22) integragirl,

    хоть увидеть все кишки скд-шки можно

    нет, не можно. Это не тот конвертер.

    (24) revril,

    станет более понятнее механизм СКД!

    более понятным не станет.

    Применение обработки — поменять/добавить параметры и подобное (при том, что еще нужно знать, в какое место этот код добавлять, и где). Но не «сделать отчет на СКД».

    Reply
  33. AlexO

    (8)

    Да, для управляемых

    (20) wowik,

    На 8.2.13 не работает.

    (21)

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

    — хоть стой, хоть падай. Привет от 1с.

    Reply
  34. AlexO

    (25) Al-X,

    Мне эта обработка точно пригодиться !

    судя по аватаре — нет, не пригодится.

    Уже ничего не поможет.

    Reply
  35. AlexO

    (29) mi4asib,

    выложите для обычных форм

    на самом деле, kiruha, доделайте уж страждущим. Пусть радуются 🙂

    Reply
  36. kiruha

    Так она же для разработчиков — запустил режим управляемого приложения — переконвертировал и все.

    Минимум усилий

    Reply
  37. lamelioss

    Мощная штуковина =)) автору большое спасибо! )))

    Reply
  38. lamelioss

    если будут обновления под нее — вообще шоколад, а то галки по скд искать всесто привычного кода — это сатанизм =))

    Reply
  39. vasiliy_b

    Не работает, в клиент серверном варианте.

    Файл(отчет), нужно передавать на сервер через временное хранилище.

    Reply
  40. kiruha

    (39)

    Ок, спасибо — поправлю как только с работой разгребусь

    Reply
  41. kruglay

    ТОже плюсану!!!Много работы проделано

    Reply
  42. chmv

    Полезная штука

    Reply
  43. the1

    (0) Обычные формы, плизззз! Заранее плюс и спасибо!

    Reply
  44. alex_sear

    За работу жирный плюс, думаю некоторые вещи можно допилить =)

    Вопрос автору, разработка данной обработки будет продолжаться?

    Reply
  45. Sabfir

    Классная штука.

    Попробовал — очень полезно, не надо вспоминать что да как делается.

    Еще бы код вставить который формирует программно отчет.

    Reply
  46. GreenFox

    Да обычных форм не хватает, а код который формирует программно отчет можно и самому написать и в себе в шаблонах сохранить. Автор — молодец.

    Reply
  47. dyak84

    Автор ваша работа вещь знатная слов нет. Только есть к вам небольшая прозьба все ето дело виложить для обычных форм. Буду очень и очень признательным. Зарание спасибо

    Reply
  48. mixa_gr

    Заметил, что при использовании нескольких групп полей в исходном отчете получается не несколько групп на одном уровне, а группы вложенные одна в другую. Хотя вряд ли кто будет так программно выводить. Как правило достаточно получить результирующую табличку. Отличная разработка. Неплохо бы добавить НЕ управляемую форму.

    Reply
  49. andpyxa

    Хорошая обработка, но … хотел добавить обычную форму, открываю управляемую и вижу, что ВыполнитьПреобразованиеСервер() для преобразование вызывает вот такой вот хлам:

    Функция bf8ca7868f0b46ca8e0aff9842ca2f2e

    (a4bc2cc3040f4a127185588664e56,b3c8d32b68439b8ceb9de3cc700a94,af5874c967904edb82d0ebdf07778a4a,e7f008e4c48e6a042534817346cbc,da9c9c8b78411f9975155bdaac975c,aac765476383f42f6f21678844,d5e02ed4aa386614f3035c50060,bda8d53b5c464b38ade2958a60674b0e,ea312c14e25a862559cbcd8af79,b892134c74215a0dbae7dd491ebd8,df79010b;



    … и так далее.

    Просьба заменить на адекватный текст, нам тут шифроваться не от кого !

    Reply
  50. Светлый ум

    Ковертирует только основной макет, а если у меня составной отчет из 8 схем — то не видит.

    Reply
  51. Светлый ум

    dyak84, Если управляемую обработку (отчет) поместить в дерево конфигурации — то её можно будет открыть в обычном режиме (псевдоуправляемый).

    Reply
  52. andpyxa

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

    Reply
  53. ЧИА

    Скачал, хотел посмотреть, как генерятся программно пользовательские поля.

    ПользовательскоеПолеВыражениеКомпоновкиДанных

    К сожалению, заголовки выбрало, а формулы — нет

    Reply
  54. васисубатор

    По описанию вещь полезная, жаль посмотреть нет денег

    Reply
  55. kiruha

    Новые публикации невозможно сделать «без смартмани» — это к админам сайта

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

    Reply
  56. pumbaE

    (56) а можно по просить «на днях» поскорей, хоть сырой вариант?

    Reply
  57. stas1kbob

    выглядит круто, не пробовал

    Reply
  58. andpyxa

    ест уже вариант для загрузки без обсфукации, или пока ещё ждём ?

    Reply
  59. Voffffka

    Нужная вещь, то что искал! Только вот ошибочки бы поправить или код открыть,)

    Reply
  60. vpaoli

    Хотел посмотреть, что там …

    но получаю ошибку

    Каталог не обнаружен ‘C:UsersИвановDocuments\_БухКОРПОтчетыОтчетОДвиженииТМЦ_БП­Корп.erf’

    {ВнешнийОтчет.КонверторСхемыСКД.Форма.ФормаОтчета.Форма(128)}: ОбъектОтчет=ВнешниеОтчеты.Создать(ПутьКФайлуКомпоновки);

    {ВнешнийОтчет.КонверторСхемыСКД.Форма.ФормаОтчета.Форма(150)}: ЗаполнитьМакеты();

    по причине:

    Ошибка подключения внешних метаданных

    по причине:

    Каталог не обнаружен ‘C:UsersИвановDocuments\_БухКОРПОтчетыОтчетОДвиженииТМЦ_БП­Корп.erf’

    Reply
  61. vpaoli

    Я так тоже хочу стартмани зарабатывать , «чтобы править могли все кто пожелает» … )))

    Reply
  62. SeiOkami

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

    Reply
  63. kiruha

    (62)

    Это уже устаревшая разработка — уже не поддерживается.

    Скачал у вас также обработку за 1см

    Reply
  64. vpaoli

    (63) Спасибо. Вы оказались правы. В БД на моем компьютере все открылось без проблем. Автору респект!

    Reply

Leave a Comment

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