Авто-восстановление "битых ссылок" при обменах с несколькими базами данных в режиме управляемых форм

31.07.18

Задачи пользователя - Корректировка данных

В процессе исполнения проектов консолидации данных из разных источников, возникновение «битых ссылок», особенно для закрытых периодов и действующих бизнес-процессов, могут быть крайне нежелательными в конкретный момент времени. Ясно, что специалисты со временем нормализуют обмены, восстановят утраченные по ошибке записи, но в моменте это не быстро, и необходим способ решения, который позволит продолжить производственный процесс на уровне продвинутого пользователя.

Сформулируем требования к решению:

- решение не должно требовать изменения типовых форм и объектов;

- инструмент решения должен быть доступен пользователю в точке обнаружения проблемы на расстоянии «одного клика»;

- исполнитель не должен обладать квалификацией разработчика при исправлении ошибки.

Сложности:

В платформе отсутствует возможность прямо обработать исключения такого рода и запрограммировать решение. Попытка открытия «битой ссылки» в управляемых формах, выглядит примерно так:

Блуждание в отладчике выявило возможность, которая позволяет решить вопрос лаконично и универсально.

Техническое решение:

- Создать подписку на событие модуля менеджера. В моем случае, подписка организована на все справочники системы, что бы не возвращаться к вопросу в аналогичной ситуации. Вы, для своих целей, можете в источнике указать менеджеры отдельных справочников, если это где-то нежелательно.

- Создать обработчик в подписке, который определит ошибочный случай и восстановит запись объекта, которую предоставит пользователю в штатном окне.

Способ использования:

Пользователь встречаясь с указанием на потерянные данные по ссылке, выполняет стандартную команду открытия формы потерянного элемента. Система автоматически создает объект в системе, со ссылкой восстановленной из доступных сведений, наименование помечает в формате "Восстановлен: ххххх", где ХХХ - представление внутреннего идентификатора элемента и открывает текущую форму справочника. Если у оператора сеанса есть права на изменение элемента, он может вручную заполнить критичные сведения, и продолжить рабочую эксплуатацию системы. Далее инцидент в рабочем порядке обрабатывается сотрудниками ИТ-отдела.

Исходный текст модулей:

//Обработчик подписки на событие
Процедура ОбработкаПолученияФормыСправочников(парИсточник, парВидФормы, парПараметры, парВыбраннаяФорма, парДополнительнаяИнформация, парСтандартнаяОбработка) Экспорт
	Перем пКлюч;
	
	УстановитьПривилегированныйРежим(Истина);
	Если парВидФормы = "ФормаОбъекта" Тогда
		
		Если парПараметры.Свойство("Ключ", пКлюч) Тогда //Существующий элемент или создание нового?
			
			пГУИДБитойСсылки = артисСервер.ГУИДБитойСсылки(пКлюч.Ссылка);
		Иначе
			
			Возврат;
		КонецЕсли;
		 
		Если пГУИДБитойСсылки <>  Неопределено Тогда
			
			Если парПараметры.ЭтоГруппа Тогда
				
				пОбъект = парИсточник.СоздатьГруппу();			
			Иначе
				
				пОбъект = парИсточник.СоздатьЭлемент();			
			КонецЕсли;
			
			пОбъект.УстановитьСсылкуНового(парИсточник.ПолучитьСсылку(Новый УникальныйИдентификатор(пГУИДБитойСсылки)));
			пОбъект.ОбменДанными.Загрузка = Истина;
			пОбъект.Наименование = "Восстановлен: " + парПараметры.Ключ.Ссылка;
			пОбъект.Записать();
			
			Сообщить("Восстановлена запись удаленного элемента, заполните реквизиты и сохраните объект!");
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры 

