Случайно обнаружил в базе битую ссылку. В результате получилась вот такая обработка
#Область СведенияОВнешнейОбработен
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));//как будет выглядеть описание печ.формы для пользователя
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета печ.формы
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода / ОткрытиеФормы
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
Если НЕ Модификатор = "" Тогда
НоваяКоманда.Модификатор = Модификатор;
КонецЕсли;
КонецПроцедуры
Функция СведенияОВнешнейОбработке() Экспорт
МассивНазначений = Новый Массив;
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Поиск битых ссылок");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Версия", "10.11.2025");
ПараметрыРегистрации.Вставить("Информация", "Поиск битых ссылок");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Поиск битых ссылок", "Поиск битых ссылок", "ОткрытиеФормы", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
#КонецОбласти
#Область ПоискБитыхСсылок
Функция НайтиБитыеСсылки() Экспорт
МассивТЗ=Новый Массив;
Для Каждого ОбъектМДПолноеИмя из СписокОбъектов Цикл
Если ОбъектМДПолноеИмя.Пометка=Ложь Тогда
Продолжить;
КонецЕсли;
МассивСоставляющихИмени=СтрРазделить(ОбъектМДПолноеИмя.Значение,".");
МассивСоставляющихИмени[0]=МассивСоставляющихИмени[0]+"Ссылка";
ТипОбъекта=Тип(СтрСоединить(МассивСоставляющихИмени,"."));
ЗаписьЖурналаРегистрации("Поиск битых ссылок",,,,"Начинаем поиск по "+ОбъектМДПолноеИмя.Значение);
ТЗРезультатПоТипу=НайтиОбъектНеНайденПоТипу(ТипОбъекта,ОбъектМДПолноеИмя.Значение, ОтборПоПериоду);
Если ТЗРезультатПоТипу.Количество()>0 Тогда
МассивТЗ.Добавить(ТЗРезультатПоТипу);
КонецЕсли;
КонецЦикла;
Если МассивТЗ.Количество()>0 Тогда
МассивКолонок=Новый Массив;
Для Каждого Колонка из МассивТЗ[0].Колонки Цикл
МассивКолонок.Добавить(Колонка.Имя);
КонецЦикла;
ТЗРезультат=ОбъединитьМассивТЗ(МассивКолонок,МассивТЗ);
ТЗБитыеСсылки=ТЗРезультат.Скопировать();
ТЗБитыеСсылки.Свернуть("БитаяСсылка,ТипОбъекта");
БитыеСсылки.Загрузить(ТЗБитыеСсылки);
Иначе
ТЗРезультат=Новый ТаблицаЗначений;
ТЗРезультат.Колонки.Добавить("Сообщение");
СтрокаТЗРезультат=ТЗРезультат.Добавить();
СтрокаТЗРезультат.Сообщение="Битых ссылок не обнаружено";
БитыеСсылки.Очистить();
КонецЕсли;
Возврат _ОбщийМодуль.ВыводТЗвТабличныйДокумент(,ТЗРезультат,"Битые ссылки за период с "+Формат(Период.ДатаНачала,"ДФ=dd.MM.yyyy")+" по "+Формат(Период.ДатаОкончания,"ДФ=dd.MM.yyyy"));
КонецФункции
Функция НайтиОбъектНеНайденПоТипу(ТипОбъекта,ТипОбъектаТекстБезСсылки,тмпОтборПоПериоду)
МассивОбщихРеквизитовЗаданногоТипа=Новый Массив;
Для Каждого ОбщийРеквизит из Метаданные.ОбщиеРеквизиты Цикл
Если ОбщийРеквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивОбщихРеквизитовЗаданногоТипа.Добавить(ОбщийРеквизит.Имя);
КонецЕсли;
КонецЦикла;
МассивЗапросов=Новый Массив;
Для Каждого Документ из Метаданные.Документы Цикл
МассивРеквизитовЗаданногоТипа=Новый Массив;
Для Каждого Реквизит из Документ.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаДокумента(тмпОтборПоПериоду,Документ.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивОбщихРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаДокумента(тмпОтборПоПериоду,Документ.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ТЧ из Документ.ТабличныеЧасти Цикл
МассивРеквизитовТЧЗаданногоТипа=Новый Массив;
Для Каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
Если РеквизитТЧ.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовТЧЗаданногоТипа.Добавить(РеквизитТЧ.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовТЧЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаДокумента(тмпОтборПоПериоду,Документ.ПолноеИмя()+"."+ТЧ.Имя,ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки,Истина);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Для Каждого Справочник из Метаданные.Справочники Цикл
МассивРеквизитовЗаданногоТипа=Новый Массив;
Для Каждого Реквизит из Справочник.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивОбщихРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ТЧ из Справочник.ТабличныеЧасти Цикл
МассивРеквизитовТЧЗаданногоТипа=Новый Массив;
Для Каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
Если РеквизитТЧ.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовТЧЗаданногоТипа.Добавить(РеквизитТЧ.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовТЧЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя()+"."+ТЧ.Имя,ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Для Каждого Справочник из Метаданные.ПланыВидовХарактеристик Цикл
МассивРеквизитовЗаданногоТипа=Новый Массив;
Для Каждого Реквизит из Справочник.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивОбщихРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
Для Каждого ТЧ из Справочник.ТабличныеЧасти Цикл
МассивРеквизитовТЧЗаданногоТипа=Новый Массив;
Для Каждого РеквизитТЧ из ТЧ.Реквизиты Цикл
Если РеквизитТЧ.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовТЧЗаданногоТипа.Добавить(РеквизитТЧ.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовТЧЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаСправочника(Справочник.ПолноеИмя()+"."+ТЧ.Имя,ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
КонецЦикла;
КонецЦикла;
МассивРегистров=Новый Массив;
Для Каждого Регистр из Метаданные.РегистрыСведений Цикл
МассивРегистров.Добавить(Новый Структура("РегистрМД,Периодичность,ЭтоРегистрБухгалтерии",Регистр,НЕ Регистр.ПериодичностьРегистраСведений=Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический,Ложь));
КонецЦикла;
Для Каждого Регистр из Метаданные.РегистрыНакопления Цикл
МассивРегистров.Добавить(Новый Структура("РегистрМД,Периодичность,ЭтоРегистрБухгалтерии",Регистр,Истина,Ложь));
КонецЦикла;
Для Каждого Регистр из Метаданные.РегистрыБухгалтерии Цикл
МассивРегистров.Добавить(Новый Структура("РегистрМД,Периодичность,ЭтоРегистрБухгалтерии",Регистр,Истина,Истина));
КонецЦикла;
Для Каждого Регистр из Метаданные.РегистрыРасчета Цикл
МассивРегистров.Добавить(Новый Структура("РегистрМД,Периодичность,ЭтоРегистрБухгалтерии",Регистр,Ложь,Ложь));
КонецЦикла;
Для Каждого Регистр из МассивРегистров Цикл
МассивРеквизитовЗаданногоТипа=Новый Массив;
Для Каждого Реквизит из Регистр.РегистрМД.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого Реквизит из Регистр.РегистрМД.Измерения Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
Если Регистр.ЭтоРегистрБухгалтерии Тогда
Если Реквизит.Балансовый Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
Иначе
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя+"Дт");
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя+"Кт");
КонецЕсли;
Иначе
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого Реквизит из Регистр.РегистрМД.Ресурсы Цикл
Если Реквизит.Тип.СодержитТип(ТипОбъекта) Тогда
МассивРеквизитовЗаданногоТипа.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементМассивРеквизитовЗаданногоТипа из МассивРеквизитовЗаданногоТипа Цикл
ТекстЗапроса= ПолучитьЗапросДляРеквизитаРегистра(тмпОтборПоПериоду,Регистр.РегистрМД.ПолноеИмя(),ЭлементМассивРеквизитовЗаданногоТипа,ТипОбъектаТекстБезСсылки,Регистр.Периодичность);
МассивЗапросов.Добавить(ТекстЗапроса);
КонецЦикла;
КонецЦикла;
МассивТЗ=Новый Массив;
МассивТекстовЗапросовДляОбъединенияТЗ=Новый Массив;
МВТ=Новый МенеджерВременныхТаблиц;
Запрос=Новый Запрос;
Запрос.МенеджерВременныхТаблиц=МВТ;
Запрос.УстановитьПараметр("ДатаНачала",Период.ДатаНачала);
Запрос.УстановитьПараметр("Датаокончания",Период.Датаокончания);
МассивЗапросовДляОбъединения=Новый Массив;
Если КоличествоЗапросовОдномПакете=0 Тогда
Запрос.Текст=СтрСоединить(МассивЗапросов,"
|ОБЪЕДИНИТЬ ВСЕ
|");
Иначе
Для н=0 по МассивЗапросов.Количество()-1 Цикл
НомерГруппыМассивов=Цел(н/КоличествоЗапросовОдномПакете);
Если (н+1)%КоличествоЗапросовОдномПакете=0 Тогда
Если МассивЗапросовДляОбъединения.Количество()>0 Тогда
Запрос.Текст=СтрСоединить(МассивЗапросовДляОбъединения,"
| ОБЪЕДИНИТЬ ВСЕ
|");
Схема=Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(Запрос.Текст);
Схема.ПакетЗапросов[0].ТаблицаДляПомещения="ВТ" +Формат(НомерГруппыМассивов,"ЧН=0; ЧГ=0");
Текст=Схема.ПолучитьТекстЗапроса();
Запрос.Текст=Текст;
Запрос.Выполнить();
МассивТекстовЗапросовДляОбъединенияТЗ.Добавить("Выбрать
| ВТ.СсылкаНаОбъект,
| ВТ.БитаяСсылка,
| ВТ.ТипОбъекта,
| ВТ.ИмяОбъекта
|ИЗ
| ВТ"+Формат(НомерГруппыМассивов,"ЧН=0; ЧГ=0")+" КАК ВТ");
КонецЕсли;
МассивЗапросовДляОбъединения=Новый Массив;
КонецЕсли;
МассивЗапросовДляОбъединения.Добавить(МассивЗапросов[н]);
КонецЦикла;
Если НЕ МассивЗапросовДляОбъединения.Количество()=0 Тогда
НомерГруппыМассивов=НомерГруппыМассивов+1;
Запрос.Текст=СтрСоединить(МассивЗапросовДляОбъединения,"
| ОБЪЕДИНИТЬ ВСЕ
|");
Схема=Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(Запрос.Текст);
Схема.ПакетЗапросов[0].ТаблицаДляПомещения="ВТ" +Формат(НомерГруппыМассивов,"ЧН=0; ЧГ=0");
Текст=Схема.ПолучитьТекстЗапроса();
Запрос.Текст=Текст;
Запрос.Выполнить();
МассивТекстовЗапросовДляОбъединенияТЗ.Добавить("Выбрать
| ВТ.СсылкаНаОбъект,
| ВТ.БитаяСсылка,
| ВТ.ТипОбъекта,
| ВТ.ИмяОбъекта
|ИЗ
| ВТ"+Формат(НомерГруппыМассивов,"ЧН=0; ЧГ=0")+" КАК ВТ");
КонецЕсли;
Запрос.Текст=СтрСоединить(МассивТекстовЗапросовДляОбъединенияТЗ,"
|ОБЪЕДИНИТЬ ВСЕ
|");
КонецЕсли;
ТЗРезультат=Запрос.Выполнить().Выгрузить();
Возврат ТЗРезультат;
КонецФункции
Функция ПолучитьЗапросДляРеквизитаДокумента(тмпОтборПоПериоду,ИмяИсточникаДанных,ИмяРеквизита,ТипОбъектаТекст,ДобавитьСсылкуПриОбращенииКДате=Ложь)
Текст="Выбрать
| Наш_Документ.Ссылка КАК СсылкаНаОбъект,
| Наш_Документ."+ИмяРеквизита+" КАК БитаяСсылка,
| """+ТипОбъектаТекст+""" КАК ТипОбъекта,
| """+ИмяИсточникаДанных+""" КАК ИмяОбъекта
|Из
| "+ИмяИсточникаДанных+" КАК Наш_Документ
|ГДЕ
| Наш_Документ."+ИмяРеквизита+" Ссылка "+ТипОбъектаТекст+"
| И Выразить(Наш_Документ."+ИмяРеквизита+" КАК "+ТипОбъектаТекст+").Ссылка Есть NULL
| И НЕ Наш_Документ."+ИмяРеквизита+"=Значение("+ТипОбъектаТекст+".ПустаяСсылка)
| "+?(тмпОтборПоПериоду,"И Наш_Документ."+?(ДобавитьСсылкуПриОбращенииКДате,"Ссылка.","")+"Дата Между &ДатаНачала и &ДатаОкончания","");
Возврат Текст;
КонецФункции
Функция ПолучитьЗапросДляРеквизитаРегистра(тмпОтборПоПериоду,ИмяИсточникаДанных,ИмяРеквизита,ТипОбъектаТекст,ЭтоПериодическийРегистр=Ложь)
Текст="Выбрать
| Неопределено КАК СсылкаНаОбъект,
| Наш_Регистр."+ИмяРеквизита+" КАК БитаяСсылка,
| """+ТипОбъектаТекст+""" КАК ТипОбъекта,
| """+ИмяИсточникаДанных+""" КАК ИмяОбъекта
|Из
| "+ИмяИсточникаДанных+" КАК Наш_Регистр
|ГДЕ
| Наш_Регистр."+ИмяРеквизита+" Ссылка "+ТипОбъектаТекст+"
| И Выразить(Наш_Регистр."+ИмяРеквизита+" КАК "+ТипОбъектаТекст+").Ссылка Есть NULL
| И НЕ Наш_Регистр."+ИмяРеквизита+"=Значение("+ТипОбъектаТекст+".ПустаяСсылка)
| "+?(тмпОтборПоПериоду,?(ЭтоПериодическийРегистр,"И Наш_Регистр.Период Между &ДатаНачала и &ДатаОкончания",""),"");
Возврат Текст;
КонецФункции
Функция ПолучитьЗапросДляРеквизитаСправочника(ИмяИсточникаДанных,ИмяРеквизита,ТипОбъектаТекст)
Текст="Выбрать
| Наш_Справочник.Ссылка КАК СсылкаНаОбъект,
| Наш_Справочник."+ИмяРеквизита+" КАК БитаяСсылка,
| """+ТипОбъектаТекст+""" КАК ТипОбъекта,
| """+ИмяИсточникаДанных+""" КАК ИмяОбъекта
|Из
| "+ИмяИсточникаДанных+" КАК Наш_Справочник
|ГДЕ
| Наш_Справочник."+ИмяРеквизита+" Ссылка "+ТипОбъектаТекст+"
| И Выразить(Наш_Справочник."+ИмяРеквизита+" КАК "+ТипОбъектаТекст+").Ссылка Есть NULL
| И НЕ Наш_Справочник."+ИмяРеквизита+"=Значение("+ТипОбъектаТекст+".ПустаяСсылка) ";
Возврат Текст;
КонецФункции
Функция ОбъединитьМассивТЗ(МассивКолонок, МассивТЗ)
МассивВыбратьПустоеЗначение=Новый Массив;
МассивТекстаВыбрать=Новый Массив;
Для Каждого ЭлМассивКолонок из МассивКолонок Цикл
МассивВыбратьПустоеЗначение.Добавить(""""" КАК "+ЭлМассивКолонок);
МассивТекстаВыбрать.Добавить("ТЗ."+ЭлМассивКолонок);
КонецЦикла;
МассивЗапросов=Новый Массив;
н=0;
Запрос=Новый Запрос;
МассивЗапросовОбъединить=Новый Массив;
МассивЗапросовОбъединить.Добавить("ВЫБРАТЬ ПЕРВЫЕ 0
|"+СтрСоединить(МассивВыбратьПустоеЗначение,","));
Для Каждого ТЗ из МассивТЗ Цикл
н=н+1;
МассивЗапросов.Добавить("Выбрать
|"+СтрСоединить(МассивТекстаВыбрать,",
|")+"
|ПОМЕСТИТЬ ВТ"+Формат(н,"ЧГ=0")+"
|ИЗ
| &ТЗ"+Формат(н,"ЧГ=0")+" КАК ТЗ");
Запрос.УстановитьПараметр("ТЗ"+Формат(н,"ЧГ=0"),ТЗ);
МассивЗапросовОбъединить.Добавить("Выбрать
|"+СтрСоединить(МассивТекстаВыбрать,",
|")+"
|ИЗ
| ВТ"+Формат(н,"ЧГ=0")+" КАК ТЗ");
КонецЦикла;
Запрос.Текст=СтрСоединить(МассивЗапросов,";
|")+";
| //////////\\\\\\\\\\\\
|"+СтрСоединить(МассивЗапросовОбъединить,"
| ОБЪЕДИНИТЬ ВСЕ
|");
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
#КонецОбласти
#Область ВыводТабличногоДокумента
Процедура ВывестиДеревоВТабличныйДокумент(ТабДок, тмпДерево, ОбластьЗначение,КолвоКолонок,уровеньгруппировки=0)
Если уровеньгруппировки>=1 Тогда
ТабДок.НачатьГруппуСтрок(уровеньгруппировки,Истина);
КонецЕсли;
Для Каждого ТекСтрока из тмпДерево.Строки Цикл
ПервыйВывод=1;
//Для Каждого ТекКолонка из тмпДерево.колоники Цикл
Для ИндексКолонки=0 по КолвоКолонок-1 Цикл
Если Строка(Типзнч(ТекСтрока[ИндексКолонки]))="Дата" Тогда
ОбластьЗначение.Параметры.ЗначениеОбласти= Формат(ТекСтрока[ИндексКолонки],"ДФ=""дд.ММ.гггг""");
Иначе
ОбластьЗначение.Параметры.ЗначениеОбласти= ТекСтрока[ИндексКолонки];
КонецЕсли;
Если (Строка(Типзнч(ТекСтрока[ИндексКолонки]))<>"Дата") и (Строка(Типзнч(ТекСтрока[ИндексКолонки]))<>"Строка") Тогда
ОбластьЗначение.Параметры.РасшифровкаЗначениеОбласти= ТекСтрока[ИндексКолонки];
Иначе
ОбластьЗначение.Параметры.РасшифровкаЗначениеОбласти="";
КонецЕсли;
Если ПервыйВывод=1 Тогда
ПервыйВывод=0;
ТабДок.Вывести(ОбластьЗначение);
Иначе
ТабДок.Присоединить(ОбластьЗначение);
КонецЕсли;
КонецЦикла;
Если ТекСтрока.Строки.Количество()>0 Тогда
ВывестиДеревоВТабличныйДокумент(ТабДок, ТекСтрока,ОбластьЗначение,КолвоКолонок,уровеньгруппировки+1);
ТабДок.ЗакончитьГруппуСтрок();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ВыводТЗвТабличныйДокумент(Знач ТабДок=Неопределено, Знач ТЗ, Знач тмпЗаголовок, ВыводитьЗаголоки=Истина,ЗаменитьКавычки=Ложь, ТекстПодвал=Неопределено) Экспорт
Если ТабДок=Неопределено Тогда
ТабДок=Новый ТабличныйДокумент;
КонецЕсли;
Макет = ПолучитьМакет("_ПроизвольныйМакет");
Если ВыводитьЗаголоки Тогда
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок|Строка1");
ОбластьЗаголовок.Параметры.ЗначениеЗаголовок= тмпЗаголовок;
ТабДок.Присоединить(ОбластьЗаголовок);
Конецесли;
ОбластьЗначение = Макет.ПолучитьОбласть("Шапка1|Строка1");
ПервыйВывод=1;
Если ТипЗнч(ТЗ)=тип("ТаблицаЗначений") Тогда
Для каждого ТекущаяКолонка из ТЗ.Колонки Цикл
ОбластьЗначение.Параметры.ЗначениеОбласти= стрзаменить(ТекущаяКолонка.Имя,"_"," ");
Если ПервыйВывод=1 и ВыводитьЗаголоки Тогда
ПервыйВывод=0;
ТабДок.Вывести(ОбластьЗначение);
Иначе
ТабДок.Присоединить(ОбластьЗначение);
КонецЕсли;
КонецЦикла;
Для ИндексСтроки=0 по ТЗ.Количество()-1 Цикл
ПервыйВывод=1;
Для ИндексКолонки=0 по ТЗ.Колонки.Количество()-1 Цикл
Если Строка(Типзнч(ТЗ[ИндексСтроки][ИндексКолонки]))="Дата" Тогда
ОбластьЗначение.Параметры.ЗначениеОбласти= Формат(ТЗ[ИндексСтроки][ИндексКолонки],"ДФ=""дд.ММ.гггг""");
Иначе
ОбластьЗначение.Параметры.ЗначениеОбласти= ТЗ[ИндексСтроки][ИндексКолонки];
КонецЕсли;
Если (Строка(Типзнч(ТЗ[ИндексСтроки][ИндексКолонки]))<>"Дата") и (Строка(Типзнч(ТЗ[ИндексСтроки][ИндексКолонки]))<>"Строка") Тогда
ОбластьЗначение.Параметры.РасшифровкаЗначениеОбласти= ТЗ[ИндексСтроки][ИндексКолонки];
КонецЕсли;
Если ПервыйВывод=1 Тогда
ПервыйВывод=0;
ТабДок.Вывести(ОбластьЗначение);
Иначе
ТабДок.Присоединить(ОбластьЗначение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ВыводитьЗаголоки и ТекстПодвал<>НЕопределено Тогда
ОбластьЗначение.Параметры.ЗначениеОбласти= "";
ТабДок.Вывести(ОбластьЗначение);
ОбластьЗначение.Параметры.ЗначениеОбласти= ТекстПодвал;
ТабДок.Вывести(ОбластьЗначение);
ТипЛинииНетЛинии= Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
мШрифт = Новый Шрифт(, 12, Истина, , , ) ;
Конецесли;
Если ВыводитьЗаголоки Тогда
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ШиринаКолонки = 0;
Стр = 3;
Область = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
Для Стр = Стр+1 По ТабДок.ВысотаТаблицы Цикл
Область = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
ШиринаОбласти = Область.Отступ+СтрДлина(СокрЛП(Область.Текст));
ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
Если ШиринаКолонки > 30 Тогда
Область.ШиринаКолонки = 30;
Иначе
Область.ШиринаКолонки = ШиринаКолонки;
КонецЕсли;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
Конеццикла;
КонецЦикла;
Если ВыводитьЗаголоки и (ТекстПодвал<>НЕопределено) Тогда
Область = ТабДок.Область(ТабДок.ВысотаТаблицы-1,1,ТабДок.ВысотаТаблицы-1,ТабДок.ШиринаТаблицы);
Область.ГраницаСверху=ТипЛинииНетЛинии;
Область.ГраницаСлева=ТипЛинииНетЛинии;
Область.ГраницаСнизу=ТипЛинииНетЛинии;
Область.ГраницаСправа=ТипЛинииНетЛинии;
Область.Шрифт=мШрифт;
Область.Объединить();
Область = ТабДок.Область(ТабДок.ВысотаТаблицы,1,ТабДок.ВысотаТаблицы,ТабДок.ШиринаТаблицы);
Область.ГраницаСверху=ТипЛинииНетЛинии;
Область.ГраницаСлева=ТипЛинииНетЛинии;
Область.ГраницаСнизу=ТипЛинииНетЛинии;
Область.ГраницаСправа=ТипЛинииНетЛинии;
Область.Шрифт=мШрифт;
Область.Объединить();
КонецЕсли;
Иначе
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ШиринаКолонки = 0;
Стр = 1;
Для Стр = Стр По ТабДок.ВысотаТаблицы Цикл
Область = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
ШиринаОбласти = Область.Отступ+СтрДлина(СокрЛП(Область.Текст));
ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
Если ШиринаКолонки > 30 Тогда
Область.ШиринаКолонки = 30;
Иначе
Область.ШиринаКолонки = ШиринаКолонки;
КонецЕсли;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
Конеццикла;
КонецЦикла;
КонецЕсли;
ТабДок.АвтоМасштаб=Истина;
ТабДок.ТолькоПросмотр=Истина;
ИначеЕсли ТипЗнч(ТЗ)=тип("ДеревоЗначений") Тогда
Для каждого ТекущаяКолонка из ТЗ.Колонки Цикл
ОбластьЗначение.Параметры.ЗначениеОбласти= стрзаменить(ТекущаяКолонка.Имя,"_"," ");
Если ПервыйВывод=1 Тогда
ПервыйВывод=0;
ТабДок.Вывести(ОбластьЗначение);
Иначе
ТабДок.Присоединить(ОбластьЗначение);
КонецЕсли;
КонецЦикла;
ВывестиДеревоВТабличныйДокумент(ТабДок,ТЗ,ОбластьЗначение,ТЗ.Колонки.Количество());
ШиринаКолонки = 0;
начСтр = 3;
МассивШиринаКолонок=Новый Массив;
МассивПредварительнаяШиринаКолонок=Новый Массив;
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
Область = ТабДок.Область("R"+Формат(начСтр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
МассивШиринаКолонок.Добавить(3);
МассивПредварительнаяШиринаКолонок.Добавить(3);
КонецЦикла;
Для Стр =начСтр По ТабДок.ВысотаТаблицы Цикл
НачалоОбъединения=0;
ОкончанияОбъединения=0;
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ШиринаТекКолонки=МассивШиринаКолонок[Кол-1];
Область = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
ШиринаОбласти = Область.Отступ+СтрДлина(СокрЛП(Область.Текст));
Если Стр=начСтр Тогда
ШиринаОбласти=Окр(ШиринаОбласти/2,0) ;
КонецЕсли;
МассивПредварительнаяШиринаКолонок[Кол-1]= Макс(ШиринаТекКолонки, ШиринаОбласти + 1);
Если Область.Текст<>"" и ОкончанияОбъединения=НачалоОбъединения Тогда
НачалоОбъединения=кол;
ОкончанияОбъединения=кол;
КонецЕсли;
Если НачалоОбъединения<>0 Тогда
Если Область.Текст="" Тогда
ОкончанияОбъединения=Кол;
Иначе
Если ОкончанияОбъединения<>НачалоОбъединения Тогда
ОбластьОбъединения = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(НачалоОбъединения,"ЧГ=0")+":R"+Формат(Стр,"ЧГ=0")+"C"+Формат(ОкончанияОбъединения,"ЧГ=0"));
ОбластьОбъединения.Объединить();
МассивПредварительнаяШиринаКолонок[НачалоОбъединения-1]=МассивШиринаКолонок[НачалоОбъединения-1];
КонецЕсли;
НачалоОбъединения=Кол;
ОкончанияОбъединения=Кол;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ОкончанияОбъединения<>НачалоОбъединения Тогда
ОбластьОбъединения = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(НачалоОбъединения,"ЧГ=0")+":R"+Формат(Стр,"ЧГ=0")+"C"+Формат(ОкончанияОбъединения,"ЧГ=0"));
ОбластьОбъединения.Объединить();
МассивПредварительнаяШиринаКолонок[НачалоОбъединения-1]=МассивШиринаКолонок[НачалоОбъединения-1];
КонецЕсли;
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
МассивШиринаКолонок[Кол-1]=макс(МассивПредварительнаяШиринаКолонок[Кол-1],МассивШиринаКолонок[Кол-1]);
КонецЦикла;
Конеццикла;
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ОбластьДляУстновкиШирины = ТабДок.Область("R"+Формат(3,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0")+":R"+Формат(ТабДок.ВысотаТаблицы,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
Если МассивШиринаКолонок[Кол-1]>30 Тогда
ОбластьДляУстновкиШирины.ШиринаКолонки = 30;
Иначе
ОбластьДляУстновкиШирины.ШиринаКолонки = МассивШиринаКолонок[Кол-1];
Конецесли;
ОбластьДляУстновкиШирины.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецЦикла;
ТабДок.АвтоМасштаб=Истина;
ТабДок.ТолькоПросмотр=Истина;
КонецЕсли;
Возврат ТабДок;
КонецФункции
#КонецОбласти
В обработке можно выбрать 1 или несколько типов объектов для поиска, а также дополнительно сделать отбор по дате для документов и регистров.
После завершения поиска битых ссылок можно увидеть местонахождение ссылки. А также создать объект на основе битой ссылки.
Проверено на следующих конфигурациях и релизах:
- 1С:Комплексная автоматизация 2, релизы 2.5.17.202
Вступайте в нашу телеграмм-группу Инфостарт