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