<?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='\
Очень помогает в ситуациях, которые по-началу не поддаются объяснению )
Молодец
К СКД ещё только приступил, поэтому не могу вполне оценить нужность этого механизма, но нутром чую, что он очень и очень пригодится. Попробую его понять и ипользовать. Спасибо!
В дерево отчетов попадают используемые наборы данных типа Запрос
Объединения содержат вложенные наборы данных
Наборы данных типа Объект представляются как простой запрос описания таблицы (перечислены поля)
Также платформа добавляет системные наборы данных (для построения иерархии и т.п.)
Далее идет отдельная ветка «Схема», в которой находится исходная схема КД
В самой консоли появилась дополнительная фишка — отладка запросов с передачей параметров типа «Таблица значений». Есть, конечно, ряд ограничений (на типизацию колонок), но в целом может пригодиться.
(3) Boroda, идея обработки пришла в голову при просмотре курсаhttp://www.spec8.ru/kurs-po-skd-besplatno
Если только начал разбор СКД, то рекомендую начать с этого материала.
Хорошая идея и хорошая реализация. Молодец.
(6) Спасибо и за обработку, и за ссылку на курс по СКД.
то что нужно
отлично, будем пробовать 🙂
Спасибо. Давно искала что-то подобное 🙂
Пытаюсь добавить параметры из запроса, выдает ошибку {Форма.Форма.Форма(1560)}: Ошибка при вызове метода контекста (НайтиПараметры): {(56, 1)}: Синтаксическая ошибка
на форме «Параметры» есть кнопка «Список» она в общем-то и не нужна, ведь когда выбираем значение параметра, то можем там указать, что это список значений и заполнить его. А вот если бы там была кнопка «Таблица значений» и она бы добавляла в параметр значение «Таблица значений» было бы классно.
(12) mlv84, Синтаксическая ошибка в вашем запросе. Напишите корректный запрос — получите параметры (НайтиПараметры встроенный метод объекта Запрос)
(13) mlv84, Таблицу значений я добавил для отладочных целей. Самостоятельный ее ввод мне, например, не очень нужен (даже ее редактирование). Это создаст кучу проблем (интерфейс, юзабилити, типизация колонок и т.д.) Но если вам это необходимо и думаете что это будет интересно сообществу — дерзайте! Выкладывайте. или напишите tezin, он может добавить этот функционал в следующих версиях.
Это да, прошу прощения. Запрос просто был большой. Кусочек потерялся при копировании. А таблицу значений придумала как обойти. Спасибо.
(16) mlv84, Поделись, плиз, как придумала
ничего сверх сложного. В моём случае в таблице значений была только одна строка. Я просто посмотрела в отладчике какие там значения. А потом в запросе их явно указала.
У меня было так:
«ВЫБРАТЬ
| ТаблицаПериодов.ДатаНачала КАК ДатаНачала,
| ТаблицаПериодов.ДатаОкончания КАК ДатаОкончания,
| ТаблицаПериодов.ГруппаНачислений
|ПОМЕСТИТЬ ИсходныеДанные
|ИЗ
| &ТаблицаПериодов КАК ТаблицаПериодов
………………..
а сделала так:
«ВЫБРАТЬ
| ДАТАВРЕМЯ(2011, 04, 01, 0,0,0) КАК ДатаНачала,
| ДАТАВРЕМЯ(2011, 04, 30, 23,59,59) КАК ДатаОкончания,
| «%ДопНачисление%» как ГруппаНасилений //У меня здесь строковое значение передавалось
КАК ТаблицаПериодов
(18) mlv84, Да, я тоже так делаю:
Выбрать &Контрагент1 Контрагент, 15000 Сумма Поместить ТЗ
Объединить все Выбрать &Контрагент2, 20000
Объединить все Выбрать &Контрагент3, NULL
и т.д.
Описанные функции (отладки запросов из компоновки) реализованы также в подсистеме «Инструменты разработчика» (функция Отладить, консоль компоновки данных)http://infostart.ru/public/15126/ . Там же там вы найдете много исследовательских инструментов в консоли компоновки данных, которые позволяет вам лучше понять, как устроен макет компоновки и расшифровка.
(20) tormozit, да, ваша подсистема выше всех похвал
UPD 29.02.2012
Обновление оригинальной консоли до последней версии + возможность редактирования параметра с типом ТаблицаЗначений (интерфейс не дружественный, юзабилити на нуле, но если сильно понадобится, то редактируется).
Очень помогает как раз разбираюсь с СКД
Функционал отличный. Интерфейс хотелось бы по компактнее.
{Форма.ФормаОтладкаСКД.Форма(47)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
по причине: Ошибка компоновки данных
по причине: Ошибка инициализации
по причине: Ошибка в выражении
по причине: Синтаксическая ошибка «Справочники.ТехнологическиеОперации.НайтиПоКоду»
Стандартная СКД принимает выражение Параметра в таком виде. Если элемент справочника не предопределенный, его можно найти позже — ПоКоду, ну или ПоНаименованию, что хуже в случае редактирования Наименования 😉
При вызове Отладка СКД и нажатии Сформировать обработка не понимает такого выражения для Параметра.
(25) alex_shkut, Любопытно, никогда не замечал. Баг платформы. Могу отписать на 1c@1c.ru, но не думаю, что скоро исправят.
Возможность отлаживать отчет на СКД из формы отчета — это очень удобно. Спасибо. Имя файла в пути поправьте.
При использовании набора данных «Объект»:
{Форма.Форма.Форма(791)}: Ошибка при вызове метода контекста (Выполнить): {(9, 2)}: Таблица не найдена «РезультатОсновногоЗапроса»
<<?>>РезультатОсновногоЗапроса КАК Таблица
РезультатОсновногоЗапроса — это имя объекта (внешнего набора данных).
(28) Рамзес, по внешнему набору данных нет смысла отлаживать запрос.
http://infostart.ru/public/120528/
рекомендую для построения отчета по ТЗ использовать
Вот сам и отвечаю на свой пост (25)
В Запроснике надо найти нечто похожее (не вскрывал его :))
А вот описание значения Истина в конце функции:
<ВозможностьИспользованияВнешнихФункций> (необязательный)
Тип: Булево. Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
Значение по умолчанию: Ложь
В моей текущей ситуации это была именно внешняя функция, но думаю, что это касается и прочих «СКД недвижковых» функций типа Справочники.НайтиПоКоду().
Мне помогло, думаю что в Запроснике этого будет достаточно, чтобы ошибка исчезла.
Нашел, где это: ФормаОтладкаСКД строка 47
имеем: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
надо: ПроцессорКД.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных,,истина);
(30) alex_shkut, мда, не тривиально… Ок, мотаем на ус!
Почему Вы не пишите вначале, что это для обычных форм, я получается зря потратила стартмани!
(32) Публикация 2011 года, на сриншотах обычное приложение…
Давайте я вам вышлю инструменты, которые использую сейчас в работе