<?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='\
Исправил ошибки для ПКС субконто (файл обработки обмена). Заодно добавил информационное сообщение, если ПКО субконто не найдено.
Если кто пользовался — прокомментируйте неудобства 🙂
Пока архив недоступен. Переделываю обработку под возможность изменения кода обработчиков во время выполнения при ошибке. Когда все оттестирую — выложу.
В данный момент я сделал так, если происходит ошибка открывается окно для редактирования текста обработчика, с закладкой с типами, значениями параметров обработчика, установленными на момент ошибки (выводится только верхний уровень без раскрытия по полям). Потом при принятии изменений производится повторная попытка его выполнения. Проблема в том, что если в обработчике были изменены исходные параметры (код типа «Значение = Значение.Код»), то повторное выполнение может быть невозможным. В принципе я делал сохранение параметров перед вызовом обработчика и восстановление их при ошибке, но я не уверен что для всех типов это прокатит, да и для больших ТЗ (напр. в ВходящиеДанные) это не очень удобно.
Вопрос: есть какие-либо идеи по этому поводу или достаточно этого для случаев синтаксических ошибок и простых обработчиков, не изменяющих параметры?
Картинки были бы полезны
Завтра утром выложу, заодно исправлю свою ошибку в макете при загрузке алгоритмов из 7.7 в 8.1
1) 8.1: Добавлена возможность вычисления любых выражений на встроенном языке при отстановке при ошибке на закладке «Параметры»
2) 7.7: Исправил свою ошибку в алгоритме выгрузки алгоритмов, используемых при загрузке.
3) 7.7: Для ПВД для произвольного алгоритма в качестве ВыборкаДанных можно указывать запрос (как в функции СоздатьЗапрос).
Версия для КД 2.0.19
1) 8.1: Для редактирования при ошибке переделан алгоритм и немного изменена сама форма (структуры, соответствия, «ПКО», «ПКС», «ПКГС» разворачиваются по полям)
за обновление +
1) При редактировании при ошибке разворачиваются по полям параметры с именем «Правило».
Если для значения параметра возможно выполнение метода Метаданные(), то он разворачивается по полям «Измерения», «Реквизиты», «Ресурсы», «Таб.части» (для таб.части указывается количество строк, саму ТЧ можно просмотреть, например, добавит параметр вида: НашОбъект.НашаТабЧасть.Выгрузить().ВыбратьСтроку() )
2) Добавлена возможность остановки при ошибке при записи и удалении объекта (например все обработчики отработали нормально, а тут такой облом — при записи «код не уникален» 🙂 )
3) Исправленны выявленные ошибки, которые пропустил в п.3 от 31.07.07 🙁
Ну, вот, вроде сделал все что хотел 🙂
Кстати, код остановки при ошибке можно использовать и в своих обработках, если использование отладчика затратно по времени,а в случае ошибки необходимо просмотреть результат. Он позволяет просматривать любые выражения и переменные определенные в обрабатываемом коде на момент ошибки (вызова модальной формы).
ЗЫ Неужели никаких отзывов нет ? 🙂
Недавно пришла мысль делать синтаксический контроль текста обработчиков 8.Х уже на этапе формирования правил, чтобы уменьшить потеря времени во время загрузки/выгрузке (для этого достаточно знать параметры обработчика). Надо бы реализовать такое для 2.0.20 🙂
(12) Хорошая идея. Реально сделать с небольшими оговорками.
На соновании разработок:http://infostart.ru/projects/1843/ и http://infostart.ru/projects/1274/ пришла идея переделать свою обработку для отладки. Получилось два варианта:
1) При формировании правил в КД создается измененный модуль УниверсальныйОбменXML и сохраняется как внешняя обработка, в который добавляются обработчики выгрузки или загрузки. При открытии в 1С обработки УниверсальныйОбменXML при выгрузке/загрузке происходит передача выполнения в сохранную внешнюю обработку, где уже можно ставить точки останова и отлаживать код пошагово.
2) Формирование внешней обработки и передача выполнения в неё происходит после загрузки правил обмена в 1С.
У обоих вариантов есть как плюсы, так и минусы. Пока я сделал второй вариант (выложу позднее), но с точки зрения удобства и скорости начинаю склоняться к первому. Возможно у кого-нибудь есть другие мнения. Буду благодарен за помощь 🙂
Выложил пробную версию измененной типовой обработки УниверсальныйОбменДаннымиXML 2.0.23, в которой реализован второй вариант отладки. Принцип работы:
1) На закладке «Отладка» устанавливается галочка «Отладка во внешней обработке»
2) Указывается каталог для хранения обработки
3) Выгрузка:
— После загрузки правил обмена происходит создание внешней обработки с кодом обработчиков
— Вызывается ПослеЗагрузкиПравилОбмена из неё
— Дальше можно редактировать отборы/параметры
— После начала выгрузки выполнение передается во внешнюю обработку
4) Загрузка
— После начала загрузки файла первый раз грузится только заголовок (правила обмена и т.п.) и на его основе создается внешняя обработка с кодом обработчиков
— Передается выполнение во внешнюю обработку, где файл грузится во второй раз и правила обмена уже пропускаются
ПРИМЕЧАНИЕ: Это пока пробная версия. Я проверял только большинство обработчиков. Работу с планами обмена еще не проверял.
Вообщем хотелось бы узнать мнение о самой идее 🙂
2.0.23.2:
1) Протестировал обработчики
2) Добавил возможность грубой синтаксической проверки текста обработчиков при загрузке правил обмена.
Если код обработчика при загрузке правил обмена (при загрузке или выгрузке) не прошел контроль, то его можно отредактировать и попробывать повторить проверку. Замечание: параметры обработчиков беруться из макета кдОбработчикиСобытий8 и могут быть дополнены другими локальными переменными.
3) Добавил возможность отдельного выбора синтаксической проверки алгоритмов или формирования их кода во внешней обработке. Замечание: параметры алгоритма (локальные переменные модуля, используемые в алгоритме) должны быть указаны в последней строке алгоритма в виде «//АЛГОРИТМ(Парам1,Парам2, Парам3)»
Добавил:
Замена стандартной обработки Выгрузка конвертации из КД. Добавлено автосборка обработок 7.7 с помощью GCOMP, для обмена 7.7 — 8.1 выгрузка доп. обработок, обработчик «После загрузки правил обмена», галочка «Новые не создавать, если НЕ найден».
Вырсия обработки КД 2.0.22, платформа 8.1.11
ЗАМЕЧАНИЕ: все файлы GCOMP включены в макет обработки, для каталога GCOMP указывать путь без пробелов. Для использовании галочки «Новые не создавать, если НЕ найден» нужно подправить саму КД, т.к. для 7.7 она блокируется.
Обновил УниверсальныйОбменДаннымиXML для последней КД 2.0.23.1
2.0.23.3:
Добавил флаг «Открывать внешнию обработку в конфигураторе при выполнении» для открытия создаваемой внешней обработки в конфигураторе при начале обмена с ожиданием продолжения (удобно, чтобы установить точки для отладки).
Добавлена облегченная версия для работы только совместно с системой «Инструменты разработчика» 1.58 и старше.
Обновил УниверсальныйОбменДаннымиXML для последней КД 2.0.24.1
Блин, левый архив вчера на ночь глядя выложил. Ошибку исправил. Прошу прощения, если кто скачал.
Если пользуетесь моей обработкой УниверсальныйОбменДаннымиX — не забывайте плюсовать:
http://infostart.ru/projects/1843/ — V8Unpack 2.0
http://infostart.ru/projects/1274/ — Система «Инструменты разработчика»
уважайте чужой труд …
Версия 2.0.25.1
Новое в версии
Доработана функциональность обработки УниверсальныйОбменДаннымиXML. С помощью этой обработки можно генерировать отладочный модуль с обработчиками событий и выполнять отладку обработчиков и алгоритмов в процессе загрузки или выгрузки данных.
Смотрел?
Отладка обработчиков в свете последнего релиза КД уже не такая сложная, хоть и не так удобная. Т.ч. если нужна новая версия под неё — пишите, сделаю. А так меня пока устаривает текущая, а с обменами 7.7 уже не работаю.
имхается мне что не очень полезная вещь. я обработчики длинее трех строк очень редко пишу. обычно делаю обработку, и из обработчиков вызываю нужные процедуры — т.е. тоже самое.
(25) со стандартными переносами 1С поработай … особенно когда правила нужно оставить типовыми.
ЗЫ Не была бы нужна, не стало бы 1С переписывать весь код обработки для подобной поддержки 🙂
Описания нет.
Отладка вносит изменения в правила конвертации?
То есть потом его можно благополучно загрузить в КД.
Класная штука .. очень помагает в отладке типовых? особенно для УПП? с учетом того что последние на версию 1.2.6 🙂
(27) Описание в комментариях ранее. Т.к. особо интерес никто не проявлял заморачиваться со справкой не стал.
Отладка в правила изменения не вносит, т.к. просто (после загрузки правил) создается внешняя обработка с подмененным модулем и включенным кодом обработчиков, выполнение передается в неё и подменяются вызовы для Выполнить обработчиков. В последней версии обработки 1С сделала подобное, но модуль обработки нужно заменять самому. Т.о. правила не отличаются от типовых и если не нужна отладка можно не использовать эту обработку.
Последний вопрос (намек?) не понял …
Реклама этой обработкиhttp://enterprise-integrator.blogspot.com/2008/12/blog-post.html
как загрузить обработку в редакции 10.2?
Есть более свежий вариант для последней версии КД 2.1.2.1 ?
(31+) Обновил выгрузку для КД 2.1.2.1
[+] изменения в форме делаются только программно, что удобно при обновлении основной конфигурации
[+] если в имени каталога для GComp есть пробелы, такой каталог запрещено использовать, о чем явно сообщается пользователю
[+] ко всем методам добавлен префикс GComp для удобства сопровождения
[+] все изменения четко обозначены спец.комментами для удобства сопровождения
[*] небольшой рефакторинг
Смотрите приложенный файл.
(31) С конвертацией из 7.7. уже давно не возился, поэтому не обновлял сборку через GCOMP. Т.ч. спасибо за проделанный труд.
(32) Файл битый скачивается.
(33) Сделал тоже самое сам, может вывалить?
(34) Файл был нормальный. Заново выложил его в этот же пост (32)
Спасибо,
Крутая вещь. Не вполне еще разобрался, конечно, но буду пытаться.
Завтра тестировать буду, но может сейчас ответите:
тут
Галка «Не создавать новый объект в приемнике, если он НЕ найден» при загрузке в 7.7 будет работать?
Обсуждаю данный вопрос