<?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) обработка не удаляет, а наоборот восстанавливает ссылку, т.е. создает видимый объект конфигурации на месте удаленного!
Не удалось записать объект — {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(187)}: Ошибка при вызове метода контекста (Записать): Значение поля «Дата» не может быть пустой датой
(3) обработка восстанавливает ссылку, но ошибки заполнения не устраняет. Сначала решите вопрос с датой, а только потом используйте обработку! Или лайфхак: запустите базу в обычном приложении, там можно не записывая в базу воссоздать элемент и поменять его реквизиты!
(4)
ну как бы непонятно в чем проблема
вопрос с датой решился добавлением строки
ИначеЕсли ТипОбъекта = «Документ» Тогда
НовыйОбъект = Документы[ИмяОбъекта].СоздатьДокумент();
НовыйОбъект.УстановитьСсылкуНового(Документы[ИмяОбъекта].ПолучитьСсылку(УникальныйИд));
новыйобъект.дата=’20170510′;
в результате создается пустой документ и проблему это никак не решает
я неправильно пользуюсь?
проблема следующая: зуп 3.1.2.293 платформа 8.3.8
при попытке ввести исправление в «отпуск» возникает ошибка:
{ОбщийМодуль.ИсправлениеДокументовРасчетЗарплаты.Модуль(1777)}: Ошибка при вызове метода контекста (Записать)
ЗначенияПоказателейНабор.Записать();
по причине:
Запись с такими ключевыми полями существует! : ЗначенияПоказателейНачислений: <Объект не найден> (332:aeea68b599ce83af11e76c5cc180305c), 1, Оклад (Регистр сведений: Значения показателей начислений; Номер строки: 2)
по этому ID получаю гуид в вашей обработке
(5) похоже проблема еще и в других элементах, последовательно их восстановите. И затем все равно надо похоже через обычное приложение запускать, чтобы отследить ошибку в данных! Хотя отладчик и так у вас запустится, только доступа к данным не будет в пользовательском режиме.
(6) а как восстановить?
жму исправить — получаю ошибку -> копирую ид->получаю гуид->создаю объект->жму исправить->получаю ошибку уже с другим ид
(7) я же вам писал. У вас цепочка удаленных объектов. Вы их с какой целью восстанавливаете? Обычно после обмена такая проблема возникает или после удаления без ссылочного контроля. И во втором случае надо не восстанавливать, а удалить хвосты.
Плюс ко всему иногда требуется переписывать код конфигурации, чтобы такие действия были возможны. Рекомендую создать тему на форуме или обратиться к специалисту!
Добрый день.
У нас платформа 1С:Предприятие 8.3 (8.3.10.2299).
При попытке подключить как внешнюю обработку возникает такая ошибка:
Невозможно подключить дополнительную обработку из файла.
Возможно, она не подходит для этой версии программы.
Метод объекта не обнаружен (СведенияОВнешнейОбработке)
Если просто открыть ее, то при выполнении команды «Получить GUID» возникает такая ошибка:
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(67)}: Ошибка при вызове конструктора (УникальныйИдентификатор)
GUID = Новый УникальныйИдентификатор(ГУИД);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
(9) добрый день! Обработка идет как внешняя! Подключать их не нужно, просто запустите из меню файл! Для подключения из БСП требуется доработка метода, который вам выдало в ошибке.
(10) Хорошо, а можете проконсультировать по ошибке, связанной с недопустимым значением параметра? Я так понимаю, что он не находит объект в базе (т.е. я проверяю наличие объекта в копии базы, а в этой копии этого объекта также нет), и на это ругается?
(11) значит вы нажали кнопку и не заполнили нужный реквизит. Воспользуйтесь кнопкой поиска и только потом другими!
Если речь идет об объекте метаданных, то конечно ошибка возможна, т.к. его физически нет в базе!
(12) Спасибо!
Ошибка при поиске битых ссылок в регистрах.
Типовая БП (3.0.51.12).
Валится на запросе
ВЫБРАТЬ Об.Валюта КАК Объект,
«РегистрБухгалтерии.Хозрасчетный.Валюта» КАК ТаблицаИсточник,
Об.Регистратор КАК ОбъектИсточник,
«Справочник.Валюты» КАК ТипДанных
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Об
ГДЕ Об.Валюта ССЫЛКА Справочник.Валюты И ВЫРАЗИТЬ(Об.Валюта КАК Справочник.Валюты).Ссылка есть null И Об.Валюта <> Значение(Справочник.Валюты.ПустаяСсылка)
(14) регистры состоят из других метаданных. Поэтому теоретически их вообще можно исключить из анализа. Ошибка вам сообщила что метаданные в конфигураторе отличаются от тех что записаны в предприятии. Это особенность регистра бухгалтерии.
(15)
И? По факту обработка не работает. В данной ситуации нужно использовать ВалютаДт и ВалютаКт.
Согласно ТИИ у меня есть битые ссылки в двух РС, но обработка их не выдала.
Если на 8.3.6. все отлично работает (Надеюсь Вы тестирировали) — сделайте пометку, что на 8.3.8 обработка НЕ работоспособна. Чтобы другие пользователи не обломались.
(16) так через справочник валют не выводит? Или по каким метаданным битая ссылка?
Есть типовая Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.43.29)
На поддержке, без изменений.
Открываю в ней Вашу обработку.
Нажимаю Поиск — по всем регистрам
Появляются 2 сообщения об ошибках.
Список битых ссылок пустой.
Хотя в регистре сведений Версии объектов есть битые ссылки.
Если глянуть отладчиком — ошибки вылетают при выполнении запроса (Выше).
Попробуй его открыть в консоли.
(18) почему так работает я вам писал в (15) . Это особенность 1С. И на таких регистрах будет ошибка, но на остальные метаданные это не влияет. Версии объектов независимый регистр, его надо почистить. Обработка такие регистры пропускает, т.к. такие данные это уже мусор, который надо зачистить, а не восстанавливать!
(18) в дополнение есть кнопка «Удалить». Она правда не удаляет независимые регистры, но если вам нужно можете добавить код туда и удалить! А проще всего открыть такой регистр и руками его удалить, т.к. ссылок на него просто нет!
(21) если вы читали тему, то она звучит так: «Поиск и восстановление битых ссылок«. регистры это не ссылочный тип!! Так что извините, что за вас не прочитали название, тут нельзя помочь!
Не работает не открывается форма Версия 8.3.9
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(3,8)}: Процедура или функция с указанным именем не определена (СтрНайти)
Поз = <<?>>СтрНайти(ГУИД, «:»);
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(49,39)}: Процедура или функция с указанным именем не определена (СтрНайти)
Менеджер = Менеджеры[Лев(Таблица, <<?>>СтрНайти(Таблица, «.») — 1)];
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(50,67)}: Процедура или функция с указанным именем не определена (СтрНайти)
КонкретныйМенеджер = Менеджер[Прав(Таблица, СтрДлина(Таблица) — <<?>>СтрНайти(Таблица, «.»))];
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(76,9)}: Процедура или функция с указанным именем не определена (СтрНайти)
Если <<?>>СтрНайти(НайденнаяСсылка, «<Объект не найден>») = 0 Тогда
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(103,42)}: Процедура или функция с указанным именем не определена (СтрНайти)
ГУИДУдОбъктаСтр = Сред(ГУИДУдОбъктаСтр, <<?>>СтрНайти(ГУИДУдОбъктаСтр,»:»)+1, СтрДлина(ГУИДУдОбъктаСтр));
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(144,41)}: Процедура или функция с указанным именем не определена (СтрНайти)
ТипОбъекта = Лев(ТипНайденнойСсылки, <<?>>СтрНайти(ТипНайденнойСсылки, «.») — 1);
{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.Форма.Форма(145,73)}: Процедура или функция с указанным именем не определена (СтрНайти)
ИмяОбъекта = Прав(ТипНайденнойСсылки, СтрДлина(ТипНайденнойСсылки) — <<?>>СтрНайти(ТипНайденнойСсылки, «.»));
(23) важна не версия платформы, а версия режима совместимости конфигурации! Если у вас стоит ниже 8.3.6, то вам нужно скачать версию для 8.3.5!
Скачаная версия 8.3.6
(25) значит версию режима совместимости должна быть 8.3.6 и выше!
Так я не пойму что мне нужно исправить то? )
(27) использовать обработку для 8.3.5 или изменить режим совместимости в конфигурации!
А страшного ничего не произойдет если поменять режимы?
(29) страшного нет, но если перехода с 8.3.5 не делали, то полетит часть функционала. Раз такой вопрос задаете, выполняйте первую рекомендацию!
При восстановлении битых ссылок (например для документов) создается объект с новым идентификатором. Установка старого идентификатора не выполняется.
——
Платформа: 8.3.10.2580
Конфигурация: Бухгалтерия предприятия, редакция 3.0 (3.0.52.39)
В конфигурации не используется режим совместимости.
(31) добрый вечер!
Спасибо что сообщили о проблеме!
Реализованный метод для управляемой формы в версии 1.1.1 не сработал, пришлось вернуться к записи объекта на сервере.
Если потребуется обновленный вариант обработки, сообщите в личные сообщения!
(22) Битые ссылки как раз в регистре.
А в них как раз и не ищет
(33) я же вам уже написал. Такие данные нужно удалять, с какой целью вы их хотите восстановить?
Регистры это вспомогательные данные, которые крепятся к ссылочным, если нет ссылочного, то такие данные не удалили!
Если вам по какой-то причине нужно для них восстановить, то нужно переписать код в обработке.
Данная разработка этого не предусматривает целенаправленно!
Т.к. реализованы кнопки по удалению регистров из базы!
спасибо автору, ранее использовал для обычных форм.
У клиента битые ссылки в справочниках они понятно в регистрах видны. При восстановлении справочника в регистре всме будеток?
И еще ссылка в справочнике битая но при поиске обработке по работе со справочником находится этот объект но зайти не дает пишет объект не найден. Эта обработка сможет полечить?
(36) регистры удалить, битые ссылки уйдут! Либо восстановить, если информацию по ошибке удалили!
Чтобы зайти в битую ссылку ее нужно создать, читайте описание к публикации и ее источника!
(37)если я приобрету и не сработает я могу вернуть?
(38) обработка за стартмани, такого функционала здесь нет!
Тонсть если в ключе аналитики по контрагентам битая ссылка то обработка даст ссылку поправить?
(40) нет, обработка даст ее удалить! Что и логично, а вот если ссылка была в документе или справочнике, тогда будет возможность восстановить!
(41)
(41) вот что получаю
Не удалось создать объект — {ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(188)}: Ошибка при вызове метода контекста (Записать): Попытка вставки неуникального значения в уникальный индекс:
Microsoft SQL Server Native Client 11.0: Не удается вставить повторяющуюся строку ключа в объект «dbo._Reference253» с уникальным индексом «_Reference253HPK». Повторяющееся значение ключа: (0, 0xa2939cb654afeb2b11e8a5ee8573c581).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2601, line=1
(43) что конкретно вы делаете, ошибка вам сообщила, что ваши махинации для базы опасны и программа вам не даст этого сделать.
(0) Ошибку поправьте.
Как увидеть ошибку:
В поле «Объект не найден» вставить значение, например: «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)»
Нажимаем «ПолучитьGUID».
Получаем ошибку «{ВнешняяОбработка.ПоискИВосстановлениеБитыхСсылок836.Форма.ФормаУправляемая.Форма(67)}: Ошибка при вызове конструктора (УникальныйИдентификатор)
GUID = Новый УникальныйИдентификатор(ГУИД);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)»
Суть ошибки:
В процедуре «ПолучитьGUIDУдаленногоОбъектаНаСервере» вы ощичаете ГУИДУдОбъкта от лишних данных. Но используете для этого переменну формы ГУИДУдОбъктаСтр, которая имеет ограниченную длину 36 символов. В итоге от сам ГУИД обрезается и становится неверным.
(45) добрый день!
Спасибо за проявленный интерес к разработке!
Можете приложить скриншот, что вы делаете. Не совсем понятна логика ваших действий.
(45) ввел в реквизит «Объект не найден» текст «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)» (без кавычек).
Нажал кнопку «Получить GUID ->»/
Заполнился реквизит «GUID» текстом «8a0c6dc—8196-11e7-96c8-74d435fb680c».
Возможно вы модифицировали обработку или же используете на каком-то режиме совместимости. В режиме совместимости 8.3.10 на платформе 8.3.14 результат на картинке:
(47) Добрый день!
а должен заполнится значением 8a0c6dc0-8196-11e7-96c8-74d435fb680c
в первом сегменте теряется 8ой символ!
(48) вы лучше покажите скрин, где у вас нашло такую строку «<Объект не найден> (3410:96c874d435fb680c11e781968a0c6dc0)»
Похоже ошибка в формате строки. У меня битая ссылка выглядит так «<Объект не найден> (10:86ae005056c0000811e71c52548be600)».
(48) посмотрел код.
И какая-то мистика. Возможно кеш или еще что влияет на работу.
Выходило, что после выполнения:
Реквизит не менялся. Возможно дело в платформе. Ранее такого бага не было.
Но в любом случае поменяю код, чтобы не было путаницы!
(50) проверил разные релизы и режимы совместимости. Ошибка воспроизводится везде. Написал в поддержку 1С. И обновил публикацию для 8.3.6+.
(49)
(50)
ГУИДУдОбъктаСтр — у вас реквизит формы. Тип Строка 36 символов.
Получается:
Если ГУИДУдОбъкта = «<Объект не найден> (2760:96c874d435fb680c11e78196e9cd5d58)»
При выполнении кода:
СтрЗаменить возвращает строку 37 символов. Но попадая в ГУИДУдОбъктаСтр она обрезается до 36!
Здесь платформа отрабатывает так как и должна.
ГУИДУдОбъктаСтр — нужно снять ограничение по длине, или использовать локальную переменную функции
Показать
(53) да, действительно. Маска подрезала вывод. Ошибки в платформе нету.