|
Запутался в рекурсии. Подскажите | ☑ | ||
---|---|---|---|---|
0
1dvd
22.08.17
✎
09:15
|
Помогите, люди добрые, кто чем может
Надобно сравнить два элемента справочника Конвертации: Конвертация1 и Конвертация2. Справочник ПравилаКонвертацииОбъектов подчинен Конвертациям, многоуровневый Справочник ПравилаКонвертацииСвойств подчинен справочнику ПравилаКонвертацииОбъектов, многоуровневый Пытаюсь записать всё это дело в дерево значений(ТаблицаСравнений) с колонками Параметр, Значение1 и Значение2. В рекурсивной функции Одним циклом перебираю подчиненные Конвертация1. Параллельно ищу такой же элемент в Конвертация2 и заношу в строку дерева. Вторым циклом перебираю подчиненные Конвертация2 и если этот элемент ещё не внесен в дерево, то добавляю новой строкой. |
|||
1
1dvd
22.08.17
✎
09:15
|
Вот код:
Процедура КнопкаВыполнитьНажатие(Кнопка) ТаблицаСравнений.Строки.Очистить(); Корень = ТаблицаСравнений.Строки.Добавить(); Корень.Параметр = "Конвертация"; Корень.Значение1 = Конвертация1; Корень.Значение2 = Конвертация2; Узел = Корень.Строки.Добавить(); Узел.Параметр = "Правила конвертации объектов"; ПрочитатьСправочник(Узел, "ПравилаКонвертацииОбъектов", Конвертация1, Конвертация2); КонецПроцедуры Процедура ПрочитатьСправочник(Узел, ИмяСправочника, Владелец1 = Неопределено, Владелец2 = Неопределено, Родитель1 = Неопределено, Родитель2 = Неопределено) Если ЗначениеЗаполнено(Владелец1) Тогда Если Не ЗначениеЗаполнено(Родитель1) Тогда Выборка = Справочники[ИмяСправочника].Выбрать(Справочники[ИмяСправочника].ПустаяСсылка(), Владелец1); Иначе Выборка = Справочники[ИмяСправочника].Выбрать(Родитель1, Владелец1); КонецЕсли; Менеджер2 = Справочники[ИмяСправочника]; Пока Выборка.Следующий() Цикл ПодУзел = Узел.Строки.Добавить(); ПодУзел.Параметр = Выборка.Ссылка; ПодУзел.Значение1 = Выборка.Ссылка; ПодУзел.Значение2 = НайтиЭлементСправочника2(Выборка.Ссылка, Владелец2, Родитель2); Если ИмяСправочника = "ПравилаКонвертацииОбъектов" Тогда ПрочитатьСправочник(ПодУзел, "ПравилаКонвертацииСвойств", ПодУзел.Значение1, ПодУзел.Значение2); КонецЕсли; ПрочитатьСправочник(ПодУзел, ИмяСправочника, Владелец1, Владелец2, ПодУзел.Значение1, ПодУзел.Значение2); КонецЦикла; КонецЕсли; Если ЗначениеЗаполнено(Владелец2) Тогда Если Не ЗначениеЗаполнено(Родитель2) Тогда Выборка = Справочники[ИмяСправочника].Выбрать(Справочники[ИмяСправочника].ПустаяСсылка(), Владелец2); Иначе Выборка = Справочники[ИмяСправочника].Выбрать(Родитель2, Владелец2); КонецЕсли; Пока Выборка.Следующий() Цикл Если Узел.Строки.Найти(Выборка.Ссылка, "Значение2") = Неопределено Тогда ПодУзел = Узел.Строки.Добавить(); ПодУзел.Параметр = Выборка.Ссылка; ПодУзел.Значение1 = Справочники[ИмяСправочника].ПустаяСсылка(); ПодУзел.Значение2 = Выборка.Ссылка; ПодУзел.Статус = 2; Если ИмяСправочника = "ПравилаКонвертацииОбъектов" Тогда ПрочитатьСправочник(ПодУзел, "ПравилаКонвертацииСвойств", ПодУзел.Значение1, ПодУзел.Значение2); КонецЕсли; ПрочитатьСправочник(ПодУзел, ИмяСправочника, Неопределено, Владелец2, ПодУзел.Значение1, ПодУзел.Значение2); КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
2
1dvd
22.08.17
✎
09:17
|
Проблема в том, что когда доходит до элемента ПКС, который есть в Конвертация2, но нет в Конвертация1, то зависает наглухо
|
|||
3
h-sp
22.08.17
✎
09:43
|
(0) там же есть типровое сравнение
|
|||
4
rabbidX
22.08.17
✎
09:58
|
НайтиЭлементСправочника2 - что за функция? Не в ней виснет? Что отладчик говорит?
|
|||
5
1dvd
22.08.17
✎
10:27
|
(3) не нравится оно, криво работает
|
|||
6
1dvd
22.08.17
✎
10:28
|
всем спасибо, разобрался.
Тут была ещё процедура по сравнению реквизитов. В ней косяк был. Я не стал её показывать, ибо был уверен что там всё ок |
|||
7
1dvd
22.08.17
✎
10:36
|
(4) всё ровно там
Функция НайтиЭлементСправочника2(Значение1, Владелец2, Родитель2) Менеджер = Справочники[Значение1.Метаданные().Имя]; Если Значение1.Метаданные().ОсновноеПредставление = Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСправочника.ВВидеКода Тогда Если НЕ ЗначениеЗаполнено(Родитель2) Тогда Возврат Менеджер.НайтиПоКоду(Значение1.Код, Истина, Менеджер.ПустаяСсылка(), Владелец2); Иначе Возврат Менеджер.НайтиПоКоду(Значение1.Код, Истина, Родитель2, Владелец2); КонецЕсли; Иначе Если НЕ ЗначениеЗаполнено(Родитель2) Тогда Возврат Менеджер.НайтиПоНаименованию(Значение1.Наименование, Истина, Менеджер.ПустаяСсылка(), Владелец2); Иначе Возврат Менеджер.НайтиПоНаименованию(Значение1.Наименование, Истина, Родитель2, Владелец2); КонецЕсли; КонецЕсли; КонецФункции |
|||
8
Лефмихалыч
22.08.17
✎
10:38
|
Сериализуй оба в XML и сравни любым kdiff'ом
|
|||
9
Лефмихалыч
22.08.17
✎
10:39
|
+(8) а уже потом прицельно сравнивай то, что реально интересует. А то может и не понадобится это - все понятно будет и так
|
|||
10
1dvd
22.08.17
✎
10:39
|
(8) пробовал я эти kdiffы. для данной задачи не подходит
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |