<?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='\
Вот что, мнительный ты наш (это на коммент в другой ветке).
Будет новая беда — прямиком спеши сюда © Л.Филатов. В смысле, обращайся. 😎
Ты уже чуть штрихкоды не сгноил в безвестности. 😮
Я ожидал в конце все-таки иной развязки, и надеялся, что будет «правильный запрос» оптимизированный… =) Но хэппи энда не было. Горькая правда. За правду плюс.
изтвоего поста
Специалисты по мусоркам не шастуют, это пререгатива гиен
Развей сомнения, небоись быть услышанным и тебя услышат, только когда объясняешь , объясняй так чтобы понял не только он , но и его бабушка…
Не стестняйся простых и достуных слов.
Вся твоя статья (хорошая статья и мне понятная) ,
но ты этой статьей ХОТЕЛ —НЕ ПОЛЬЗОВАТЕЛЮ (посетителю нашего портала ЧТО-ТО новое донести,сдесь собираются СПЕЦИАЛИСТЫ разного уровня, кто пришел научить , а кто поучится) а ПОКАЗАТЬ что на такие «сопли» у настоящего СПЕЦИАЛИСТА нету времени и все это давно знают.
Но это твое мнение и я его уважаю.
(2)
+ душ Шарко 😉
(3)
Вот именно! Среди элементарщины трудно бывает найти что-то интересное. Ну да ладно! Твоёhttp://infostart.ru/public/61933 народ хвалит, надеюсь и эта статья кому-нибудь пригодится.
(5) И эта статья ОБЯЗАТЕЛЬНО кому-нибудь пригодится.
Ты передал частичку СВОИХ знаний…ты стал на дорогу УЧИТЕЛЯ.
И еще тебе совет — можно досканально знать предмет, правильно и научно описывать методы, но САМОЕ важное НАЙТИ аудиторию и СПРОС на эти ЗНАНИЯ — в ИТОГЕ — ГЛАВНОЕ чтобы тебя не только УСЛЫШАЛИ , но и ПОНЯЛИ (заинтересовались) (а в этих понятиях колоссальная разница)
Кстати занятная информация.
Не хватает только выводов.
Например: для увеличения производительности системы стоит показывать пользователю уже типизированные значения (Строка, Число, Дата), а ссылки делать не видимыми.
Правда я не уверен, что 1С (даже если скрыть в ТЗ колонку с ссылкой) не будет напрягать базу…
ЗЫ с 8-кой не работаю, мог написать глупость…
(7) Какую там глупость… Поле непаханное, истины в последней инстанции не найдешь… 😀
Это интересно, очень даже, но для «для простых 1Сников» это все назывется одним понятием — разименование полей и, не поверишь, но им достаточно. А что уж там в сикулах происходит, проверить им не удастся, серверов на всех не хватит. Большинство работают в файловой режиме, а с SQL запросами так и вообще единицы. Зато ексель — это второй инструмент для пользователей, которые являются заказчиками и что характерно (фуу, как прозаично) кормильцами этих самых «простых 1Сников». Этим и объясняется интерес и плюсики (в ветке про ексель), которыми так любят померяться джедаи Инфостарта.
А вот твоя фраза «Причём весьма неочевидным для простых 1Сников способом» любви и плюсов тебе от них не добавит. ИМХО.
Со всем уважением к твоим знаниям.
p.s. ну и плюс, конечно 🙂
(9) У каждого свой опыт. Мне с запросами приходится чаще работать чем с табличным редактором. Пользователи в нашей конторе тоже с Опен офисом редко работают. А Эксель стоит только у троих.
>> твоя фраза «Причём весьма неочевидным для простых 1Сников способом» любви и плюсов тебе от них не добавит
Фразу поправил. Никого не хотел обидеть. Я сам простой 1Сник. В темы SQL только начал вникать. Это отдельная область знаний, поэтому врядли сильно углублюсь в неё.
(9) Вот так, все по полочкам 🙂
У меня начинает складываться впечатление, что 1С8+SQL=засада. В отличие от трехсемерочного 1С7.7+SQL7, который Нуралиев с Гейтсом устаканивали…
12 появилось оттого что хотел поправить 10, а в это время Арчибальд добавил своё 11. Раньше выдавалась ошибка, а теперь добавляется новая запись.
(7) >> не уверен, что 1С (даже если скрыть в ТЗ колонку с ссылкой) не будет напрягать базу
Не проверял, но думаю что не будет. А рекомендации, да, такие как ты озвучил.
(12) Это я уже заметила, но если бы ты не успел отредактировать 12 коммент, было бы их три тогда?!
Так, что лучше не править все таки 😉
(13)
Если можно, то хочется 🙂 Вот на Кубани, помнится было нельзя. Приходилось аккуратнее выражаться.
(2) ghostishe, хотел тебя разочаровать и оптимизировать до одного запроса. Не вышло. Дописал статью на этот счёт.
(14) Насколько я помню, здесь тоже было нельзя, но очень просили.
(1)
Вот, нашёл ещё одну вещь. Обращаюсь 🙂http://infostart.ru/public/62041/
правда глючит на 25-ом релизе 7.7
(0), (7)
Эта инфа давно известна, еще со времен 77.
И в рекомендациях лучших собаководов об этом давно написано — например, не выводить в печатную форму объекты, а выводить только их представление/наименование, полученное из запросов.
(17) Конечно известно, но всегда хочется надеяться на лучшее.
Однако сдвиги к лучшему есть. Если таблица связана с данными, то запрос выбирает по 20 строк в толстом клиенте и по 23-42 в тонком клиенте. Всё меньше запросов.
Не знаю как у других, а у меня до недавнего времени были иллюзии относительно виртуального поля Представление. Всё надеялся что по нему должно правильно сортироваться и что использование этого поля даёт выигрыш в скорости. Нифига подобного! Теперь мне вообще непонятно зачем нужно поле Представление.
Офигеть!
Получается, что с sql скорость работы с БД не увеличивается ?
мдя…файловый вариант 1с тоже нормальное работает и без сбоев.
(19) >> Получается, что с sql скорость работы с БД не увеличивается ?
Во-первых да, не увеличивается. Во-вторых никто и не обещал увеличения скорости. О скорости я в этой статье не говорил вообще.
Опять-таки со времён 7.7 известно правило «Жигули быстро ездят, КамАЗ много везёт». То есть если пользователей мало, то файловая база ничуть не хуже клиент-серверной. А вот если пользователей много, то файловая может просто не сдвинуться с места. Жигули 10 тонн увезти не смогут. И хамер не сможет. А вот КамАЗ увезёт.
Но это всё лирика. Статья не о том. Статья о том что неплохо бы себе представлять во что превращаются запросы внутри 1С. И сколько этих запросов на самом деле идёт в базу. Это позволит избежать ошибок при проектировании алгоритма.
Кстати, в файловой базе запросы, скорей всего, преобразуются точно также как и в клиент-серверной. Только это происходит внутри 1С и посмотреть запросы к таблицам файловой базы не получается. Так что статья актуально и для файловой базы.
20+ А вот запрос, какой идёт к серверу из клиента при открытии группы в форме списка справочника:
0\000\000\000\000′::bytea)
SELECT
T1._Code,
T1._Description,
T1._Fld101RRef,
T1._Marked,
T1._IsMetadata,
CASE WHEN (T1._Folder = FALSE) THEN TRUE ELSE FALSE END,
T1._IDRRef,
T1._ParentIDRRef,
(T1._Folder)
FROM _Reference8 T1
WHERE (T1._ParentIDRRef = ‘\000\000\000\000\000\000\000\000\000\000\000\00
ORDER BY ((T1._Folder)), (T1._Description), (T1._IDRRef) LIMIT 42
Видно что 1С берёт первые 42 записи. Если не хватит, то будет второй запрос. Таким образом от элементов диалога, связанных с данными запросов генерится на порядок меньше чем от таблиц значений, куда помещены ссылки на объекты.
(20) «в файловой базе запросы, скорей всего, преобразуются точно также как и в клиент-серверной»
Архисомнительное предположение.
(22) Проверить трудно. Однако ещё труднее предположить что 1С будет изобретать ещё один стандарт обращения к базе и транслировать запрос в один вид для файловой базы и в другой вид для клиент-серверной.
(22) ИМХО ты не прав, более прав 23.
(24) А вспомните как в клюшках различались результаты запросов в СКЛ и ДБФ версиях особенно на ранних релизах и тогда станет понятно, что движек используется разный. И в восьмерке тоже.
(23) Привильно 1С не будет изобретать новый стандарт обращения к базе — возьмет чей-то готовый 😀
1ску на с++ слабали?
http://valera.asf.ru/cpp/book/c02.shtml
Тогда и обращение к табличкам, получившимся после парсинга 1Cv8.1CD, не есть обращение к базе, а стандартная для с++ работа с массивами:
а для работы с sql — пользуется тем, что MS дает в распоряжение клиента, да и то не всем
для работы с собственными, не всунутыми в мс-скл, табличками не достаточно сказать, ЧТО надо, но и программировать процесс получения, КАК получить… собственно, это отличие скульных диалектов от «взрослых» языков «программирования»
т.е. внутри 1сины должны быть парсинг скриптовых запросов и на этой основе — 1. формирование запросов к мс-скл, 2.- сишная работа с массивами. 1 -для клиент-сервера, 2 — для файловой версии
2(18): насколько я понял из описаний и рекомендаций, когда ты наряду со ссылкой выбираешь представление то если ты начинаешь работать с объектом, например, выводишь в отчет как ссылку, то происходит неявное преобразование ссылки в представление, что естественно влияет на скорость, а когда предсталение получаешь в запросе, тогда неявного преобразования не происходит, имхо, по данным от 1С
+(26) на то, что такая «параллельность» имеет место быть, косвенно указывает «параллельность» NULL ( и присутствие NULL в скриптовом языке) и Неопределено
Рекомендую не тратить время на статью, т.е. «-«, она практической пользы не несет. Кому надо, до этого и так доковыряются. А постгре вообще зло для любителей халявы.
(29) Хмм, не могу согласится. Польза от статьи конечно сомнительная, но вот насчет постгри все-таки не зря 1эсники реализовали его поддержку
А всё-таки чем хорош постгре ? Рискну задать вопрос автору.
Не в первый раз встречаю усмешку по поводу использования постгре или короткое «Да ну ..». Как бы предполагается , что спросивший спорол откровенную чушь.
>не зря 1эсники реализовали его поддержку
это называется маркетинг,
на что только не пойдут, чтобы серверный ключ продать 😎
главное, что потом любители сэкономить начинают любимые истории вроде
Подскажите, никто не встречался с подобной ошибкой при создании базы:
Ошибка СУБД:
ERROR: operator 16946 is not a member of optfamily 17076
CentOS, PosgreSQL 8.3.3-2.1C, 1Cv8.1.15
В версии 8.1.15 включили поддержку PosgreSQL 8.3.8 и 8.4.1, да так включили, что с 8.3.3 перестала 1с-ка работать!
У вас два выхода:
1. Понижать 1с до 8.1.14.
2. Ставить PosgreSQL 8.3.8-2.1C.
Мы поставили 8.3.8 и всё заработало!
задолбало отслеживать стабильные сочетания релизов
DB2 тоже иногда завязывается на особенности очередной версии платформы, но такого бардака в IBM не позволяют себе
>>Поставщик мог ссылаться не только на один справочник, а на несколько, то таких соединений было бы несколько
начал про одно, потом резко перескочил на другое
(29)
Будешь смеяться, но в этом я с тобой согласен. Однако народ считает иначе и меня почти переубедили. На написание этой статьи меня толкнула другая статья где я высказал мнение сходное с твоим.http://infostart.ru/public/61933/#comm комментарий 42.
А тут не соглашусь. Уже год работаю с базой на Постгре и горя не знаю. Этот вопрос мы с тобой уже обсуждали, правда не прилюдно. Админ у нас хороший.
(32)
Для продажи ключей достаточно было бы поддержки DB2. Тут, ИМХО, другое.
ХЗ какие у них трудности. Я в этом не копенгаген. Наверное труднопреодолимые. Да и не так трудно провести одновременное обновление и 1С и Postgre. Просто об этом надо знать.
Мы, например, обновляться будем сразу на 8.2.
Слава, я понимаю твоё возмущение действиями 1С, но не понимаю твоего отношения к слонам. Ведь работают. И хорошо работают.
(33) Перескочил поскольку комментарии к запросу излишни. Там всё ясно. Хотелось ещё сказать что в MSSQL из-за этих соединений можно наткнуться на ограничение в 256 таблиц в запросе. Вообще статья сумбурная, но может кто-то что-то из неё и вынесет. Может прояснится понимание кишок 1С. Мне самуму что-то стало понятнее пока писал.
(34)
имей своЁ мненение и не будь, чем щи хлебают…прочитай ешё раз пост (3) медленно и не спеша.
ты уже в шестой раз пишешь — вон там написали и народу нравиться, а я написал……ал …хнык..хнык …пойду маме жаловаться
заинтересуй,заинтересовал — поддержи интерес
(35) Tatitutu, не злись, не стоит. Много написал, потом удалил. «Давайте жить дружно» (с)
зря спорите, для таких статей support предусмотрел блог, а статья полезная… даже спорить не интересно
(34)
я не против постгреса, а против выбора тех, кто вообще не одной субд не знает, и пытается с установкой решить еще и вопрос обучения нахаляву замучив вопросами «я новичок, помогите».
учиться не хотят
сам по себе постгре вещь мощная, но только в умелых руках
по поводу 1С, у меня нет возмущений
на партнерском форуме это инструмент «управления», как еще их направлять на потребности
просто важно понимать, где компромис между количеством, критичностью ошибок с одной стороны и желанием срубить денег с другой
применительно связки 1С + постгре — иллюзия «на халяву» не настраивает на серьезный лад, это «ловушка» для новичков
(29)
а ваш колега Ляшко Юрий, похоже так не считает 😉
(37) >> для таких статей support предусмотрел блог,
Вот об этом я как-то не подумал. Спасибо за подсказку. Попробую начать пользовать блог.
(38)
gilv, из твоих высказываний можно понять что ты плохо относищься к постгресу. Халявщикам ничего не поможет. Помнишь как мы с тобой ходили к клиенту, который требовал производительности на сервере с 4 Гигами памяти и базой в 160 Гиг? Им не помог МС SQL потому что жмотились на железе.
Прошу тебя точнее указывать адресатов своего раздражения. Не слоны, а жмоты и лентяи. Причём жмоты не только на ПО, но и на железо и на обучение. PosgreSQL тут не виноват.
А я пользую слонов и примеры запросов беру из них. Почему слонов, а не что-то другое? А потому что слоны лицензионно чисты и никто мне ничего не предъявит.
(39) Халявщикам зло всё. Жадины считают что весь мир против них и весь мир им должен.
(40) признаю, постгре меня разочаровал, но раздражают имено любители халявы
буду выражаться точнее, упрек принимаю
Интересно, а автор статьи давно пишет запросы в 1С? Читал ли он рекомендации по оптимизации производительности запросов опубликованных на ИТС? Знает ли автор о функции Представление() для ссылочных полей в запросах?
Жирный минус за то что новичков в заблуждение вводит. Парсер запросов хороший инструмент, но и запросы 1С надо бы знать.
(42) Читал ли ты что я написал? Я говорю не о функции, а о виртуальном поле! Нафига оно надо?
Прежде чем тыкать других в невнимательность сам внимательно прочитай.
Новичкам эта статья поможет слабо. Им бы с штатной документацией разобраться. А вот опытным людям неясно зачем нужно виртуальное поле Представление. Зачем, Недостижимый? Зачем при упорядочивании по этому полю происходит упорядочивание по внутренним идентификаторам?
(43) Поле «Представление» это виртуальное поле. Формируемое уже на сервере приложения ПОСЛЕ того как скуль вернет запрос. По этому и обращения к скулю идут, и по этому же сортировать по нему нельзя. Упорядочивание просто не происходит, а не «происходит упорядочивание по внутренним идентификаторам».
(44) GROOVY, обрати внимание на вот эти два запроса, приведённые в статье.
При этом в Postgre отправится такой запрос
Показать
Из 1С в СУБД пошёл запрос с требованием упорядочить по внутреннему идентификатору. Я не знаю внутренностей сервера приложений 1С, может он их как-то ещё сортирует. Однако я так не думаю.
GROOVY, виртуальное поле Представление возвращается строкой. В зависимости от настроек на закладке Данные в конфигураторе оно будет содержать или код или наименование, а для документов и бизнес процессов собираться из вид+номер+дата.
Единственное практическое его применение я вижу для документов и бизнес процессов. В остальных случаях удобнее и быстрее обращаться сразу к коду или наименованию так мы избавим и сервер приложений от ненужной работы и СУБД от лишних выборок и сортировок.
(45)
«Единственное практическое его применение я вижу для документов и бизнес процессов. В остальных случаях удобнее и быстрее обращаться сразу к коду или наименованию»
Это если мы знаем какое представление указано в системе для справочника, а если нет то тут как раз и поможет это виртуальное поле.
(46) Однако вернёмся к нашим баранам. То есть к статье. Я всё пытался получить и ссылку и представление таким образом чтобы табличное поле в консоли запросов не посылало кучу запросов на получение представления ссылки. Возможно ли это? У меня вот не получилось.
Поправлено. Раньше вместо «консоли запросов» было «консоли отчётов»
не знал, не знал