<?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='\
Может кому пригодится. Конечно такая обработка — это изобретение велосипеда, причем довольно старинного, наверное таких разработок много (жаль не могу посмотреть, сравнить, оценить, нет денег ;)). Понятно и создание этой обработки дело не благодарное, конфигурация постоянно меняется, но наверное в ней пока достаточно информации для работы. В конце концов если нужно, можно добавлять в списки новые свойства. Сильно не критикуйте, первый блин … 😉
Хотя нет, лучше наоборот больше критиковать и указывать на ошибки (тихо сам с собою, я веду беседу )))
Спасибо за обработку. Она была бы имела дополнительную ценность, если бы можно было открывать список объектов из дерева. Я давно такую искал, но не нашел ничего подходящего.
Интересная идея по переключению между идентификаторами и наименованиями в дереве
Критика:
1) при позиционировании на ветке Реквизиты, Измерения выскакивает ошибка
2) код задублирован в обычной и управляемой форме. Одинаковые функции лучше было бы вынести в модуль обработки, а из форм вызывать (по принципу MVC). Это бы упростило модификацию
(3) yurii_host,
список открывается из раздела дополнительно — Открыть список, хотя можно сделать и из дерева метаданных, сделаю, не вопрос
1). — Ошибку посмотрю,
2) — Я как раз и хотел это сделать, но не смог сделать (мало опыта) из управляемой формы не вижу процедуры и функции в модуле объекта
(3) yurii_host,
Ошибку исправил
(3) yurii_host,
добавил возможность открывать список объектов из дерева, только нужно поставить галочку «Открывать список»
по причине:
Ошибка преобразования данных XDTO:
Значение: BeginsWith Тип: {
по причине:
Ошибка отображения типов:
Отображение лексического значения ‘BeginsWith’ в значение типа ‘ВидСравненияКомпоновкиДанных’
Убило предприятие
Открыл в конфигураторе — убило и конфигуратор
(7) kiruha,
Проверял на 1С:Предприятие 8.3 (8.3.6.2076) УПП 1.3 (1.3.63.3) ошибок вроде не было
У меня 8.2 (8.2.19.102) — не годится ?
(9) kiruha,
да по идее без разницы, а какая конфигурация?
Бух 2.0. От этого тоже зависит ?
Может отдельно скомпоновать для 8.2 и 8.3 ?
Большинство на 8.2 еще
(7) kiruha,
Вопрос, а что значит :»Открыл в конфигураторе — убило и конфигуратор», может это пакет такой пакет такой?
Это значит, что при открытии в предприятии/конфигураторе — предприятие/конфигуратор падает с критической ошибкой описанной выше.
Вам нужно просто открыть последнюю версию 8.2 платформы и в любом режиме убедиться что она в нем работает ваша обработка.
Если нет — скопировать формы модули и выложить рядом
(13) kiruha,
попробую, если получится
(13) kiruha,
попробовать не получилось, наверное не специалист менять платформы. Спорит не буду, но как бы не представляю себе, если вы открываете в конфигураторе мою обработку и падает конфигуратор, она ничего не пишет туда а только читает оттуда ничего не преобразовывая, да и то в режиме предприятия, хотя все может быть писал по синтаксис — помощнику.
Я открыл в 8.2 и 8.3 по конфигуратору.
В 8.3 открыл Вашу обработку .
В 8.2 создал новую. Копи паст обычной формы из 8.3 обработки в 8.2 обработку — ОК.
Сохранил.
Заработало. Спасибо ! Симпатично
Использую аналоги для оперативного просмотра структуры хранения.
В других обработках не все объекты и не такой красивый дизайн — рекомендую )
(3) yurii_host, это смотрелhttp://infostart.ru/public/15324/ ?
(17) tormozit, в этой публикации только обычные формы, разве нет?
Дизайн у данной работы поинтереснее, согласен с kiruha
(16) kiruha,
Пожалуйста, рад что все получилось.
(19) Да, но лучше Вам проделать такую же операцию и выложить версию для 8.2 ))
Так симпатично, что даже жаль, что ненужно.
Полезный инструмент. Вот только не нашёл как посмотреть список предопределенных элементов справочников, планов счетов и т.д.
возможность сохранения структуры еще бы
(22) Dmitryiv,
В старых версиях платформы пока не нашел как показать предопределенные значения (в новой: ПолучитьИменаПредопределенных())
(23) izidakg,
Если «возможность сохранения структуры еще бы», это отчет, то сделал
(7) kiruha,
«Убило предприятие Открыл в конфигураторе — убило и конфигуратор» нашел наверно чем убивает, исправил
(3) yurii_host,
«2) код задублирован в обычной и управляемой форме. Одинаковые функции лучше было бы вынести в модуль обработки, а из форм вызывать (по принципу MVC). Это бы упростило модификацию»
Сделал, правда по принципу MVC или нет, я пока не понимаю.
Кинул обработку соседним отделу —
1. не видно как реквизит называется в структуре хранения. Можно перейти по ссылке структура хранения — но там отсутствует табличное представление полей
надо тыкать по 30 реквизитам пока не найдешь нужный
Было бы удобно если бы на странице описания реквизита был бы отдельный раздел с именем поля в структуре хранения
2.У реквизита есть тип и гиперссылка в обработке на этот тип (например справочник Контрагенты). Вместо ожидаемого перехода по гиперссылке в дерево — попадаешь в малопонятное окно без какого либо функционала
(28) kiruha,
1. По первому пункту как понял, сделал в разделе «Структура», кроме вывода на странице описания реквизита поля с именем поля в структуре хранения, сделаю позже как будет время
2. по второму пункту — переход сделан для того что если тип реквизита — составной его полный состав показать в отдельном окне, т. к. в строку может не поместиться
(26) У платформы 1с8 до сих пор не устранена ошибка: При редактировании объектов Конфигуратором под 8.3 они иногда перестают работать под 8.2.
Спросите у Интернета «Ошибка формата потока 8.2» — много ругательств прочитаете…
Спасибо !
теперь ошибок нет и видно имена в структуре хранения
(31) kiruha,
Да всегда пожалуйста
(30) V.Nikonov,
У меня тоже была такая ошибка из-за того что я в управляемой форме в настройках условного оформления выбрал оформление, которое отсутствовала в предыдущих платформах, после изменения оформления ошибка ушла.
(28)
1. не видно как реквизит называется в структуре хранения. Можно перейти по ссылке структура хранения — но там отсутствует табличное представление полей
надо тыкать по 30 реквизитам пока не найдешь нужный
Было бы удобно если бы на странице описания реквизита был бы отдельный раздел с именем поля в структуре хранения
Хоть поздно, но сделал.
Спасибо !
На мой взгляд — самый красивый отчет по структуре метаданных — рекомендую
Скачал. Код — это жесть. Мне кажется, надо предупреждать, что обфускация.
Т.е. вот получаю ошибку:
{ВнешняяОбработка.Метаданные.МодульОбъекта(44)}: Значение не является значением объектного типа (Скопировать)
Если Н=»Под» Тогда Д=M[12].Скопировать(); С0=Д.Строки[0]; ОтобратьПодсистемы(С0,З,1); М=?(Ф=0,С0.Строки.Количество(),С0);
И как её исправить? Верю, что много времени на эту обработку убито, но блин.