Запросник с отладкой СКД




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

33 Comments

  1. Serj1C

    Очень помогает в ситуациях, которые по-началу не поддаются объяснению )

    Reply
  2. Armando

    Молодец

    Reply
  3. Boroda

    К СКД ещё только приступил, поэтому не могу вполне оценить нужность этого механизма, но нутром чую, что он очень и очень пригодится. Попробую его понять и ипользовать. Спасибо!

    Reply
  4. Serj1C

    В дерево отчетов попадают используемые наборы данных типа Запрос

    Объединения содержат вложенные наборы данных

    Наборы данных типа Объект представляются как простой запрос описания таблицы (перечислены поля)

    Также платформа добавляет системные наборы данных (для построения иерархии и т.п.)

    Далее идет отдельная ветка «Схема», в которой находится исходная схема КД

    Reply
  5. Serj1C

    В самой консоли появилась дополнительная фишка — отладка запросов с передачей параметров типа «Таблица значений». Есть, конечно, ряд ограничений (на типизацию колонок), но в целом может пригодиться.

    Reply
  6. Serj1C

    (3) Boroda, идея обработки пришла в голову при просмотре курса http://www.spec8.ru/kurs-po-skd-besplatno

    Если только начал разбор СКД, то рекомендую начать с этого материала.

    Reply
  7. zaoproxy

    Хорошая идея и хорошая реализация. Молодец.

    Reply
  8. Boroda

    (6) Спасибо и за обработку, и за ссылку на курс по СКД.

    Reply
  9. vec435

    то что нужно

    Reply
  10. dkprim

    отлично, будем пробовать 🙂

    Reply
  11. mlv84

    Спасибо. Давно искала что-то подобное 🙂

    Reply
  12. mlv84

    Пытаюсь добавить параметры из запроса, выдает ошибку {Форма.Форма.Форма(1560)}: Ошибка при вызове метода контекста (НайтиПараметры): {(56, 1)}: Синтаксическая ошибка

    Reply
  13. mlv84

    на форме «Параметры» есть кнопка «Список» она в общем-то и не нужна, ведь когда выбираем значение параметра, то можем там указать, что это список значений и заполнить его. А вот если бы там была кнопка «Таблица значений» и она бы добавляла в параметр значение «Таблица значений» было бы классно.

    Reply
  14. Serj1C

    (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Reply
  15. Serj1C

    (13) mlv84, Таблицу значений я добавил для отладочных целей. Самостоятельный ее ввод мне, например, не очень нужен (даже ее редактирование). Это создаст кучу проблем (интерфейс, юзабилити, типизация колонок и т.д.) Но если вам это необходимо и думаете что это будет интересно сообществу — дерзайте! Выкладывайте. или напишите tezin, он может добавить этот функционал в следующих версиях.

    Reply
  16. mlv84
    Serj1C пишет:

    (12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)

    Это да, прошу прощения. Запрос просто был большой. Кусочек потерялся при копировании. А таблицу значений придумала как обойти. Спасибо.

    Reply
  17. Serj1C

    (16) mlv84, Поделись, плиз, как придумала

    Reply
  18. mlv84

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

    У меня было так:

    «ВЫБРАТЬ

    | ТаблицаПериодов.ДатаНачала КАК ДатаНачала,

    | ТаблицаПериодов.ДатаОкончания КАК ДатаОкончания,

    | ТаблицаПериодов.ГруппаНачислений

    |ПОМЕСТИТЬ ИсходныеДанные

    |ИЗ

    | &ТаблицаПериодов КАК ТаблицаПериодов

    ………………..

    а сделала так:

    «ВЫБРАТЬ

    | ДАТАВРЕМЯ(2011, 04, 01, 0,0,0) КАК ДатаНачала,

    | ДАТАВРЕМЯ(2011, 04, 30, 23,59,59) КАК ДатаОкончания,

    | «%ДопНачисление%» как ГруппаНасилений //У меня здесь строковое значение передавалось

    КАК ТаблицаПериодов

    Reply
  19. Serj1C

    (18) mlv84, Да, я тоже так делаю:

    Выбрать &Контрагент1 Контрагент, 15000 Сумма Поместить ТЗ

    Объединить все Выбрать &Контрагент2, 20000

    Объединить все Выбрать &Контрагент3, NULL

    и т.д.

    Reply
  20. tormozit

    Описанные функции (отладки запросов из компоновки) реализованы также в подсистеме «Инструменты разработчика» (функция Отладить, консоль компоновки данных) http://infostart.ru/public/15126/ . Там же там вы найдете много исследовательских инструментов в консоли компоновки данных, которые позволяет вам лучше понять, как устроен макет компоновки и расшифровка.

    Reply
  21. Serj1C

    (20) tormozit, да, ваша подсистема выше всех похвал

    Reply
  22. Serj1C

    UPD 29.02.2012

    Обновление оригинальной консоли до последней версии + возможность редактирования параметра с типом ТаблицаЗначений (интерфейс не дружественный, юзабилити на нуле, но если сильно понадобится, то редактируется).

    Reply
  23. leraks

    Очень помогает как раз разбираюсь с СКД

    Reply
  24. RanisNetMan

    Функционал отличный. Интерфейс хотелось бы по компактнее.

    Reply
  25. alex_shkut

    {Форма.ФормаОтладкаСКД.Форма(47)}: Ошибка при вызове метода контекста (Инициализировать)

    ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

    по причине: Ошибка компоновки данных

    по причине: Ошибка инициализации

    по причине: Ошибка в выражении

    по причине: Синтаксическая ошибка «Справочники.ТехнологическиеОперации.НайтиПоКоду»

    Стандартная СКД принимает выражение Параметра в таком виде. Если элемент справочника не предопределенный, его можно найти позже — ПоКоду, ну или ПоНаименованию, что хуже в случае редактирования Наименования 😉

    При вызове Отладка СКД и нажатии Сформировать обработка не понимает такого выражения для Параметра.

    Reply
  26. Serj1C

    (25) alex_shkut, Любопытно, никогда не замечал. Баг платформы. Могу отписать на 1c@1c.ru, но не думаю, что скоро исправят.

    Reply
  27. Рамзес

    Возможность отлаживать отчет на СКД из формы отчета — это очень удобно. Спасибо. Имя файла в пути поправьте.

    Reply
  28. Рамзес

    При использовании набора данных «Объект»:

    {Форма.Форма.Форма(791)}: Ошибка при вызове метода контекста (Выполнить): {(9, 2)}: Таблица не найдена «РезультатОсновногоЗапроса»

    <<?>>РезультатОсновногоЗапроса КАК Таблица


    РезультатОсновногоЗапроса — это имя объекта (внешнего набора данных).

    Reply
  29. Serj1C

    (28) Рамзес, по внешнему набору данных нет смысла отлаживать запрос.

    рекомендую для построения отчета по ТЗ использовать http://infostart.ru/public/120528/

    Reply
  30. alex_shkut

    Вот сам и отвечаю на свой пост (25)

    В Запроснике надо найти нечто похожее (не вскрывал его :))

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки,Истина);

    А вот описание значения Истина в конце функции:

    <ВозможностьИспользованияВнешнихФункций> (необязательный)

    Тип: Булево. Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.

    Значение по умолчанию: Ложь

    В моей текущей ситуации это была именно внешняя функция, но думаю, что это касается и прочих «СКД недвижковых» функций типа Справочники.НайтиПоКоду().

    Мне помогло, думаю что в Запроснике этого будет достаточно, чтобы ошибка исчезла.

    Нашел, где это: ФормаОтладкаСКД строка 47

    имеем: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);

    надо: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,истина);

    Reply
  31. Serj1C

    (30) alex_shkut, мда, не тривиально… Ок, мотаем на ус!

    Reply
  32. birusik

    Почему Вы не пишите вначале, что это для обычных форм, я получается зря потратила стартмани!

    Reply
  33. Serj1C

    (32) Публикация 2011 года, на сриншотах обычное приложение…

    Давайте я вам вышлю инструменты, которые использую сейчас в работе

    Reply

Leave a Comment

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