<?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 В части поиска. Однако ж при замене использованная здесь ReplValue не всегда корректно перепроводит документы. И с подчиненными справочниками нужно отдельно разбираться.
Документы не перепроводятся. Замена происходит внутри таблиц доков, регистров и операций
Да, StrMatch оч хорошая компонента. Делал аналогичное:http://infostart.ru/projects/1915/
>>>Замена происходит внутри таблиц доков, регистров и операций
Не увидел этого ни разу..
Там просто кусок от репвал.еrt… где именно ?
И еще, окромя индексированной ТЗ, 1с++ больше нигде не используется ?
(3) Вот лапши не надо. Это зачем написано?
Если Док.Провести() = 1 Тогда
РегистрацияИзменения(Док.ТекущийДокумент(), «Перепроведение документов»);
КонецЕсли;
(5,6)
Да, Вы правы. Давно делал, забылось…
Был у меня еще вариант, где замены делались без проведения документов. Похоже потерялся… А этот действительно все перепроводит.
(7) Добавь вот это
http://infostart.ru/projects/3735/
и будет тебе счастье
(7,8) а почему вы думаете, что лучше делать замену без перепроведения?
Может в общем случае — да. Если у меня в модуле проведения создаются не только бух. проводки, но и «проводки» по регистру, заполнение периодических реквизитов справочников, да мало ли что…
Да, корректная замена в справочнике — не слишком проста 🙂
http://infostart.ru/projects/3868/ 🙂
Автоматом не прокатывает. Поэтому обработка заменяет что может и помечает «дубль» на удаление. А для анализа помеченных есть специальные обработки.
Ну, например, та же
(9)Согласен, бывает, что без перепроведения не обойтись. В основном, когда в алгоритме проведения задействован не сам элемент как целое, а некие реквизиты.
(9) Если док чисто бухпроводчный, там полная лафа. Подменил в операции что надо, операцию записал — и счастье 😉 А вот с регистрами без перепроведения я бы не рискнул
А если документ и делает проводки только по бухии, создавая одну операцию. Разве его перепроведение займет много времени?
(14)Простой пример: удаляю дубли должностей. Затрагиваются кадровые документы аж 70 года. А они вообще не проводятся, если есль у сотрудника более поздние кадровые доки.
14 к (13)
(14) Понял.
В общем, как всегда, подход должен быть индивидуальный. 😉
(13) >Разве его перепроведение займет много времени?
Если только в модуле проведения не стоит вопрос. А вот у меня на ДЗНВА был такой изврат, она еще спрашивала КАК КТО проводить: кладовщик, бухгалер и т.д.
(17) Вообще модальные окошки в модуле проведения — ЗЛО!
(18) Они по ходу вообще зло, а не только в модуле проведения. Баранов (белых людей, тупо наблюдающих за экраном) полным-полно.
(19) Но это САМОЕ зло их всех «злов»! )))
Работаю в конфе, где такого зла было немеряно. Мало того, что проверка на корректность заполнения нужных реквизитов проводилась в модуле проведения, так ещё и навставляли предупреждений БЕЗ ТАЙМЕРА, если что-то было заполнено не так. Пока кто-то читает это предупреждение (обычно это происходит очень долго или начинают консультироваться всем отделом) все остальные пользователи курят…
Огромное спасибо, говорю вам бухгалтер. Прошлый бух «засрал» все справочники, прошу прощения за высказывание, так что огромный +
ТиС 9.2
ТаблНайд.ВыбратьСтроки(«индКонтрагент1», 1);
{H:DOCUMENTS AND SETTINGSАДМИНИСТРАТОРРАБОЧИЙ СТОЛДУБЛИPOISKDUBLEI.ERT(528)}: Слишком много параметров передано при вызове функции/процедуры объекта
Извиняюсь. Сменил версию 1С++ все заработало. Ставлю +
Спасибо огромное за механизм!!Побольше таких