Имя: Пароль:
1C
1С v8
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
Ничего проще не придумал..
2 + 2 = 3.9999999999999999999999999999999...