![]() |
![]() |
![]() |
|
v8: Помогите с обработкой по поиску повторов. | ☑ | ||
---|---|---|---|---|
0
bard666
23.12.13
✎
11:01
|
Цель такая: обработка, которая бегает по всем справочникам, ищет элементы с одинаковыми кодами и выводит их в таблицу. Меня заглючило на таком моменте: не у каждого справочника есть код. У некоторых это названо КодПФР, например, у других этого реквизита просто нет... Сам код обработки элементарен:
Процедура КнопкаВыполнитьНажатие(Кнопка) ТабличныйДокумент = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); ТабличныйДокумент.Вывести(ОбластьШапка); Показываем = Ложь; ОбластьСправочники = Макет.ПолучитьОбласть("Справочники"); ОбластьКоды = Макет.ПолучитьОбласть("Коды"); ОбластьЭлементы = Макет.ПолучитьОбласть("Элементы"); Для каждого Элем из Метаданные.Справочники Цикл Если Элем.Реквизиты.Найти("Код") = Неопределено Тогда// Затык тут. Продолжить; КонецЕсли; СправочникИмя = Элем.Имя; Состояние("Анализ справочника... " + СправочникИмя); ВыборкаПовторов = ПолучитьтаблицуПовторов(СправочникИмя); Если ВыборкаПовторов = 0 Тогда Продолжить; КонецЕсли; Показываем = Истина; ОбластьСправочники.Параметры.Справочник = СправочникИмя; ТабличныйДокумент.Вывести(ОбластьСправочники); ВыборкаКоды = ВыборкаПовторов.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКоды.Следующий() Цикл ОбластьКоды.Параметры.Заполнить(ВыборкаКоды); ТабличныйДокумент.Вывести(ОбластьКоды); ВыборкаЭлементы = ВыборкаКоды.Выбрать(); Пока ВыборкаЭлементы.Следующий() Цикл ОбластьЭлементы.Параметры.Заполнить(ВыборкаЭлементы); ТабличныйДокумент.Вывести(ОбластьЭлементы); КонецЦикла; КонецЦикла; КонецЦикла; Если Показываем Тогда ТабличныйДокумент.Показать(); КонецЕсли; КонецПроцедуры Функция ПолучитьтаблицуПовторов(СправочникИмя) Запрос = Новый Запрос("ВЫБРАТЬ | Спр.Код КАК Код, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Спр.Ссылка) КАК Количество |ПОМЕСТИТЬ Вт |ИЗ | Справочник." + СправочникИмя + " КАК Спр | |СГРУППИРОВАТЬ ПО | Спр.Код |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Вт.Код КАК Код, | Спр.Ссылка КАК Элемент |ИЗ | Вт КАК Вт | ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + СправочникИмя + " КАК Спр | ПО Вт.Код = Спр.Код |ГДЕ | Вт.Количество > 1 |ИТОГИ ПО | Код"); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат 0; Иначе Возврат Результат; КонецЕсли; КонецФункции |
|||
1
bard666
23.12.13
✎
11:04
|
Можно, конечно выгрузить структуру реквизитов в ВТ и там замутить поиск по наименованию колонок, но вдруг есть способ проще..
|
|||
2
Maxus43
23.12.13
✎
11:05
|
Тогда// Затык тут.
в чем затык? тут надо поидее типа ИмяРеквизитаПоиска и в запрос его |
|||
3
bard666
23.12.13
✎
11:07
|
Затык в том, что Код может быть не только в Реквизитах, которые добавлены, но и в стандартных.
|
|||
4
bard666
23.12.13
✎
11:07
|
(2) как реквизит поиска в запрос?
|
|||
5
Maxus43
23.12.13
✎
11:10
|
(3) запросу пофиг какой реквизит, лишь бы был.
(4) типа так РеквизитПоиска = "Код"; //а может быть что угодно "ВЫБРАТЬ | Валюты."+РеквизитПоиска+", | КОЛИЧЕСТВО(Валюты."+РеквизитПоиска+") КАК ОдинаковыеКоды |ИЗ | Справочник.Валюты КАК Валюты | |СГРУППИРОВАТЬ ПО | Валюты.Код | |ИМЕЮЩИЕ | КОЛИЧЕСТВО(Валюты.Код) > 1" |
|||
6
Maxus43
23.12.13
✎
11:11
|
+ |СГРУППИРОВАТЬ ПО
| Валюты."+РеквизитПоиска+" конечно |
|||
7
bard666
23.12.13
✎
11:18
|
(5) Если такого реквизита у справочника не будет, запрос выдаст ошибку. Потому и стал пытаться сначала определить есть Код - обрабатываем, нет Кода, пропускаем.
|
|||
8
Maxus43
23.12.13
✎
11:20
|
(7) дак в том и дело, РеквизитПоиска может быть произвольный, Если стандартного Код нет - в зависимости от Типа пихай туда "КодПФР" или любой другой, тот, по которому надо искать в этом конкретном случае
|
|||
9
bard666
23.12.13
✎
11:33
|
(8) вот я и хочу понять как организовать поиск по реквизитам. Не для каждого же справочника прописывать условие через Если...
|
|||
10
Maxus43
23.12.13
✎
11:49
|
(9) по другому никак. Как программа узнает по чему искать?
|
|||
11
Maxus43
23.12.13
✎
11:50
|
тут будет не для каждого - а для тех, у кого нет стандартного Код
|
|||
12
Godofsin
23.12.13
✎
11:56
|
А чо, "Поиск и замена дублирующихся элементов" моветон уже?
|
|||
13
bard666
23.12.13
✎
11:58
|
Мне не нужно заменять - просто вывести отчет. Это раз. Второе - поиск и замена обрабатывает по одному справочнику, а нужно по всем пробежаться и вывести общий отчет.
|
|||
14
1Сергей
23.12.13
✎
12:00
|
Эта штука должна быть универсальной чтоли?
|
|||
15
bard666
23.12.13
✎
12:03
|
Почти. Поиск повторов будет по одному конкретному реквизиту - Код. Вариации КодПФР или КодИФНС не прокатят.
|
|||
16
bard666
23.12.13
✎
12:04
|
Сделал проверку
Если Не ЕстьКод(СправочникИмя) Тогда Продолжить; КонецЕсли; Функция ЕстьКод(СправочникИмя) Запрос = Новый Запрос("ВЫБРАТЬ | * |ИЗ | Справочник." + СправочникИмя + " КАК Спр"); Результат = Запрос.Выполнить().Выгрузить(); Если Результат.Колонки.Найти("Код") = Неопределено Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции |
|||
17
bard666
23.12.13
✎
12:04
|
Ничего проще не придумал..
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |