Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Поиск одинаковых значений реквизита у элементов справочника

v7: Поиск одинаковых значений реквизита у элементов справочника
Я
   kupec
 
25.06.21 - 14:37
Добрый день. Можно ли как то выстроить запрос, что бы он выдал все элементы справочника с совпадающими значениями конкретно заданными реквизита. Например реквизит ПорядковыйНомер, элементов в справочнике 10. Соответственно значения реквизита для элементов должны быть от 1 до 10. Но в реале имеем следующее 1,2,3,4,4,6,7,8,9,10. Результатом вывода запроса будет 2 элемента справочника со значением реквизита равным 4
   acanta
 
1 - 25.06.21 - 14:41
База дбф или sql?
   Mikeware
 
2 - 25.06.21 - 14:53
прямым запросом - запросто
   Mikeware
 
3 - 25.06.21 - 14:54
кривым запросом - вываливай все в ТЗ, и сворачивай.
   ДенисЧ
 
4 - 25.06.21 - 14:58
рекв = СПравочник.МойСправочник.Реквизит;
элем = Справочник.МойСправочник.ТекущийЭлемент;
функция колич = Счётчик();
группировака рекв;
группировка элем;

Вроде так в клюшках пишется....
   uno-group
 
5 - 25.06.21 - 15:02
//*******************************************

// Процедура генерации запроса Сформировать.
//

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)

    |ТекущийЭлемент = Справочник.ТМЦ.ТекущийЭлемент;
    |ШтрихКод = Справочник.ТМЦ.ШтрихКод;
    |Функция Счётчик = Счётчик();
    |Группировка ШтрихКод;
    |Группировка ТекущийЭлемент без групп;
    |"//}}ЗАПРОС

    ;
    // Если ошибка в запросе, то выход из процедуры

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"

    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        Если Запрос.Счётчик=1 Тогда
            Продолжить;
        КонецЕсли;
        // Заполнение полей ШтрихКод

        Таб.ВывестиСекцию("ШтрихКод");
        Пока Запрос.Группировка(2) = 1 Цикл
            // Заполнение полей ТекущийЭлемент

            Таб.ВывестиСекцию("ТекущийЭлемент");
        КонецЦикла;
    КонецЦикла;
    // Заполнение полей "Итого"

    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры

не совсем в запросе вылавливает дубли но работает
   ДенисЧ
 
6 - 25.06.21 - 15:09
(5) а я что в (4) написал?
Кстати, если мне эклер не изменяет, недубли можно прямо в запросе отсечь...
   kupec
 
7 - 25.06.21 - 15:11
База ДБФ
   kupec
 
8 - 25.06.21 - 15:11
Спасибо за информацию. Буду пробовать
   kupec
 
9 - 25.06.21 - 15:13
(5) если я правильно понимаю, то запрос на выходе получает полный перечень всех элементов. Я думал, может быть есть какой то вариант, где на выходе как раз таки можно получить именно список дублирующихся элементов
   acanta
 
10 - 25.06.21 - 15:14
Условие (запрос.колич>1), функция запрса должна называться по другому.
   acanta
 
11 - 25.06.21 - 15:16
И вычисления в запросе с использованием функций через запр., а произвольные вычисления через глобальную функцию присвоить(кому,что)
   kupec
 
12 - 25.06.21 - 15:35
Что то я перемудрил....думал что условия одни, а оказались другие
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Дубли ШК)

    |ШтрихКод = Справочник.ШтрихКоды.Код;
    |Товар = Справочник.ШтрихКоды.Владелец;
    |Функция Итого = Счётчик();
    |Условие (Запрос.Итого>1);
    |Группировка ШтрихКод;
    |Группировка Товар без групп;
    |"//}}ЗАПРОС

    ;

Вот что сделал, но не работает. Данные не выходят. Запрос выполняется без ошибок
   Glacial
 
13 - 25.06.21 - 15:46
Может если запрос не работает, и база DBF, сделаешь по старинке: цикл, поиск дублирующих элементов, их собрать в ТЗ, и потом вывод куда надо?
   kupec
 
14 - 25.06.21 - 15:54
(13) такая мысль была сразу...более 70000 элементов....долго однако
   acanta
 
15 - 25.06.21 - 15:57
А без группировки по товару что?
   acanta
 
16 - 25.06.21 - 15:58
И условие последней строкой например..
   HawkEye
 
17 - 25.06.21 - 16:42
(0) ВыбратьЭлементыПоРеквизиту()
   Ёпрст
 
18 - 25.06.21 - 16:49
(0)На вот, развлекайся

Процедура Сформировать()
    
    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
    ТекстЗапроса = "
    |select Спр.parentext [Номенклатура :Справочник.Номенклатура] ,Спр.Code ШтрихКод
    |from [Справочник.ШтрихКоды] Спр
    |where Спр.Code in (select Code from [Справочник.ШтрихКоды]  where Ltrim(Code)<>'' group by Code having count(id)>2)
    |
    |order by Спр.Code
    |";
    запрос.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку();
    

КонецПроцедуры

   acanta
 
19 - 25.06.21 - 16:52
Пробелы в образовании:(
   Arbuz
 
20 - 25.06.21 - 17:51
(18) Почему больше 2? Больше одного же.
   Ёпрст
 
21 - 25.06.21 - 17:54
(20) ну, равно там забыл добавить
   kupec
 
22 - 28.06.21 - 16:26
(18) справочник подчиненный
   Arbuz
 
23 - 28.06.21 - 17:16
(22) Продолжайте наблюдение!
   Ёпрст
 
24 - 28.06.21 - 18:03
(22) и че ?
   Ёпрст
 
25 - 28.06.21 - 18:04
тебе дали готовый код, нужно только замечание в (20) учесть
   Ёпрст
 
26 - 28.06.21 - 18:05
Если ты его за 3 дня не смог проверить..ну..тут только

Вон из профессии!


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.