Имя: Пароль:
1C
1C 7.7
v7: Найти все элементы справочника по реквизиту
Ø (Волшебник 04.04.2023 09:31)
,
0 Gera1t
 
03.04.23
14:52
Здравствуйте!
Подскажите пожалуйста, как получить выборку элементов справочника по реквизиту?
Через НайтиПоРеквизиту находит только 1.
Через запрос тоже.
Методом перебора всех элементов справочника долго.
1 skafandr
 
03.04.23
15:00
ВыбратьЭлементыПоРеквизиту
2 Волшебник
 
03.04.23
15:00
ВыбратьЭлементыПоРеквизиту()
3 Gera1t
 
03.04.23
15:01
спасибо!
4 skafandr
 
03.04.23
15:01
Фраза "Через запрос тоже" честно говоря непонятна. Если правильный запрос, то должен показывать все ...или он там реально один :)
5 Волшебник
 
03.04.23
15:02
(4) Наверное, чёрный запрос
6 Gera1t
 
03.04.23
15:03
По поводу запроса, самый элементарный.
Но как я понимаю в 7 запросы работают не быстрее чем простой перебор элементов.
7 Волшебник
 
03.04.23
15:04
(6) Попробуйте прямые запросы к SQL
8 Gera1t
 
03.04.23
15:05
(7) Спасибо! Как раз сижу читаю информацию про прямые запросы)
9 Злопчинский
 
03.04.23
15:08
если прямые запросы - то юзай 1Sqlite? не надо никаких драйверов и прочего.
обсуждение можно найти здесь же или на форуме 1С++ или здесь у Djelf
10 Злопчинский
 
03.04.23
15:09
(8) для твоей задачи выбратьпореквизиту самое оно. это будет выборка по индексу, быстро.
прямые запросы для такой простой штуки м.б. излишне напрягаться...
11 АгентБезопасной Нацио
 
03.04.23
15:38
(9) это если у него файловая...
(10) именно так. Разница в прямом и выборке очень небольшая.
12 mikecool
 
03.04.23
16:24
(10) это если есть индекс...
13 АгентБезопасной Нацио
 
03.04.23
16:35
(10) если он может сделать ВыбратьДокументыПоРеквизиту - значит, у реквизита стоит признак Сортировка. А если стоит признак Сортировка - значит, есть и индекс.
14 MWWRuza
 
гуру
03.04.23
19:40
А SQLLite умеет по реквизиту отбирать и без признака "Сортировка" :-)
По скорости правда не сравнивал, но вообще работает.
15 Злопчинский
 
03.04.23
19:57
(14) ну, если индекса нет - то тупо сканом...?
16 MWWRuza
 
гуру
03.04.23
20:17
Ну, я не знаю, сканом или чем, но, в частности я в базе алкогольные марки ищу так:

Функция НайтиМаркуSqlLite(ШК) Экспорт
    Перем Запрос;
    Попытка
        БазаДанных = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        БазаДанных = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    БазаДанных.Открыть(":memory:");
    Запрос = БазаДанных.НовыйЗапрос();
    Запрос.ВыполнитьЗапрос("create virtual table Марки using dbeng(Справочник.Марки)");
    Текст =     "SELECT
                |code Код,
                |id [Марка :Справочник.Марки]
                |FROM Марки
                |WHERE ismark <> '*'";
            
    Текст = Текст + "
                |AND КодНовМарк LIKE '%" + СокрЛП(ШК) + "%'";
                
    Попытка
        Тз = Запрос.ВыполнитьЗапрос(Текст);
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат 0;
    КонецПопытки;
    Если Тз.КоличествоСтрок() > 0 Тогда
        ИскМарка    = Тз.ПолучитьЗначение(1, "Марка");
        Возврат ИскМарка;
    Иначе
        Возврат 0;    
    КонецЕсли;    
КонецФункции

КодНовМарк - текстовый реквизит справочника "Марки", без признака "Сортировка".
17 Злопчинский
 
03.04.23
21:52
не люблю когда возвращаются разнотипные значения. то ссылка, то число
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший