<?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='\
Реально данная обработка помогла, спасибо!
А тестирование и исправление разве не делает тоже самое?
Спасибо. Сам такую писал но где-то с UID был трабл. А ту все фунциклирен.
Добавил версию обработки «РеанимацияБитыхСсылокСУчетомВладельца»,
позволяет создаваемому объекту назначить владельца.
Автор:kirill buckov
а для семерки такое есть ?
У меня не получилось(. В регистре бухгалтерии(УПП) есть в регистраторе ьитая ссылка. Документ платежное поручение создается с данным UUID, но при записи ссылка остается битой, в записи регистра регистратор не становится ссылкой на вновь созданный документ… Пробую пересоздать, говорит, что есть Подскажите, в чем дело.
(6) Обработку запускаете с полными правами?
1С:Предприятие 8.1. Удалил несколько контрагентов. Теперь пытаюсь восстановить. Последовательность — сначала запись справочника о контрагенте, потом ДоговорВзаиморасчетов и ЮрЛицо с привязкой к Контрагенту. ДоговорВзаиморасчетов и ЮрЛицо действительно создаются с нужными ссылками и привязками. А вот ссылка на контрагента, скажем, в расходной накладной, остается битой. 🙁 Не пойму в чем дело. Пользоваться пытался обеими версиями, но версия с подчинением не дает создавать запись справочника без указания подчиненния. 🙁
>В результате все битые ссылки будут теперь ссылаться на новый объект.(т.е. будут теперь не битыми).
За одну битую ссылку две небитых дают! :))))))))))))))
Разобрался. Восстановил. Спасибо!
Может кто подскажет, в чем полезность данной обработки?
Под 8.1 можно переделать?
(12) Добавил версию под 8.1
Пишет длина GUID ссылки должна быть равна 32 знакам
(14) разобрался. надо вставлять номер после двоеточия. 🙂
В 8.1 пытался восстановить удаленную характеристику(в документах осталась сыылка на объект не найден) — СОЗДАЕТ НОВУЮ(с новым GUID), а ссылки так и остаются на объект не найден…??? в чем трабл?
Ситуация такая же как и у ost.a
Может кто объяснить в чем причина?
Спасибо огромное , уже пол ночи базу делаю) и тут такая вещь)
Спасибо, пригодилось!
Посмотрел в коде, система понятна… НО!
При записи создается новый GUID (тестировалась на 8.1 УПП).
Ссылка так и остается битой, просто создается новый элемент.
Короче.
http://www.poleznayainfo1c.narod.ru/
У меня возникла такая проблема:
Случайно создали дубляж физлица, и на оба элемента заводились документы, на один из низ платежи, другой участвовал в проводках других документов. И один умный бух рубанул непосредственно одно физ лицо, не спросив программиста, т.е. меня. получилось что получилась битая ссылка.
Посмотрев тему реанимации битых ссылок ничего не получилось, создавался новый элемент с новым UIN-ом, короче косяк.
Почитав и поисках, перерыв учебники, интернет и кучу форумов, вот что нашел:
Это реально работает!
В SQL подменил UIN. и Все сработало. Главное найти нужную таблицу.
Для Определения таблицы в SQL пример:
МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить(«Справочник.ФизическиеЛица»);
СтруктБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных);
Узнаем таблицу, а в SQL создаем Query такого плана:
UPDATE [название_базы].[dbo].[_название_таблицы]
SET [_IDRRef] = удаленный_идентификатор
WHERE [_IDRRef] = на_какой_идентификатор_подменяем
Не благодарите =)
Дерзайте.
При записи создается новый GUID (тестировалась на 8.1 УПП).
Ссылка так и остается битой, просто создается новый элемент с новым GUID гуидом. powerboy ответь
(22) вероятно указываете неверный тип ссылки.
не работает для 8.2 sql 2008
спасибо. у меня все срабатывает. и понятная в использовании
Спасибо, помогла реанимировать номенклатуру.
Спасибо. Отличная обработка. Несколько раз выручала.
как то, никак.
Спасибо. Пригодилась Даже очень!!!!!!!!!!!
Спасибо! Обработка очень пригодилась — и для восстановления удаленного и для того, чтобы разобраться как работать с UID-)
Спасибо конечно, но как из формата «46:b7b0001cc460bde211df026a8dd7cb3a» получить GUID в том виде, в каком требует обработка?
EDIT: Спасибо, разобрался. Автору плюсик.
1С:Предприятие 8.1. Удалил несколько контрагентов. Теперь пытаюсь восстановить. Спасибо! Обработка очень пригодилась — и для восстановления удаленного
Большое спасибо!
Действительно, в чем отличие от тестирования и исправления ?
«Действительно, в чем отличие от тестирования и исправления ?»
Чтоб сделать тестирование и исправление мне нужно выгнать из базы около 100 работающих пользователей, запретить обмены РИБ и подождать часиков 5-6 и еще неизвестно что она там попутно направит.
(0) Поставил минус. Во-первых — это не GUID, а UUID. Отсутствует какое-либо описание и когда я вбивал GUID в поле, то поле мне ошибку выдавало про 32 символа, я только в комментариях увидел, что автор подразумевает UUID. ну и простоv8.x: Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID лучше и понятнее, юзабельнее, и описание есть. Данную обработку скачивал, потому что здесь можно создавать элементы с владельцем, потом плюнул, и в обработку по ссылке сам добавил присвоение владельца, что заняло минут 3-5.
Работает в монопольном режиме или нет?
(38) НЕТ
что то гляжу под 7.7 никто такой обработки не знает… может тогда кто то подскажет, разницу ЗначениеВСтрокуВнутр(Объект) для текущей базы и для объекта полученного через ОЛЕ? насколько я понял в текущей базе первый символ — идентификатор типа — (T=счет/O=документ/B=справочник/E=перечисление/U=неопределенн ный) и последний реквизит 23 знака — 10 знаков идентификатор вида(спр номенклатура например) 10 знаков — идентификатор объекта, и последние 3 — идентификатор базы (юзается для УРИБ)
а в ссылке (36):
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
// Для примера Объект возвращает {«O»,»0″,»0″,»3114″,»0″,»0″,» 258156CB «}
что значит этот 258156CB? каким то образом объединеные идентификаторы?
Посмотрел, почитал коменты и воспользовался обработкой из комента (36).
(35)
Т.е. вас не волнует, что монопольный режим введен не зря, а при одновременной работе пользователей и обработки восстановления у вас в базе вообще каша может получится с данными?
(36) Istur,
У автора каша какая-то, на самом деле формат ID выглядит так:
UUID — 84:bf5600145e3710ab11dda4c605dbe824
GUID — 05dbe824-a4c6-11dd-bf56-00145e3710ab