Имя: Пароль:
1C
1С v8
Получение номенклатуры по значению свойств
,
0 rull9ss
 
09.07.13
16:32
сильно не пинать, только учусь.

есть справочник номенклатуры, в котором 200000+ позиций. у каждой позиции заполнено 15-20 свойств. это примерно 4кк записей в регистре Значения свойств объектов. есть форма ввода свойств, по введенным значениям необходимо проводить отбор номенклатуры ей соответствующей.
загвоздка в том что может быть заполнено только одно свойство для отбора, так и все 20 свойств.

пока остановился на варианте "динамического" запроса:

Запрос.Текст = "ВЫБРАТЬ
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура";


Если ЗначениеЗаполнено(Свойство1) Тогда
   Запрос.Текст = Запрос.Текст + |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов1
   |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов1.Объект
   |            И (&Свойство1 = ЗначенияСвойствОбъектов1.Свойство)
   |            И (&Значение1 = ЗначенияСвойствОбъектов1.Значение)";
КонецЕсли;
Если ЗначениеЗаполнено(Свойство2) Тогда
   Запрос.Текст = Запрос.Текст + |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов2
   |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов2.Объект
   |            И (&Свойство2 = ЗначенияСвойствОбъектов2.Свойство)
   |            И (&Значение2 = ЗначенияСвойствОбъектов2.Значение)";
КонецЕсли;

и т.д.

но выполняется такой запрос весьма длительное время.
буду очень благодарен если подскажете другой способ, который будет работать быстрее.
1 Bober
 
09.07.13
16:34
(0) может на основании скд?
2 rull9ss
 
09.07.13
16:36
(1) это внешняя обработка, так что вряд ли.
3 Ёпрст
 
09.07.13
16:38
(0) если есть свойство, то
1. выкинуть запрос по справочнику и все нелепые соединения, оставить только один запрос по РС
2. все условия по свойствам прописать в один запрос.
4 Fragster
 
гуру
09.07.13
16:38
типа так:

ВЫБРАТЬ
   Номенклатура.Ссылка
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   ЛОЖЬ

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗначенияАтрибутовОбъектов.Объект
ИЗ
   РегистрСведений.ЗначенияАтрибутовОбъектов КАК ЗначенияАтрибутовОбъектов
ГДЕ
   ЗначенияАтрибутовОбъектов.Объект ССЫЛКА Справочник.Номенклатура
   И ЗначенияАтрибутовОбъектов.Атрибут = &Атрибут1
   И ЗначенияАтрибутовОбъектов.Значение = &Значение1

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗначенияАтрибутовОбъектов.Объект
ИЗ
   РегистрСведений.ЗначенияАтрибутовОбъектов КАК ЗначенияАтрибутовОбъектов
ГДЕ
   ЗначенияАтрибутовОбъектов.Объект ССЫЛКА Справочник.Номенклатура
   И ЗначенияАтрибутовОбъектов.Атрибут = &Атрибут2
   И ЗначенияАтрибутовОбъектов.Значение = &Значение2
5 Ёпрст
 
09.07.13
16:38
*в одно условие
6 Fragster
 
гуру
09.07.13
16:39
а, там пересечение, а не ИЛИ...
7 Bober
 
09.07.13
16:39
(4) зачем первый запрос? и почему во всех остальных поле Объект не в выразить?
8 Ёпрст
 
09.07.13
16:40
(7) как зачем ? слишком быстро выполняется, надо притормозить
9 Fragster
 
гуру
09.07.13
16:41
тогда как-то так:


ВЫБРАТЬ
   ТЗ.Атрибут,
   ТЗ.Значение
ПОМЕСТИТЬ Отбор
ИЗ
   &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЗначенияАтрибутовОбъектов.Объект
ИЗ
   Отбор КАК Отбор
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияАтрибутовОбъектов КАК ЗначенияАтрибутовОбъектов
       ПО Отбор.Атрибут = ЗначенияАтрибутовОбъектов.Атрибут
           И Отбор.Значение = ЗначенияАтрибутовОбъектов.Значение

СГРУППИРОВАТЬ ПО
   ЗначенияАтрибутовОбъектов.Объект

ИМЕЮЩИЕ
   СУММА(1) = &КоличествоСтрокВТЗ
10 Bober
 
09.07.13
16:41
(2) а что мешает во внеш обработке использовать СКД? и выводить в форму настройку отбора СКД, потом программно получить из СКД ТЗ с результатом.
а в настройке СКД, хочешь условия по И, хочешь по ИЛИ.
11 Bober
 
09.07.13
16:42
(9) маниакально не хочешь использовать ВЫРАЗИТЬ
12 Fragster
 
гуру
09.07.13
16:42
(7) чтобы подзапросов можно было  произвольное количество в цикле. можно, конечно, по другому сделать...
(8) он не тормозит
13 Fragster
 
гуру
09.07.13
16:42
(11) а навига тут выразить?
14 acsent
 
09.07.13
16:43
(0) файловая версия?
15 rull9ss
 
09.07.13
16:44
(14) нет
16 Bober
 
09.07.13
16:44
(13) чтобы не было проблем дальше
17 acsent
 
09.07.13
16:44
(4) Хрень, в индекс не попадаешь
18 Bober
 
09.07.13
16:45
Самое правильно отдать все на откуп СКД, пусть она дописывает запрос по отбору, чем городить десятки строк на тоже самое
19 Ёпрст
 
09.07.13
16:45
(9) и нафига это всё ?
Когда достаточно для задачи - один запрос к РС с условиями.
20 acsent
 
09.07.13
16:45
если (0) то поставь индекс на поле ""свойство
21 acsent
 
09.07.13
16:46
(20) если (0) долго ...
22 Bober
 
09.07.13
16:46
(4) (9) почему не делать программно как платформа делает, все левыми соединениями?
23 acsent
 
09.07.13
16:46
и (4)
24 acsent
 
09.07.13
16:46
(22) так он так и делает в (0)
25 Fragster
 
гуру
09.07.13
16:46
(22) они сильно медленнее
26 Bober
 
09.07.13
16:47
(19) предлагаешь все сделать через (Свойство, Значение) В (&ТЗ)?
27 Fragster
 
гуру
09.07.13
16:47
(19) да тупняк, чо. домой пора.
28 acsent
 
09.07.13
16:48
(20) даже не на свойство лучше, а на значение
29 rull9ss
 
09.07.13
16:49
(19) а как ты предлагаешь?
30 Bober
 
09.07.13
16:49
(28) а пофиг, там все равно индесов нет
31 Ёпрст
 
09.07.13
16:57
(29) один запрос на РС.. + условия, усё.
:)
32 rull9ss
 
09.07.13
17:03
(31)
пример можешь привести? а то что-то под конец дня плохо думается
33 acsent
 
09.07.13
17:04
(30) так я и предлагаю сделать
34 Ахиллес
 
09.07.13
17:06
Вместо "=" в условии должно быть "В" тогда пустые отборы тоже нормально отрабатывать будут.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший