<?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='\
Универсальная обработка очищает периодические реквизиты справочников от лишних значений. Имеет три режима работы.
1. «Свертка значений периодических реквизитов справочников на заданную дату»
2. «Удаление дублей значений периодических реквизитов справочников»;
3. «Удаление пустых значений периодических реквизитов справочников»;
Перейти к публикации
У Вас нет доступа для формирования этого отчет
Пара некритичных замечаний:
оНДС»). Обработка на них вылетает.
— обработка обозначается как универсальная, а пару вызываемых в обработке функций гл. модуля нашел только в ТиС;
— в ТиС есть как минимум 4 периодических реквизита с длиной идентификатора больше 50 символов (например, «УчитыватьОтрицательныеСуммовыеРазницыПриОпределенииВычетовП
ЗачОт метить документ на удаление…!
Гы-гы…
(3) Насчет Гы-гы не понял.
Это понятно, что метить документы на удаление — это не всегда безболезненная процедура. Но …
Существует много ситуаций когда это необходимо.
Например изменение цен номенклатуры из документов (что-то вроде Документ.Переоценка). А хранить всю историю за 100 лет нет необходимости.
Кроме этого на это есть отдельный флажок, который кстати по умолчанию «0».
Так что, будь любезен, поясни «Гы-гы».
картинки — где?
(4)
>>>»Это понятно, что метить документы на удаление — это не всегда безболезненная процедура.»
В типовых конфах это ВСЕГДА болезненная процедура. Назови хоть один документ в Типовой конфе, который можно «безболезненно» удалить ?
Доверь сей инструмент кому-нить — привет котёнку.
err
ОЧИСТКАЗНАЧЕНИЙПЕРИОДИЧЕСКИХРЕКВИЗИТОВСПРАВОЧНИКОВ.ERT(292)}: РассчитыватьВНалоговомУчетеСреднююСтоимостьОтгруже не является константой или периодическим параметром!
(0) Взял да и затер в картинке путь к БД 🙁
А у меня аж пятки чесались пойти по этому пути 😉
Обновил обработку.
to 2 и 7 длину наименований справочников и реквизитов увеличил
to 5 картинку вставил.
to 6 Ты абсолютно прав. Но даже для типовой (ну почти типовой), обработка использовалась при нетиповой свертке.
И отсутсвие этого функционала возможно кого нибудь разочарует. Я со своей стороны предпринял все меры по «спасению котенка»
1. большое красное сообщение.
2. отключение по умолчанию.
3. пометка, а не полное удаление
4. отчет о проделанной работе
5. проверка названия прав. (хотя уже закомментировал, раз не понравилось в 1)
to 2 к сожалению под рукой сейчас нет отдельно бухии или зп. Не подскажешь ли о «пару вызываемых в обработке функций гл. модуля нашел только в ТиС».
(9)
глПроверкаДаты
глПолучитьПолномочие
to 10 Спасибо. Убрал. Обновил.
(10). Подтверждаю. В бухии даже близко не понятия «полномочия пользователя», оттвественно и функции. Это только в комплексухе и в её кастрате ТИС.
А насчет глПроверкаДаты в бухии и речи быть не может, ибо там нет понятия точка актуальности.
Оперучет там ёк, однако 😉
Принимаются еще предложения. Отчет должен быть полностью универсальным и делать все, что возможно для свертывания (уменьшения, упаковки) периодических реквизитов. Если Вы заметили, что это не так, сообщайте.
подобное решение
14 Посмотрел, да есть там «оптимизация». Ну не всем же быть Гагариными 🙂
Да есть и еще подобные решения, например
Только свои тапочки и мягче и удобнее и предсказуемее 🙂 Может они и другим пригодятся. Ведь тапочки только чуть-чуть поюзанные.:)
Очень помогла опция «Удаление пустых значений»
После переноса сотрудников Tranrefом из одного Камина1.2 в другой
эта бяка (пустые значения созданные документами переносить которые не было необходимости) вручную не удалчлась и шибко мешала жить и работать.
В похожих решениях такой опции не увидел, потому спасибо.
Сберёг кучу времени.
Плюс, за то что не пришлось делать утомительную работу в два часа ночи.
Очень пригодилась, спасибо!
Спасибо за обработку! Пригодилась.. Только пришлось немного допилить — добавить работу с транзакциями…. иначе даже при работе только по одному справочнику после прохождения 120 000 элементов начинала совсем умирать…
спасибо
Допил конечно нужен был,но в целом норм
не всегда правильно работает, так и не понил в каких случаях,
На маленьких базах сработала, на рабочей (>2гб периодических реквизитов) зависла на 2 минуте(На всякий случай подождал ночь, но чуда не произошло). Печально.
———
И даже нашел почему, список удаляемых документов хранить в списке значений это ппц.
Спасибо за обработку! Единственное предложение — сделать возможность отключения печатной формы отчета. Т.к. для очень больших справочников получается стандартный баг с нехваткой памяти процессу 1с: ошибка Недостаточно памяти. Связано видимо с тем что до вывода на экран печатной формы — все телодвижения с таблицой накапливаются в оперативе.
p.s. заткнулся на справочнике нормативов в старой ПУБ 7.7 в которой справочник номенклатуры под 800000 элементов.
23, 24 спасибо за интерес проявленный к обработке. Коли уж Вы программисты, то должны понять, что совершенству нет предела и дорабатывать любую обработку можно бесконечно. Если бы обработка содержала ошибки, я бы исправил. Неловко как то предлагать совсем сырой продукт. Но уж если разговор о мелких недочетах, то позвольте мне оставить как есть. Разработка датирована 2008 годом и уже давно притерпела изменения на моих базах. Надеюсь Вы согласитесь, что специфика у всех разная. Мои БД более 30Г, но периодических реквизитов не так много.
ЗЫ Рассматриваю этот сайт, как сайт разработчиков для разработчиков. Т.е. всегда проще посмотреть, как сделал кто-то и взять идею или просто доработать под себя. И польза выложенного на этом сайте материала именно в этом. Еще раз спасибо за интерес. Может быть вернусь опять на этот сайт и выложу еще чего-нибудь.
vovan519 не принимайте близко к сердцу, отписался т.к. сам натыкался на этот трабл при обработке большого количества данных и при первом запуске этой обработки. Долго искал что отъедает память пока не понял про формирование таблицы в оперативке. На самом деле в Вашей обработке наверное это не совсем и актуально, т.к. попробовал погонять её на действующей базе — результат к сожалению не устраивает по скорости.. обрезка затянется на несколько дней. Так что буду рыть в сторону аналога на прямых запросах, обламывает, то что сабж при всех своих размерах справочников до сих пор на dbf в силу разных обстоятельств и рабочих примеров работы с 1sconst на 1cpp пока не нашел.
потестил. мне подошло. спасибо.
А мне нет. Слишком долго
Спасибо, обработка очень помогла (при переносе КД добавила пустые записи в пер. реквизиты)