<?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='\
Напрасно боишься 😉 никто пинать ногами и не собирается… Я свой плюсик поставил )
Я боюсь и не плюсую.
(2) А почему свою консоль не сделаешь со встроенной контекстной подсказкой? Или я чего-то пропустил?…
Очень хочу контекстную подсказку — времени нет:((( Я и консоль то на коленке сваял, самый минимум, чтобы свою работу немного ускорить.
(3) В моей подсистеме есть справочник Алгоритмы. Обычно я открываю форму нового элемента этого справочника и имею ту же самую «консоль кода» только более продвинутую. Ведь обычно результат своего мучения в «консоли кода» в конце нужно сохранять, а у меня просто нужно записать элемент справочника и готово!
Ну, я и не претендую, как можно-с… Если бы знал, что существует такой шедевр … все равно бы написал так же.
Фишка в том, что Командное Окно — это возможность выполнять команды по одной: выполнил — посмотрел, что получилось — выполнил следующую. Не теряя при этом предыдущих выполненных команд, к которым можно всегда вернуться, просто поднявшись вверх по протоколу. И сохраняя, естественно, вычисленные значения. И больше ничего! Просто, как три копейки. Такой механизм есть во всех интерпретаторах. Странно, что в 1С — интерпретирующей по сути системе — нет такого штатного способа работы. Даже для чисто компилятивных языков, как С и Паскаль, давно уже есть возможность выполнять исходный код, не выходя из среды разработки.
Что касается Справочника алгоритмов, то это вещь, нет слов, полезная. Только, что сохранять из командного окна? Текст типа:
%зп = новый запрос(«ВЫБРАТЬ … &пп…»)
зп=установитьпараметр(«пп», …)
%тз = зп.выполнить().выгрузить()
смотр(тз)
или
%фф=Документы.МойДок.ПолучитьФорму()
фф.Открыть()
!фф.Открыта()
!фф.ЭлементыФормы.Поле.Реквизит
Его проще написать, чем искать в справочнике.
Опять же, справочник полезных алгоритмов, привязанный к конфигурации, — это что же, сколько у меня конфигураций — столько справочников? А если я чего изменил, мне что, по всем остальным экземплярам справочника изменения дублировать? Или я чего-то недопонял?
С полным уважением ко всем присутствующим, Дядюшка О.
(5) Хотелось бы именно «консоль», в виде внешней обработки… )
(6) смотрите EI там прекрасная «консоль кода» как вы ее называете…
По поводу пошагового режима выполнения я согласен (сам хотел реализовать подобный режим, «отладочный», но пока до конца не придумал всю систему).
По поводу внешней обработки я также согласен (в моем случае переход к подсистеме был неизбежен).
(8) EI — это круто! Оценил. Только (простите за занудство), хотелось бы, чтобы значения переменных, полученных при выполнении строк по одной, сохранялись бы… Это можно?
(10) я даже не представляю как это можно реализовать?
(11) Я тоже такое бы хотел :), но возникают проблемы с циклами/условиями/попытками. Либо после каждой строки нужно вызывать модальную форму со значениями переменных (код значительно разбухнет) 🙂
(12) хотя по идее такое есть .. только переменные нужно определить вначале …
А потом
Параметры.Эл=25*40-11;
А потом использовать эту переменную в последующих строках….
Сообщить(Параметры.Эл);
в Ei реализовано в «Конструкторе запросов» на закладке «Встроенный язык»
(13) Надо будет дома посмотреть (на пока работе файловая)…
Но я имел ввиду следующее. Допустим вызываем код через:
Выполнить(ПодготовитьКод(«А = 1; Б= 2;«)). Тогда код преобразуется в следующий:
А=1;
ОбработатьТекущуюСтрокуИПоказатьМодульнуюФормуСПеременными();
Б= 2;
ОбработатьТекущуюСтрокуИПоказатьМодульнуюФормуСПеременными();
где на модальной форме будут показаны только доступные сейчас переменные
(14) этот функционал работает и в файловой версии … Модальное окно там есть … где перечислены элементы входящие в структуру параметров
(15) Действительно работает (прошу прощения за свою ленивость 🙂 ), но выполняется сразу весь указанный (или выделенный) код (если я правильно понял). Но опять же проблема в циклах и т.п. Сейчас попробую набросать простейший пример построчного выполнения без анализа кода.
(11) Я это сделал так: либо Вы определяете переменную через Перем П1, П2, …, либо при первом присваивании указываете ее имя с % — %П1=10. Перед выполнением текст анализируется и структуре-реквизите формы Локалы заводится поле по каждую определенную таким образом переменную. Затем, к выполняемому тексту впереди добавляется текст П1=Локалы.П1, а в конце Локалы.П1 = П1 для определенных переменных, используемых в исполняемом фрагменте (см.текст обработки).
У меня получился такой вариант построчного выполнения. Параметры нужно вводить вручную и они не обновляются при шагах (надо цикл еще один написать), но принцип должен быть понятен 🙂
Для указанного примера кода параметры будут доступны постепенно:
А = Новый Структура(«Поле1, Поле1»);
Б = 2;
А.Поле1 = Б;
Подправил автообновление параметров по шагам и выход из выполнения при нажатии «Закрыть»
Нечто подобное и я пытаюсь придумать, но пока никак не могу преодолеть все преграды.
Нужно написать практически полноценный парсер текста, который кроме разбивки на командные блоки промаркирует конструкции ЕСЛИ ТОГДА, ПОКА ЦИКЛ, ДЛЯ КАЖДОГО ИЗ ЦИКЛ, ДЛЯ ПО ЦИКЛ, ПОПЫТКА ИСКЛЮЧЕНИЕ. Каждую из этих конструкций придется специфическим образом обрабатывать. Обращение к каждой локальной переменной, которые нужно будет еще отличить от свойств глобального контекста, нужно будет префиксовать типа Переменные.<ИмяПеременной>. Ну есть и еще ряд проблем…
А командные блоки зачем разбирать, если не секрет?
(20) И отличить » ПОПЫТКА -«+»123» от настоящего оператора ПОПЫТКА