Отладка обработчиков в КД 2.0.24




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

37 Comments

  1. Totoro

    Исправил ошибки для ПКС субконто (файл обработки обмена). Заодно добавил информационное сообщение, если ПКО субконто не найдено.

    Reply
  2. Totoro

    Если кто пользовался — прокомментируйте неудобства 🙂

    Reply
  3. Totoro

    Пока архив недоступен. Переделываю обработку под возможность изменения кода обработчиков во время выполнения при ошибке. Когда все оттестирую — выложу.

    Reply
  4. Totoro

    В данный момент я сделал так, если происходит ошибка открывается окно для редактирования текста обработчика, с закладкой с типами, значениями параметров обработчика, установленными на момент ошибки (выводится только верхний уровень без раскрытия по полям). Потом при принятии изменений производится повторная попытка его выполнения. Проблема в том, что если в обработчике были изменены исходные параметры (код типа «Значение = Значение.Код»), то повторное выполнение может быть невозможным. В принципе я делал сохранение параметров перед вызовом обработчика и восстановление их при ошибке, но я не уверен что для всех типов это прокатит, да и для больших ТЗ (напр. в ВходящиеДанные) это не очень удобно.

    Вопрос: есть какие-либо идеи по этому поводу или достаточно этого для случаев синтаксических ошибок и простых обработчиков, не изменяющих параметры?

    Reply
  5. tormozit

    Картинки были бы полезны

    Reply
  6. Totoro

    Завтра утром выложу, заодно исправлю свою ошибку в макете при загрузке алгоритмов из 7.7 в 8.1

    Reply
  7. Totoro

    1) 8.1: Добавлена возможность вычисления любых выражений на встроенном языке при отстановке при ошибке на закладке «Параметры»

    2) 7.7: Исправил свою ошибку в алгоритме выгрузки алгоритмов, используемых при загрузке.

    3) 7.7: Для ПВД для произвольного алгоритма в качестве ВыборкаДанных можно указывать запрос (как в функции СоздатьЗапрос).

    Reply
  8. Totoro

    Версия для КД 2.0.19

    1) 8.1: Для редактирования при ошибке переделан алгоритм и немного изменена сама форма (структуры, соответствия, «ПКО», «ПКС», «ПКГС» разворачиваются по полям)

    Reply
  9. support

    за обновление +

    Reply
  10. Totoro

    1) При редактировании при ошибке разворачиваются по полям параметры с именем «Правило».

    Если для значения параметра возможно выполнение метода Метаданные(), то он разворачивается по полям «Измерения», «Реквизиты», «Ресурсы», «Таб.части» (для таб.части указывается количество строк, саму ТЧ можно просмотреть, например, добавит параметр вида: НашОбъект.НашаТабЧасть.Выгрузить().ВыбратьСтроку() )

    2) Добавлена возможность остановки при ошибке при записи и удалении объекта (например все обработчики отработали нормально, а тут такой облом — при записи «код не уникален» 🙂 )

    3) Исправленны выявленные ошибки, которые пропустил в п.3 от 31.07.07 🙁

    Ну, вот, вроде сделал все что хотел 🙂

    Reply
  11. Totoro

    Кстати, код остановки при ошибке можно использовать и в своих обработках, если использование отладчика затратно по времени,а в случае ошибки необходимо просмотреть результат. Он позволяет просматривать любые выражения и переменные определенные в обрабатываемом коде на момент ошибки (вызова модальной формы).

    ЗЫ Неужели никаких отзывов нет ? 🙂

    Reply
  12. Totoro

    Недавно пришла мысль делать синтаксический контроль текста обработчиков 8.Х уже на этапе формирования правил, чтобы уменьшить потеря времени во время загрузки/выгрузке (для этого достаточно знать параметры обработчика). Надо бы реализовать такое для 2.0.20 🙂

    Reply
  13. tormozit

    (12) Хорошая идея. Реально сделать с небольшими оговорками.

    Reply
  14. Totoro

    На соновании разработок: http://infostart.ru/projects/1843/ и http://infostart.ru/projects/1274/ пришла идея переделать свою обработку для отладки. Получилось два варианта:

    1) При формировании правил в КД создается измененный модуль УниверсальныйОбменXML и сохраняется как внешняя обработка, в который добавляются обработчики выгрузки или загрузки. При открытии в 1С обработки УниверсальныйОбменXML при выгрузке/загрузке происходит передача выполнения в сохранную внешнюю обработку, где уже можно ставить точки останова и отлаживать код пошагово.

    2) Формирование внешней обработки и передача выполнения в неё происходит после загрузки правил обмена в 1С.

    У обоих вариантов есть как плюсы, так и минусы. Пока я сделал второй вариант (выложу позднее), но с точки зрения удобства и скорости начинаю склоняться к первому. Возможно у кого-нибудь есть другие мнения. Буду благодарен за помощь 🙂

    Reply
  15. Totoro

    Выложил пробную версию измененной типовой обработки УниверсальныйОбменДаннымиXML 2.0.23, в которой реализован второй вариант отладки. Принцип работы:

    1) На закладке «Отладка» устанавливается галочка «Отладка во внешней обработке»

    2) Указывается каталог для хранения обработки

    3) Выгрузка:

    — После загрузки правил обмена происходит создание внешней обработки с кодом обработчиков

    — Вызывается ПослеЗагрузкиПравилОбмена из неё

    — Дальше можно редактировать отборы/параметры

    — После начала выгрузки выполнение передается во внешнюю обработку

    4) Загрузка

    — После начала загрузки файла первый раз грузится только заголовок (правила обмена и т.п.) и на его основе создается внешняя обработка с кодом обработчиков

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

    ПРИМЕЧАНИЕ: Это пока пробная версия. Я проверял только большинство обработчиков. Работу с планами обмена еще не проверял.

    Вообщем хотелось бы узнать мнение о самой идее 🙂

    Reply
  16. Totoro

    2.0.23.2:

    1) Протестировал обработчики

    2) Добавил возможность грубой синтаксической проверки текста обработчиков при загрузке правил обмена.

    Если код обработчика при загрузке правил обмена (при загрузке или выгрузке) не прошел контроль, то его можно отредактировать и попробывать повторить проверку. Замечание: параметры обработчиков беруться из макета кдОбработчикиСобытий8 и могут быть дополнены другими локальными переменными.

    3) Добавил возможность отдельного выбора синтаксической проверки алгоритмов или формирования их кода во внешней обработке. Замечание: параметры алгоритма (локальные переменные модуля, используемые в алгоритме) должны быть указаны в последней строке алгоритма в виде «//АЛГОРИТМ(Парам1,Парам2, Парам3)»

    Reply
  17. Totoro

    Добавил:

    Замена стандартной обработки Выгрузка конвертации из КД. Добавлено автосборка обработок 7.7 с помощью GCOMP, для обмена 7.7 — 8.1 выгрузка доп. обработок, обработчик «После загрузки правил обмена», галочка «Новые не создавать, если НЕ найден».

    Вырсия обработки КД 2.0.22, платформа 8.1.11

    ЗАМЕЧАНИЕ: все файлы GCOMP включены в макет обработки, для каталога GCOMP указывать путь без пробелов. Для использовании галочки «Новые не создавать, если НЕ найден» нужно подправить саму КД, т.к. для 7.7 она блокируется.

    Reply
  18. Totoro

    Обновил УниверсальныйОбменДаннымиXML для последней КД 2.0.23.1

    2.0.23.3:

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

    Добавлена облегченная версия для работы только совместно с системой «Инструменты разработчика» 1.58 и старше.

    Reply
  19. Totoro

    Обновил УниверсальныйОбменДаннымиXML для последней КД 2.0.24.1

    Reply
  20. Totoro

    Блин, левый архив вчера на ночь глядя выложил. Ошибку исправил. Прошу прощения, если кто скачал.

    Reply
  21. Totoro

    Если пользуетесь моей обработкой УниверсальныйОбменДаннымиX — не забывайте плюсовать:

    http://infostart.ru/projects/1843/ — V8Unpack 2.0

    http://infostart.ru/projects/1274/ — Система «Инструменты разработчика»

    уважайте чужой труд …

    Reply
  22. tormozit

    Версия 2.0.25.1

    Новое в версии

    Доработана функциональность обработки УниверсальныйОбменДаннымиXML. С помощью этой обработки можно генерировать отладочный модуль с обработчиками событий и выполнять отладку обработчиков и алгоритмов в процессе загрузки или выгрузки данных.

    Смотрел?

    Reply
  23. Totoro

    Отладка обработчиков в свете последнего релиза КД уже не такая сложная, хоть и не так удобная. Т.ч. если нужна новая версия под неё — пишите, сделаю. А так меня пока устаривает текущая, а с обменами 7.7 уже не работаю.

    Reply
  24. ValeriVP

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

    Reply
  25. Totoro

    (25) со стандартными переносами 1С поработай … особенно когда правила нужно оставить типовыми.

    ЗЫ Не была бы нужна, не стало бы 1С переписывать весь код обработки для подобной поддержки 🙂

    Reply
  26. German

    Описания нет.

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

    То есть потом его можно благополучно загрузить в КД.

    Класная штука .. очень помагает в отладке типовых? особенно для УПП? с учетом того что последние на версию 1.2.6 🙂

    Reply
  27. Totoro

    (27) Описание в комментариях ранее. Т.к. особо интерес никто не проявлял заморачиваться со справкой не стал.

    Отладка в правила изменения не вносит, т.к. просто (после загрузки правил) создается внешняя обработка с подмененным модулем и включенным кодом обработчиков, выполнение передается в неё и подменяются вызовы для Выполнить обработчиков. В последней версии обработки 1С сделала подобное, но модуль обработки нужно заменять самому. Т.о. правила не отличаются от типовых и если не нужна отладка можно не использовать эту обработку.

    Последний вопрос (намек?) не понял …

    Reply
  28. German

    Реклама этой обработки http://enterprise-integrator.blogspot.com/2008/12/blog-post.html

    Reply
  29. Aero86

    как загрузить обработку в редакции 10.2?

    Reply
  30. artbear

    Есть более свежий вариант для последней версии КД 2.1.2.1 ?

    Reply
  31. artbear

    (31+) Обновил выгрузку для КД 2.1.2.1

    [+] изменения в форме делаются только программно, что удобно при обновлении основной конфигурации

    [+] если в имени каталога для GComp есть пробелы, такой каталог запрещено использовать, о чем явно сообщается пользователю

    [+] ко всем методам добавлен префикс GComp для удобства сопровождения

    [+] все изменения четко обозначены спец.комментами для удобства сопровождения

    [*] небольшой рефакторинг

    Смотрите приложенный файл.

    Reply
  32. Totoro

    (31) С конвертацией из 7.7. уже давно не возился, поэтому не обновлял сборку через GCOMP. Т.ч. спасибо за проделанный труд.

    Reply
  33. Поручик

    (32) Файл битый скачивается.

    (33) Сделал тоже самое сам, может вывалить?

    Reply
  34. artbear

    (34) Файл был нормальный. Заново выложил его в этот же пост (32)

    Reply
  35. galaxymaster

    Спасибо,

    Reply
  36. necropunk

    Крутая вещь. Не вполне еще разобрался, конечно, но буду пытаться.

    Reply
  37. Xershi

    Завтра тестировать буду, но может сейчас ответите:

    Галка «Не создавать новый объект в приемнике, если он НЕ найден» при загрузке в 7.7 будет работать?

    Обсуждаю данный вопрос тут

    Reply

Leave a Comment

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