RDT1C/DataProcessors/ирУдалениеОбъектовСКонтролемСсылок/Ext/ObjectModule.bsl
Администратор 8c57dad133 .
2016-12-04 00:19:16 +03:00

665 lines
49 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Процедура лСостояние(Текст)
//#Если Клиент Тогда
//Состояние(Текст);
//#КонецЕсли
КонецПроцедуры
Процедура лСостояниеПоиск(Текст)
//#Если Клиент Тогда
//Состояние("Поиск в "+Текст);
//#КонецЕсли
КонецПроцедуры
Процедура УстановитьЧтоСсылкуНельзяУдалить(Знач Ссылка,Связи,Типы)
// убираем эту ссылку из таблицы связей, где она является Ссылкой, т.к. проверять ссылание на неё уже не надо
Строки = Связи.НайтиСтроки(Новый Структура("Ссылка",Ссылка));
Если Строки.Количество() = 0 Тогда // ссылка уже исключена из кандидатов на удаление
Возврат;
КонецЕсли;
Для каждого С из Строки Цикл
Связи.Удалить(С);
КонецЦикла;
// убираем эту ссылку из дальнейших проверок в полях базы
МассивСсылок = Типы[ТипЗнч(Ссылка)];
МассивСсылок.Удалить(МассивСсылок.Найти(Ссылка));
Если МассивСсылок.Количество() = 0 Тогда
Типы.Удалить(ТипЗнч(Ссылка));
КонецЕсли;
// надо также убрать из кандидатов все ссылки, для которых данная была связью
Строки = Связи.НайтиСтроки(Новый Структура("Данные",Ссылка));
Для каждого С из Строки Цикл
УстановитьЧтоСсылкуНельзяУдалить(С.Ссылка,Связи,Типы);
КонецЦикла;
КонецПроцедуры
Процедура ПросмотретьСсылкиИзЗапроса(Запрос,КолвоСсылок,ДляУдаления,Связи,Типы,ЭтоТаблицаОбъектов,
ОбъектСвязи,
ИмяРегистра=Неопределено,КлючиЗаписей=Неопределено,ОтборКлюча=Неопределено, // для работы с независимыми регистрами сведений
Мета=Неопределено // для записи в данные, если данные=Неопределено
)
Отбор = Новый Структура("Ссылка,Данные");
Выборка = Запрос.Выполнить().Выбрать();
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Выборка.Количество(), ОбъектСвязи);
Пока Выборка.Следующий() Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
К = КолвоСсылок;
Пока К > 0 Цикл
К = К - 1;
Ссылка = Выборка[К];
Если ЗначениеЗаполнено(Ссылка) И Не (ДляУдаления И ЭтоТаблицаОбъектов И Ссылка = Выборка.Ссылка) Тогда // проверяем только заполненные ссылки и не учитываем связи с собой же
С = Связи.Найти(Ссылка,"Ссылка");
Если С <> Неопределено Тогда // ссылка - кандидат на удаление
Если ДляУдаления Тогда
// если ключ записи в качестве ссылки - всегда считаем, что нельзя удалять и надо убрать из кандидатов
Если ЭтоТаблицаОбъектов И Связи.Найти(Выборка.Ссылка,"Ссылка")<>Неопределено Тогда // связанная ссылка находится в таблице кандидатов на удаление, поэтому нельзя пока сказать точно можно удалить текущую или нет
Если С.Данные = Неопределено Тогда // если ранее еще не было связей с кандидатами на удаление
С.Данные = Выборка.Ссылка; // поменяли, что есть связь с кандидатом на удаление
С.ОбъектСвязи = ОбъектСвязи;
ИначеЕсли С.Данные<>Выборка.Ссылка Тогда // если текущая найденная связь не с этим кандидатом, поищем нет ли с этим
Отбор.Ссылка = Ссылка; Отбор.Данные = Выборка.Ссылка;
Если Связи.НайтиСтроки(Отбор).Количество()=0 Тогда // нет связей с таким кандидатом - надо добавить
С = Связи.Добавить();
С.Ссылка = Ссылка;
С.Данные = Выборка.Ссылка;
С.ОбъектСвязи = ОбъектСвязи;
КонецЕсли;
КонецЕсли;
Иначе // связанная ссылка не находится в таблице кандидатов на удаление, поэтому текущую ссылку точно удалять нельзя
УстановитьЧтоСсылкуНельзяУдалить(Ссылка,Связи,Типы);
КонецЕсли;
Иначе // если просто ищем все ссылки на помеченные
// если есть ссылка - в качестве ключа берём её, иначе надо где-то хранить ключи и в качестве Данные давать строку из этой таблицы
Если КлючиЗаписей = Неопределено Тогда
Отбор.Данные = Выборка.Ссылка;
Иначе
Для каждого Элемент из ОтборКлюча Цикл
ОтборКлюча[Элемент.Ключ] = Выборка[Элемент.Ключ];
КонецЦикла;
Строки = КлючиЗаписей.НайтиСтроки(ОтборКлюча);
Если Строки.Количество() = 0 Тогда
СК = КлючиЗаписей.Добавить();
Для каждого Элемент из ОтборКлюча Цикл
СК[Элемент.Ключ] = Элемент.Значение;
КонецЦикла;
НомерСтроки = КлючиЗаписей.Количество()-1;
Иначе
СК = Строки[0];
НомерСтроки = КлючиЗаписей.Индекс(СК);
КонецЕсли;
Отбор.Данные = ИмяРегистра+"."+Формат(НомерСтроки,"ЧГ=0");
//КлючЗаписи = РегистрыСведений[ИмяРегистра].СоздатьКлючЗаписи(ОтборКлюча);
//Отбор.Данные = ЗначениеВСтрокуВнутр(КлючЗаписи);
КонецЕсли;
Если С.Данные = Неопределено Тогда
С.Данные = Отбор.Данные;
С.ОбъектСвязи = ОбъектСвязи;
Если С.Данные = Неопределено Тогда
С.Данные = Мета;
КонецЕсли;
//Сообщить(Строка(Ссылка)+ " <- " + Отбор.Данные);
ИначеЕсли С.Данные <> Отбор.Данные Тогда
Отбор.Ссылка = Ссылка;
Если Связи.НайтиСтроки(Отбор).Количество() = 0 Тогда
С = Связи.Добавить();
С.Ссылка = Ссылка;
С.Данные = Отбор.Данные;
//Сообщить(Строка(Ссылка)+ " <- " + Отбор.Данные);
С.ОбъектСвязи = ОбъектСвязи;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли; // ЗначениеЗаполнено(Ссылка)
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецПроцедуры
Процедура НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,ИмяСсылка,КлючиЗаписей=Неопределено,
Мета=Неопределено // метаданные, чтобы записать в данные если неопределено
)
Если Реквизиты.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// надо искать в реквизитах и табличных частях документов
Запрос = Новый Запрос;
ТекстУсловия = "";
ТекстВыбора = "";
Для каждого Реквизит из Реквизиты Цикл
// строим массив ссылок для этого реквизита
СсылкиРеквизита = Неопределено;
Для каждого ТекущийТип из Типы Цикл
Если Реквизит.Тип.СодержитТип(ТекущийТип.Ключ) Тогда // надо проверить по этому реквизиту ссылки этого типа
Если СсылкиРеквизита = Неопределено Тогда
СсылкиРеквизита = Новый Массив;
КонецЕсли;
Для каждого Ссылка из ТекущийТип.Значение Цикл
СсылкиРеквизита.Добавить(Ссылка);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если СсылкиРеквизита <> Неопределено Тогда
ИмяПараметра = Реквизит.Имя;
ТекстВыбора = ТекстВыбора + ИмяПараметра + ",";
ТекстУсловия = ТекстУсловия + " ИЛИ " + ИмяПараметра + " В (&" + ИмяПараметра + ")";
Запрос.УстановитьПараметр(ИмяПараметра, СсылкиРеквизита);
КонецЕсли;
КонецЦикла;
Если ТекстВыбора <> "" Тогда // есть хотя бы один искомый реквизит в документе
Отбор = Новый Структура("Ссылка,Данные");
ОтборКлюча = Неопределено; // здесь будет структура для отбора по ключу независимого регистра сведений, если нужно
Если КлючиЗаписей = Неопределено Тогда
ПолеСсылки = ИмяСсылка + " КАК Ссылка";
ИначеЕсли КлючиЗаписей = ИСТИНА Тогда
ПолеСсылки = "";
Иначе // ключ получаем, а не ссылку
ПолеСсылки = "";
Для каждого Поле из КлючиЗаписей.Колонки Цикл
ПолеСсылки = ПолеСсылки + "," + Поле.Имя;
КонецЦикла;
ПолеСсылки = Сред(ПолеСсылки, 2);
ОтборКлюча = Новый Структура;
Для каждого Колонка из КлючиЗаписей.Колонки Цикл
ОтборКлюча.Вставить(Колонка.Имя, Неопределено);
КонецЦикла;
КонецЕсли;
Если ПолеСсылки = "" Тогда
ПолеСсылки = "Неопределено КАК Ссылка";
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ " + ТекстВыбора + ПолеСсылки + " ИЗ " + ИмяТаблицы + " ГДЕ " + Сред(ТекстУсловия, 6);
ЭтоТаблицаОбъектов = (ВРЕГ(ИмяСсылка) = "ССЫЛКА");
ПросмотретьСсылкиИзЗапроса(Запрос, Запрос.Параметры.Количество(), ДляУдаления, Связи, Типы, ЭтоТаблицаОбъектов, ИмяТаблицы, ИмяСсылка, КлючиЗаписей, ОтборКлюча, Мета);
КонецЕсли;
КонецПроцедуры
Процедура НайтиСсылкиВТаблицеСубконто(ДляУдаления,Мета,Связи,Типы,ИмяТаблицы)
// ищет ссылки в таблице субконто регистров бухгалтерии
// будем пытаться использовать индекс по Вид(Субконто) + Значение
// в процессе работы могут наши типы удаляться из соответствия Типы, надо учитывать эту ситуацию - сбросим их во временный массив
МассивТипов = Новый Массив;
Для каждого ТекущийТип из Типы Цикл
МассивТипов.Добавить(ТекущийТип.Ключ);
КонецЦикла;
Запрос = Новый Запрос("ВЫБРАТЬ Значение,Регистратор КАК Ссылка ИЗ "+Мета.ПолноеИмя()+".Субконто ГДЕ Вид=&ВидСубконто И Значение В (&Значение)");
МетаВидыСубконто = Мета.ПланСчетов.ВидыСубконто;
Если МетаВидыСубконто <> Неопределено Тогда
ЗапросВидаСубконто = Новый Запрос("ВЫБРАТЬ Ссылка,ТипЗначения ИЗ "+МетаВидыСубконто.ПолноеИмя());
ВыборкаВидаСубконто = ЗапросВидаСубконто.Выполнить().Выбрать();
Пока ВыборкаВидаСубконто.Следующий() Цикл
Запрос.УстановитьПараметр("ВидСубконто",ВыборкаВидаСубконто.Ссылка); // готовимся выбирать значения субконто этого вида
// надо посмотреть какие наши типы подходят в этот ВидСубконто
Л = МассивТипов.Количество();
Пока Л > 0 Цикл
Л = Л - 1;
Если ВыборкаВидаСубконто.ТипЗначения.СодержитТип(МассивТипов[Л]) Тогда
// можно проверять наших кандидатов указанного типа с этим видом субконто
МассивСсылок = Типы[МассивТипов[Л]];
Если МассивСсылок <> Неопределено Тогда // могут удалиться некоторые типы в процессе работы
Запрос.УстановитьПараметр("Значение",МассивСсылок);
ПросмотретьСсылкиИзЗапроса(Запрос,1,ДляУдаления,Связи,Типы,Ложь,ИмяТаблицы);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры // НайтиСсылкиВТаблицеСубконто
Функция ТипСсылкаСтрокой(Мета)
Возврат СтрЗаменить(Мета.ПолноеИмя(),".","Ссылка.");
КонецФункции
Функция НайтиСсылки(Ссылки,ДляУдаления) Экспорт
// Ссылки - массив ссылок объектов для проверки
// ДляУдаления - равен Ложь если надо получить результат в виде таблицы, аналогично встроенной функции ПоискПоСсылкам()
// - равен Истина для более быстрого поиска объектов, которые можно удалить. Результат возвращается в виде массива объектов для удаления.
// ОбъектСвязи - ИСТИНА - надо дополнительно в связи занести объект, через который связь
//лСостояние("Поиск помеченных на удаление...");
// найдём помеченные на удаление
//Ссылки = НайтиПомеченныеНаУдаление();
// готовим таблицу найденных ссылок
Связи = Новый ТаблицаЗначений;
Связи.Колонки.Добавить("Ссылка");
Связи.Колонки.Добавить("Данные");
Связи.Колонки.Добавить("ОбъектСвязи",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)));
// раскладываем ссылки по типам
Типы = Новый Соответствие;
Для каждого Ссылка из Ссылки Цикл
ТекущийТип = ТипЗнч(Ссылка);
СсылкиТипа = Типы[ТекущийТип];
Если СсылкиТипа = Неопределено Тогда
СсылкиТипа = Новый Массив;
Типы.Вставить(ТекущийТип,СсылкиТипа);
КонецЕсли;
СсылкиТипа.Добавить(Ссылка);
С = Связи.Добавить(); // начальное заполнение кандидатов
С.Ссылка = Ссылка;
С.Данные = Неопределено;
КонецЦикла;
Связи.Индексы.Добавить("Ссылка");
Связи.Индексы.Добавить("Ссылка,Данные");
Если ДляУдаления Тогда
Связи.Индексы.Добавить("Данные");
КонецЕсли;
//Регистраторы = Новый Соответствие; // будет таблица типов регистраторов для регистров. Ключ - имя регистра
///////////// документы
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.Документы.Количество(), "Документы");
Для каждого Мета из Метаданные.Документы Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Мета.Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
// построим таблицу по регистрам какие регистраторы будут при сканировании документов
//Для каждого Движение из Мета.Движения Цикл
// ИмяРегистра = Движение.ПолноеИмя();
// МассивТипов = Регистраторы[ИмяРегистра];
// Если МассивТипов = Неопределено Тогда
// МассивТипов = Новый Массив;
// Регистраторы.Вставить(ИмяРегистра,МассивТипов);
// КонецЕсли;
// МассивТипов.Добавить(Тип(ТипСсылкаСтрокой(Мета)));
//КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
/////////////// Планы видов расчета
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.ПланыВидовРасчета.Количество(), "Планы видов расчета");
Для каждого Мета из Метаданные.ПланыВидовРасчета Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Мета.Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
///////////// планы видов характеристик
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.ПланыВидовХарактеристик.Количество(), "Планы видов характеристик");
Для каждого Мета из Метаданные.ПланыВидовХарактеристик Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
Если Мета.Иерархический Тогда
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","Родитель",Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета))));
Иначе
Реквизиты = Мета.Реквизиты;
КонецЕсли;
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
///////////// планы счетов
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.ПланыСчетов.Количество(), "Планы счетов");
Для каждого Мета из Метаданные.ПланыСчетов Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","Родитель",Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета))));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
/////////////// Бизнес-процессы
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.БизнесПроцессы.Количество(), "Бизнес-процессы");
Для каждого Мета из Метаданные.БизнесПроцессы Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","ВедущаяЗадача",Задачи.ТипВсеСсылки()));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Мета.Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
/////////////// Задачи
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.Задачи.Количество(), "Задачи");
Для каждого Мета из Метаданные.Задачи Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.РеквизитыАдресации Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","БизнесПроцесс",БизнесПроцессы.ТипВсеСсылки()));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Мета.Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
///////////// справочники
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.Справочники.Количество(), "Справочники");
Для каждого Мета из Метаданные.Справочники Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы); // что проверяем
Если Мета.Иерархический ИЛИ Мета.Владельцы.Количество()>0 Тогда
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Если Мета.Иерархический Тогда // надо бы ещё проверить поле Родитель
Реквизиты.Добавить(Новый Структура("Имя,Тип","Родитель",Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета))));
КонецЕсли;
// надо бы еще поле Владелец проверить
Если Мета.Владельцы.Количество()>0 Тогда
ТипыВладельцев = Новый Массив;
Для каждого Владелец Из Мета.Владельцы Цикл
ТипыВладельцев.Добавить(Тип(ТипСсылкаСтрокой(Владелец)));
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","Владелец",Новый ОписаниеТипов(ТипыВладельцев)));
КонецЕсли;
Иначе
Реквизиты = Мета.Реквизиты;
КонецЕсли;
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Ссылка");
Для каждого ТЧ из Мета.ТабличныеЧасти Цикл
ИмяТаблицы = Мета.ПолноеИмя()+"."+ТЧ.Имя;
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,ТЧ.Реквизиты,"Ссылка");
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
////////////////////////// Последовательности
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.Последовательности.Количество(), "Последовательности");
ТаблицыКлючей = Новый Структура;
Для каждого Мета из Метаданные.Последовательности Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Мета.Измерения,"Регистратор",,Мета);
// надо поискать и в границах
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы+".Границы",Мета.Измерения,"Регистратор",,Мета);
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
////////////////////////// Регистры бухгалтерии
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.РегистрыБухгалтерии.Количество(), "Регистры бухгалтерии");
Для каждого Мета из Метаданные.РегистрыБухгалтерии Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы);
// надо проверить по регистраторам для зависимых регистров
// для независимых будем ключ записи искать
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Измерения Цикл
Если Мета.Корреспонденция И Не Реквизит.Балансовый Тогда
Реквизиты.Добавить(Новый Структура("Имя,Тип",Реквизит.Имя+"Кт",Реквизит.Тип));
Реквизиты.Добавить(Новый Структура("Имя,Тип",Реквизит.Имя+"Дт",Реквизит.Тип));
Иначе
Реквизиты.Добавить(Реквизит);
КонецЕсли;
КонецЦикла;
Для каждого Реквизит из Мета.Ресурсы Цикл
Если Мета.Корреспонденция И Не Реквизит.Балансовый Тогда
Реквизиты.Добавить(Новый Структура("Имя,Тип",Реквизит.Имя+"Кт",Реквизит.Тип));
Реквизиты.Добавить(Новый Структура("Имя,Тип",Реквизит.Имя+"Дт",Реквизит.Тип));
Иначе
Реквизиты.Добавить(Реквизит);
КонецЕсли;
КонецЦикла;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
ОТ = Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета.ПланСчетов));
Если Мета.Корреспонденция Тогда
Реквизиты.Добавить(Новый Структура("Имя,Тип","СчетКт",ОТ));
Реквизиты.Добавить(Новый Структура("Имя,Тип","СчетДт",ОТ));
Иначе
Реквизиты.Добавить(Новый Структура("Имя,Тип","Счет",ОТ));
КонецЕсли;
//Реквизиты.Добавить(Новый Структура("Имя,Тип","Регистратор",Новый ОписаниеТипов(Регистраторы[ИмяТаблицы])));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Регистратор");
// надо поискать ещё в таблице субконто
ИмяТаблицы = ИмяТаблицы + ".Субконто";
//лСостояниеПоиск(ИмяТаблицы);
НайтиСсылкиВТаблицеСубконто(ДляУдаления,Мета,Связи,Типы,ИмяТаблицы);
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
/////////// Регистры сведений
ТаблицыКлючей = Новый Структура;
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.РегистрыСведений.Количество(), "Регистры сведений");
Для каждого Мета из Метаданные.РегистрыСведений Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы);
// надо проверить по регистраторам для зависимых регистров
// для независимых будем ключ записи искать
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Измерения Цикл
// не будем проверять измерения со признаком "Ведущее", т.к. они должны автоматически удаляться при удалении объекта
Если Не (ДляУдаления И Реквизит.Ведущее) Тогда
Реквизиты.Добавить(Реквизит);
КонецЕсли;
КонецЦикла;
Для каждого Реквизит из Мета.Ресурсы Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Если Мета.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда
ИмяСсылка = "Регистратор";
//Реквизиты.Добавить(Новый Структура("Имя,Тип","Регистратор",Новый ОписаниеТипов(Регистраторы[ИмяТаблицы])));
КлючиЗаписей = Неопределено;
Иначе
Если ДляУдаления Тогда
ИмяСсылка = "";
КлючиЗаписей = Истина;
Иначе
ИмяСсылка = Мета.Имя;
КлючиЗаписей = Новый ТаблицаЗначений;
ТаблицыКлючей.Вставить(Мета.Имя,КлючиЗаписей);
// надо набор измерений основного отбора и период (если основной отбор по периоду) в качестве ключей
// как искать в связях? - надо будет ещё одну дополнительную таблицу для хранения ключей независимого регистра сведений
Если Мета.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
//Если Мета.ОсновнойОтборПоПериоду Тогда
КлючиЗаписей.Колонки.Добавить("Период",Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
КонецЕсли;
Для каждого Измерение из Мета.Измерения Цикл
//Если Измерение.ОсновнойОтбор Тогда
КлючиЗаписей.Колонки.Добавить(Измерение.Имя,Измерение.Тип);
//КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,ИмяСсылка,КлючиЗаписей,Мета);
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
////////////////////////// Регистры накопления
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.РегистрыНакопления.Количество(), "Регистры накопления");
Для каждого Мета из Метаданные.РегистрыНакопления Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы);
// надо проверить по регистраторам для зависимых регистров
// для независимых будем ключ записи искать
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Измерения Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.Ресурсы Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
//Реквизиты.Добавить(Новый Структура("Имя,Тип","Регистратор",Новый ОписаниеТипов(Регистраторы[ИмяТаблицы])));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Регистратор");
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
////////////////////////// Регистры расчёта
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.РегистрыРасчета.Количество(), "Регистры расчета");
Для каждого Мета из Метаданные.РегистрыРасчета Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
ИмяТаблицы = Мета.ПолноеИмя();
//лСостояниеПоиск(ИмяТаблицы);
// надо проверить по регистраторам для зависимых регистров
// для независимых будем ключ записи искать
Реквизиты = Новый Массив;
Для каждого Реквизит из Мета.Измерения Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.Ресурсы Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Для каждого Реквизит из Мета.Реквизиты Цикл
Реквизиты.Добавить(Реквизит);
КонецЦикла;
Реквизиты.Добавить(Новый Структура("Имя,Тип","ВидРасчета",Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета.ПланВидовРасчета))));
//ОписаниеТиповРегистраторы = Новый ОписаниеТипов(Регистраторы[ИмяТаблицы]);
//Реквизиты.Добавить(Новый Структура("Имя,Тип","Регистратор",ОписаниеТиповРегистраторы));
НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяТаблицы,Реквизиты,"Регистратор");
// перерасчеты тоже проверим
//Для каждого Перерасчет из Мета.Перерасчеты Цикл
// ИмяПерерасчета = ИмяТаблицы+"."+Перерасчет.Имя;
// лСостояниеПоиск(ИмяПерерасчета);
//
// Реквизиты.Очистить();
// Для каждого Реквизит из Перерасчет.Измерения Цикл
// Реквизиты.Добавить(Мета.Измерения[Реквизит.Имя]);
// КонецЦикла;
// Реквизиты.Добавить(Новый Структура("Имя,Тип","ВидРасчета",Новый ОписаниеТипов(ТипСсылкаСтрокой(Мета.ПланВидовРасчета))));
// Реквизиты.Добавить(Новый Структура("Имя,Тип","ОбъектПерерасчета",ОписаниеТиповРегистраторы));
// НайтиСсылкиВТаблице(ДляУдаления,Связи,Типы,ИмяПерерасчета,Реквизиты,"Регистратор");
//
//КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если ДляУдаления Тогда
Связи.Свернуть("Ссылка");
лСостояние("Поиск закончен.");
Возврат Связи.ВыгрузитьКолонку("Ссылка");
Иначе
Строки = Связи.НайтиСтроки(Новый Структура("Данные",Неопределено));
Для каждого С из Строки Цикл
Связи.Удалить(С);
КонецЦикла;
// надо заменить ссылки на ключи независимых регистров сведений на сами ключи
ТипСтрока = Тип("Строка");
Связи.Колонки.Добавить("Метаданные");
Связи.Колонки.Добавить("КлючЗаписиРегистраСведений");
Для каждого С из Связи Цикл
Если ТипЗнч(С.Данные)=ТипСтрока Тогда
// выделяем имя таблицы и номер строки из таблицы
Позиция = Найти(С.Данные,".");
ИмяРегистра = Лев(С.Данные,Позиция-1);
Если Позиция = СтрДлина(С.Данные) Тогда
НомерСтроки = 0;
Иначе
НомерСтроки = Число(Сред(С.Данные,Позиция+1));
КонецЕсли;
ТЗ = ТаблицыКлючей[ИмяРегистра];
СК = ТЗ[НомерСтроки];
Отбор = Новый Структура;
Для каждого Колонка из ТЗ.Колонки Цикл
Отбор.Вставить(Колонка.Имя,СК[Колонка.Имя]);
КонецЦикла;
С.Данные = РегистрыСведений[ИмяРегистра].СоздатьКлючЗаписи(Отбор);
С.КлючЗаписиРегистраСведений = С.Данные;
С.Метаданные = Метаданные.РегистрыСведений[ИмяРегистра];
ИначеЕсли ТипЗнч(С.Данные)=Тип("ОбъектМетаданных") Тогда
С.Метаданные = С.Данные;
С.Данные = Неопределено;
Иначе
// бывает, что данные = Неопределено - тогда как найти метаданные?
С.Метаданные = С.Данные.Метаданные();
Если С.Данные = Неопределено Тогда
ВызватьИсключение "Невозможно установить поле Метаданные по значению Неопределено.";
КонецЕсли;
КонецЕсли;
КонецЦикла;
лСостояние("Поиск закончен.");
Возврат Связи;
КонецЕсли;
КонецФункции
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = ВосстановитьЗначение("ирПолноеИмяФайлаОсновногоМодуля");
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный КонецЕсли;
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
//ирПортативный #КонецЕсли