<?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) никаких специальных блокировок не накладывается, но цикл изменений происходит в одной транзакции.
Идея отличнейшая!
Для полного счастья не хватает конструкции
(3) Запрос ВСТАВИТЬ (INSERT) ожидается, следите за обновлениями
<Объект не найден>
1С-никам не просто так запретили запросы на запись)
(6) это невозможно по определению — объекты и регистры создаются исключительно только через конфигуратор..
(10)
не, ну… выгрузить конфу в файлы, поменять/добавить/удалить, загрузить обратно и обновить.
Идея — огонь! Сам ночами просыпался с мыслью сделать подобное!
(11) потом выгнать всех пользователей, применить изменения, загнать всех обратно.. и обязательно не забыть на каком месте остановились, чтоб с этого же места продолжить.
(13) ну да. для этого ещё пара другая обработок. 🙂
конфигурация КА 1.1 — не запустилось
жааааль
(16) уж не обычные ли это формы?
пишу самый простой запрос
изменить Документ.ЗаказПоставщику.Товары
УСТАНОВИТЬ Проект = &ПроектН
где Проект = &Проект
вылетает по ошибке
(19) текст ошибки в студию!
формы обычные запускаю из конфигуратора управляемое приложение
простой запрос
типа
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
ЗаказПоставщикуТовары.Номенклатура,
ЗаказПоставщикуТовары.Количество,
ЗаказПоставщикуТовары.Заявка,
ЗаказПоставщикуТовары.Проект
ИЗ
Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
ГДЕ
ЗаказПоставщикуТовары.Проект = &Проект
отрабатывает нормально
1с ЛОЖИТСЯ
1CV8.exe — обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.
(23) это что-то совсем страшное. а какая платформа?
причем простой запрос
на изменение реквизитов документа работает
1С:Предприятие 8.2 (8.2.19.90)
у меня как раз задачка достаточно простая есть под данную консоль
(25) единственное что приходит в голову — начать построчную отладку и понять от какой конкретно инструкции платформа крашится.
Функция СтрЗаканчиваетсяНа не нашел
(29) это функции 8.3, в 8.2 их нет. недавно выкладывали их реализацию для подобных случаев.
неправильно сформулировал извиняюсь — я понял что эти функции для 8.3
а ссылку можете указать? подправлю — может взлетит
Функция ВыполнитьПакет(РасширенныйЗапрос) Экспорт
ИнициализироватьПараметрыРасширенногоЗапроса(РасширенныйЗапрос, Ложь);
Запрос = ИнициализироватьЗапросПолученияДанных(РасширенныйЗапрос);
МассивРезультатов = Запрос.ВыполнитьПакет();
ВыполнитьИзменениеДанных(РасширенныйЗапрос, МассивРезультатов);
Возврат МассивРезультатов;
КонецФункции
На ВыполнитьИзменениеДанных выносит
посмотрел отладчиком
ОбъектРедактирования.Записать();
на этом ее и выносит
функции СтрНайти,стрРазделить,СтрСоединить,СтрЗаканчиваетсяНа,СтрНачинаетсяС
проверил в ка 2.4 — рабочие
не вылетает
(34)
ошибка на строке
ОбъектРедактирования.Записать();
говорит о том, что проблема с записью самого объекта, при чем характер ошибки намекает на ее платформенную природу. попробуйде провалиться в обработчики/подписки перед/при записи.
в общем похоже у меня база тестовая с ошибками была
на другой заработало
Я так понимаю эта красота скорости не добавляет, и сделана сугубо чтобы «скоротать вечерок» и по несколько минут на каждое МАССОВОЕ изменение реквизитов, которое по какой-то причине групповой обработкой править не получается. Честно говоря вообще тяжеловато понять суть тогда зачем в принципе такая вещь, если большую часть всего этого можно было сделать стандартными обработками чем извращаться создавая запрос через конструктор, потом менять текст вручную и программно парсить его обратно… Команду инсерт на 1 объект в итоге писать+запускать дольше чем просто открыть в режиме в 1С и создать вручную, нет?
Лучше бы изменяемую схему СКД + групповое изменение, насколько помню уже давно есть такие консоли.
(37) вы знаете, у меня всегда подобные комментарии вызывают ассоциации типа «зачем нужен белый хлеб, если есть черный?», «зачем придумывать ауди, когда уже есть мерседес?».
это альтернативный инструмент. смотришь, сравниваешь, выбираешь какой подходит в твоей ситуации. в моем понимании, основными (но не факт что единственными) плюсами запроса на изменение является его предельная простота в сравнении с «наколеночной» обработкой и крайне широкие возможности в сравнении с обработкой группового изменения данных.
соответственно, аналитики и консультанты теперь имеют альтернативный инструмент массового изменения данных. да и программисту по-короче набросать две строчки запроса, чем писать «запрос = новый запрос();…».
(37) да, и что касается
так извращаться действительно нет смысла. если вы не можете набросать запрос без конструктора — переходить к запросам на изменение рановато..
(38) Я свои ассоциации называть не буду. Но про хлеб — «на вкус и цвет», про Ауди — хотя бы разница в цене тут цена производительности таже, цена программирования очень спорна. Примеры, мне кажется, не подходят.
Я и спрашиваю преимущества в чем? В том, что есть люди которым удобнее писать запрос вручную наизусть зная структуру имен полей? Чем перетащить из таблички? И по вашему ответу тоже не вижу ни одного реального примера. Представите хоть один реальный, значимый?
Чем кстати этот инструмент шире по сравнению с хорошей групповой обработкой?
«да и программисту по-короче набросать две строчки запроса», я тоже могу придираться к словам, а не вычленять их смысл. Запрос написанный в 2 стандартных коротких строчки запроса не задача для написания такого инструмента и даже изучения такого инструмента не стоит, имхо.
(10) Тогда TRUNCATE
(0) Зачем это может пригодится? Можете привести жизненный пример?
Прикольно, мне кажется полезным может оказаться Веберам, которые с 1с приходится сталкиваться немного типа Номенклатуры или Контрагентов, а они знают чистый SQL
(42) Ого, только сегодня заметил эту разработку! Читаю это:
«Поддерживается редактирование всех первичных таблиц:
таблицы ссылочных типов (документов, справочников…)
табличные части ссылочных типов
регистры подчиненные и не подчиненные регистратору»
и вспоминаю, что иногда возникают задачи больших корректировок регистров, приходится делать обработку, которая формирует набор(ы) записей регистров, на основании существующей в ИБ информации, и привязывает их к «ручной операции/корректировке». Попробую делать это в запросе, не открывая конфигуратора, вдруг будет удобнее. Получается более универсальный инструмент чем типовая обработка изменения реквизитов — может менять ещё и регистры.
Руки оторвать за реализацию.
(45) ваша лучше?
Представьте сколько программистов с невысоким уровнем квалификации начнет использовать эту обработку.
Конечно идея хорошая, но к таким вещам необходимо ограничивать доступ.
Фирма 1С сколько ее не ругай сделала очень грамотный ход — она просто отказалась от реализации подобных возможностей из режима предприятия.
(47) здесь, кстати, не в первый раз упоминают о том, что вот есть какие-то «Программисты 1С», которые щас все это возьмут и как начнут все портить!!!
если серьезно, без шуток и ёрничания: в чем опасность? почему плохо, что такой инструмент будет у всех?
(47) и согласитесь, пока сюда не начнет постить комментарии Сергей Георгиевич — о мотивах фирмы 1С мы ничего не узнаем.
Вещь вполне интересная. Я буду в лагере тех, кто за такое и кто ждёт такого в будущих редакциях 1С: Предприятия уже во встроенном в платформу виде (но, конечно же, с уже оптимизацией проведение операций массовых изменений в данных — это очень был бы вотребовано на проектах с BIG DATA)! А кто говорит, что правильно, что 1С не добавила — обоснуйте в чём правильность-то, на мой взгляд они просто поленились.
(50) с оптимизацией будут большие проблемы: если запрос ИЗМЕНИТЬ транслировать напрямую в UPDATE — выпадет целая область функциональности слоя платформы (подписки, события объекта, регистрация на планах обмена…). Хотя, может быть, можно что-то придумать, типа множественного аргумента в подписке как в команде…
(51)Я согласен — оптимизировать сложно — это уже архитектурная задача для будущих редакций 1С Предприятие (скорее всего уже 9-го поколения, где, на мой взгляд, уже архитектурно должна быть заложена обработка не одиночных данных — а целых наборов (причём с предположением, что они могут быть очень большими) — во всех местах алгоритмов, в т.ч. в параллельном режиме). Это очень важный шаг на пути расширения облачных технологий и BIG DATA — это тренды начала XXI века.
А если помечать на удаление, например «Справочник.Договоры», то процедура «ПередЗаписью» будет отрабатываться ?
(53) будет
Зачем все хотят запросы на данные? что вы такого в таблицы пытаетесь записать.
(55) это позволяет удобнее манипулировать данными в некоторых ситуациях. Не в коде писать, а в пользовательской консоли, когда надо подправить данных на внедрении или типа того..
(57) Приведите пример такой правки. Вот что напрямую легче.
(58) ну заливали данные в новую базу, продолбали ИспользованиеХарактеристик у номенклатуры. Решение в консоли:
ИЗМЕНИТЬ Справочник.Номенклатура
УСТАНОВИТЬ ИспользованиеХарактеристик = ВидНоменклатуры.ИспользованиеХарактеристик
ГДЕ НЕ ИспользованиеХарактеристик = ВидНоменклатуры.ИспользованиеХарактеристик
процедурным языком будет существенно дольше с точки зрения разработки. запись, понятно, будет длиться одинаковое количество времени.