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

Вроде так в клюшках пишется....
5 uno-group
 
25.06.21
15:02
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |ТекущийЭлемент = Справочник.ТМЦ.ТекущийЭлемент;
    |ШтрихКод = Справочник.ТМЦ.ШтрихКод;
    |Функция Счётчик = Счётчик();
    |Группировка ШтрихКод;
    |Группировка ТекущийЭлемент без групп;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

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

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

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

Вот что сделал, но не работает. Данные не выходят. Запрос выполняется без ошибок
13 Glacial
 
25.06.21
15:46
Может если запрос не работает, и база DBF, сделаешь по старинке: цикл, поиск дублирующих элементов, их собрать в ТЗ, и потом вывод куда надо?
14 kupec
 
25.06.21
15:54
(13) такая мысль была сразу...более 70000 элементов....долго однако
15 acanta
 
25.06.21
15:57
А без группировки по товару что?
16 acanta
 
25.06.21
15:58
И условие последней строкой например..
17 HawkEye
 
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
    |";
    запрос.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку();
    

КонецПроцедуры
19 acanta
 
25.06.21
16:52
Пробелы в образовании:(
20 Arbuz
 
25.06.21
17:51
(18) Почему больше 2? Больше одного же.
21 Ёпрст
 
25.06.21
17:54
(20) ну, равно там забыл добавить
22 kupec
 
28.06.21
16:26
(18) справочник подчиненный
23 Arbuz
 
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 дня не смог проверить..ну..тут только

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