// Возвращает строку-ГУИД из первичного сообщения системы, например: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
// Параметры:
// парНачальноеПредставлениеУдаленнойСсылки - строка вида: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
Функция ПолучитьГУИДПоПредставлениюУдаленнойСсылки(парНачальноеПредставлениеУдаленнойСсылки) Экспорт

	пГУИДУдОбъктаСтр = СтрЗаменить(СокрЛП(парНачальноеПредставлениеУдаленнойСсылки),"<Объект не найден> (","");
	пГУИДУдОбъктаСтр = СтрЗаменить(пГУИДУдОбъктаСтр,")","");
	пГУИДУдОбъктаСтр = СтрЗаменить(пГУИДУдОбъктаСтр,"0x","");
	пГУИДУдОбъктаСтр = Сред(пГУИДУдОбъктаСтр, Найти(пГУИДУдОбъктаСтр,":")+1, СтрДлина(пГУИДУдОбъктаСтр));
	// Преобразуем GUID
	Возврат Сред(пГУИДУдОбъктаСтр,25,8)+"-"+Сред(пГУИДУдОбъктаСтр,21,4)+"-"+Сред(пГУИДУдОбъктаСтр,17,4)+"-"+Сред(пГУИДУдОбъктаСтр,1,4)+"-"+Сред(пГУИДУдОбъктаСтр,5,12);			//и получаем ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab    	
КонецФункции
 
// Проверяет ссылку на признак <Объект не найден> 
// В случае отсутствия элемента, создает текстовый параметр для Новый УникальныйИдентификатор()
// этот способ работает быстрее, чем попытка создания объекта, как это предлагается в некоторых рекомендациях
// Параметры:
// парСсылка - ссылка системы, для которой необходимо создать объект, в случае если объект удален
// Возврат:
// Неопределено  -  ссылка реальная и не требует создания экземпляра или
// НормальныйГУИД, готовый для: Объект.УстановитьСсылкуНового(Новый УникальныйИдентификатор(УникальныйИд));
Функция ГУИДБитойСсылки(парСсылка) Экспорт

	пПредставлениеСсылки = СокрЛП(парСсылка);
	Если Лев(пПредставлениеСсылки, 20) = "<Объект не найден> (" Тогда
		
		Возврат ПолучитьГУИДПоПредставлениюУдаленнойСсылки(пПредставлениеСсылки);
	Иначе
		
		Возврат Неопределено;
	КонецЕсли;
КонецФункции

Спасибо всем за внимание.

потерянные ссылки обмены управление проектом восстановление потерянных данных 8.2 8.3

См. также

Корректировка данных Зарплата Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

60000 руб.

06.10.2023    5355    38    20    

46

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    34844    109    152    

75

Корректировка данных Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    112292    675    175    

715

Корректировка данных Программист Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет НДС Платные (руб)

Обработка предназначена для ООО для смены системы налогообложения УСН на ОСНО, без ведения раздельного учета, входящего НДС по способам учета. При реализации перехода в операции формируются проводки по выделению НДС, который ранее учитывался в стоимости номенклатуры, регистр «НДС Предъявленный».

6000 руб.

22.01.2025    951    3    0    

5

Корректировка данных Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Налоговый учет Налог на прибыль Платные (руб)

Обработка служит для: выравнивания бухгалтерского и налогового учета на определенную дату по выбранным счетам; закрытия остатков по выбранным счетам; обнуления налогового учета (ПР, ВР также будут обнулены)

2880 руб.

05.05.2024    877    13    0    

9

Корректировка данных Ценообразование, анализ цен Мастера заполнения Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Теперь Вам не понадобится пересчитывать цену в другую валюту отдельно по каждой номенклатуре. Расширение сэкономит Ваше время, позволив сделать это при помощи групповой обработки в документе Установки цен.

2400 руб.

27.06.2023    2856    3    0    

3

Закрытие периода Корректировка данных Программист Пользователь Платформа 1С v8.3 Система компоновки данных 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 руб.

13.07.2015    51662    175    29    

127

Банковские операции Корректировка данных Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

При загрузке банковской выписки поступлений по платежным картам 1С не совсем верно распознает данные, предоставляемые банком. В результате приходится корректировать эти данные вручную в документе "Поступление на расчетный счет". Ставить сумму комиссии (даже когда программа автоматом рассчитала сумму она не всегда совпадает с банком), вид операции, в зависимости от торговой точки менять учет налогов, ставить договор итд. Все это настраивается один раз и вам останется только выбрать период! Есть и простой вариант использования - просто правит сумму комиссии. Расширение в комплекте позволяет вызвать обработку автоматически после загрузки выписки.

4200 руб.

23.12.2021    15730    10    26    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Mantis 137 01.08.18 07:20 Сейчас в теме
Непонятно за чем его создавать, если искать в других базах и загружать будет Ит специалисты.
2. SvkMaster 8 01.08.18 13:53 Сейчас в теме
Про это было вступительное слово статьи, но попробую объяснить другими словами. В конкретный момент времени, ошибка в рабочей базе выглядит как битая ссылка и останавливает процессы. В ИТ обратиться можно, но пока разберутся в причинах, поправят правила, пока пройдут обмены, может пройти сутки или двое. Восстанавливать работу производства нужно сейчас, а простой неприемлем или стоит дорого.

ИТ отдел в общем случае обычно не владеет требуемым содержимым такой ссылки, поиск ее, это обращение к ключевым пользователям и игра в "испорченный телефон", где ИТ специалист так же лишен инструментов восстановления и должен что-то изобретать.

Пример решения в статье, позволяет "залатать" пробел на уровне квалифицированного пользователя, который "руками" не влезая в какие-то дебри, создает недостающий элемент данных и содержание, после чего производственные задачи продолжаются, а ИТ-спецы параллельно решают задачу обмена и профилактики возникшего инцидента.
3. dsdred 3804 06.08.18 21:02 Сейчас в теме
Функция ГУИДБитойСсылки(парСсылка) Экспорт

пПредставлениеСсылки = СокрЛП(парСсылка);
Если Лев(пПредставлениеСсылки, 20) = "<Объект не найден> (" Тогда

Возврат ПолучитьГУИДПоПредставлениюУдаленнойСсылки(пПредставлениеСсылки);
Иначе

Возврат Неопределено;
КонецЕсли;
КонецФункции


А где поиск "битой ссылки" то?
Если наименование объекта начинается на "<Объект не найден> (", то Вы вполне можете и не "битую ссылку" ухватить.

Почитайте комментарии к этой статье https://infostart.ru/public/175898/
4. SvkMaster 8 07.08.18 09:17 Сейчас в теме
(3) да, есть небольшой риск для случая, если элемент имеет такое представление, но я иду на него сознательно.

ПолучитьОбъект() приводит к чтению объекта целиком из базы, в некоторых случаях, это приводит к существенной потере производительности (кто-то видел как работает RLS на больших данных?). Если интересно, можно поменять на получение объекта, но я бы не стал этого делать, так как вероятность в реальном контексте около нуля, а накладные расходы будут постоянными (уже не раз подобные проверки в типовых продуктах пришлось переписать).

В худшем случае, произойдет перезапись существующей ссылки, но это уже беда конкретной базы, в которой такое безобразие можно развести. Если вы так горячо переживаете, можно сделать подписку на событие, где запись с таким представлением будет запрещена, чем ПолучитьОбъект() по тысяче раз на дню.
5. SvkMaster 8 07.08.18 09:26 Сейчас в теме
(3) возможно, внимания заслуживает вариант с последним сообщением:
Если ЗначениеЗаполнено(Ссылка) Тогда
    Если ЗначениеЗаполнено(Ссылка.ВерсияДанных) Тогда
        Сообщить("Живая ссылка");
    Иначе
        Сообщить("Битая ссылка");
    КонецЕсли
Иначе
    Сообщить("Пустая ссылка");
КонецЕсли;
Показать

попробую, сообщу о результате.
Оставьте свое сообщение