Имя: Пароль:
1C
1C 7.7
v7: Поиск данных элементов подчиненного справочника
,
0 YaroslavStr
 
05.03.13
14:07
Задача: есть справочник Контакты. Ему подчинен справочник: Созвоны. Надо отобрать элементы справочника (сделанные созвоны) Созвоны, согласно текущей дате. Как способ наиболее быстрый? Может, кто пробовал? Количество контактов: около 30000 шт. Созвонов: по 5-7 шт на каждый контакт.
1 КонецЦикла
 
05.03.13
14:11
Запросом можно
Выбрать по реквизиту (если есть индекс по дате)
Прямым запросом можно
2 ДенисЧ
 
05.03.13
14:11
ЗАпросом.
Прямым или чОрным..
3 ЧеловекДуши
 
05.03.13
14:16
Не юли, пиши код, а мы поможем :)
4 ЧеловекДуши
 
05.03.13
14:17
(2) Лучше прямым, быстрее :)
5 ДенисЧ
 
05.03.13
14:18
(4) Если человек задаёт такой вопрос, то ой не факт...
6 YaroslavStr
 
05.03.13
14:27
Кон = СоздатьОбъект("Справочник.Контакты");
Соз = СоздатьОбъект("Справочник.Созвоны");    
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Созвоны_");    
Таб.ВывестиСекцию("Заг");

Но = 0;
Кон.ВыбратьЭлементы();
Пока Кон.ПолучитьЭлемент() > 0 Цикл    
   Соз.ИспользоватьВладельца(Кон);
   Соз.ВыбратьЭлементы();
   Пока Соз.ПолучитьЭлемент() > 0 Цикл            
           Если Соз.ДатаСозвона = Д тогда        
               СИН = Найти(Соз.Автор, СокрЛП(глПользователь));
               Если СИН > 0   тогда
                     Но = Но + 1;        
                   Таб.ВывестиСекцию("Тело");
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   
   Таб.ПараметрыСтраницы(2,,,,,,,,,,,);
   Таб.Опции(0);    
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Созвоны_", "");
7 ЧеловекДуши
 
05.03.13
14:28
Соз.ИспользоватьВладельца(Кон);

Пиши так

Соз.ИспользоватьВладельца(Кон.ТекущийЭлемент());
8 ЧеловекДуши
 
05.03.13
14:29
+(6) И что тебя тревожит?
9 YaroslavStr
 
05.03.13
14:32
Меня тревожит то, что это долго, что ужас. Думал, может есть способы побыстрее обработать и выдать на гора
10 dk
 
05.03.13
14:33
(6) для обращения к спр. созвоны не обязательно перебирать все элементы контактов
можно напрямую созвоны перебирать (или запросом) в контакты уже через владельца получать
11 dk
 
05.03.13
14:34
"в контакты" = "а контакты"
12 Sserj
 
05.03.13
14:34
(9) Прямым запросом меньше секунды, но если ты не знаешь что это такое, то это длинная история :)
13 YaroslavStr
 
05.03.13
14:35
Что быстрее: перебор или запрос? Кто знает? Сам только учусь :)
14 YaroslavStr
 
05.03.13
14:36
Может кто переделает код под прямой запрос? Буду признателен.
15 YaroslavStr
 
05.03.13
14:37
1С - dbf
16 YaroslavStr
 
05.03.13
14:38
Если я не ошибаюсь - прямые запросы, только в SQl версии?
17 ДенисЧ
 
05.03.13
14:39
(16) ошибаешься
18 Sserj
 
05.03.13
14:40
(16) Ошибаешь ищи класс "ПрямойЗапрос" он использует компоненту 1cpp и 1sqlite
19 dk
 
05.03.13
14:43
Для начала с простыми запросами разберись ))

   "Обрабатывать НеПомеченныеНаУдаление;
   |Контакт = Справочник.Созвоны.Владелец;
   |Созвон = Справочник.Созвоны.ТекущийЭлемент;
   |ДатаС = Справочник.Созвоны.ДатаСозвона;
   |Автор = Справочник.Созвоны.Автор;
   |Условие (ДатаС = Д);
   |Условие (Найти(Автор, СокрЛП(глПользователь)) > 0)
   |Без Итогов;
   |"
20 YaroslavStr
 
05.03.13
14:45
(19) Спасибо. Простые я могу делать. Просто перед тем как делать думал переспросить. Может кто уже пробовал так делать. Всем спасибо.
21 КонецЦикла
 
05.03.13
14:47
Поставь у "ДатаСозвона" сортировку и делай ВыбратьПоРеквизиту()
При обходе проверяй пользователя
Нафига перебирать во-первых все контакты, во-вторых все созвоны?
22 Sserj
 
05.03.13
14:47
Что то я честно говоря несколько в недоумении :)

Условие (Найти(Автор, СокрЛП(глПользователь)) > 0)

А простите разве Автор это строка? Это помоему реквизит типа Справочник.Пользователи и собстрвенно должно быть:
Условие (Автор = глПользователь);

Что собственно даст существенный прирос в скорости.
23 mgk2
 
05.03.13
14:48
(21) ВыбратьЭлементыПоРеквизиту()
24 Дядя Вова
 
05.03.13
14:55
SELECT
Спр.ParentExt as [Контакты $Справочник.Контакты],
Спр.ID as [Созвоны $Справочник.Созвоны],
$Спр.Автор
FROM
$Справочник.Созвоны as Спр
WHERE
$Спр.ДатаС = :ВыбКонтра AND $Спр.Автор = :глПользователь";

Не?
25 Дядя Вова
 
05.03.13
14:57
т.е.
WHERE
$Спр.ДатаСозвона = :Д AND $Спр.Автор = :глПользователь";
26 YaroslavStr
 
05.03.13
15:00
Всем сразу скажу: писал это не я. Я только начал исправлять этот участок кода. Ибо он слишком тормозит работу программы при каждом включении.
27 YaroslavStr
 
05.03.13
15:01
(21) теоретически после сортировки, если следующий автор не тот, что ищем, можно прервать все циклы? я правильно понял?
28 YaroslavStr
 
05.03.13
15:02
(22) Да, а вот тут Вы правы - надо будет посмотреть и переделать эту проверку
29 YaroslavStr
 
05.03.13
15:03
(22) Автор - это реквизит справочника Созвоны.
30 mgk2
 
05.03.13
15:04
(27) цикл с включенным фильтром гораздо быстрее выполнтся чем в твоем коде.
31 КонецЦикла
 
05.03.13
15:10
(27) Ты уж определись что первично и чем больше можно отсечь данных.
Я бы отсекал по дате. Дат явно больше чем авторов.
Выборка не будет упорядочена по авторам. Он может встретиться еще раз. Так что ничего прерывать не нужно.
32 YaroslavStr
 
05.03.13
15:18
(31) Спасибо за столь дельный совет. Один из лучших как для новичков. :) Реально спасибо! Так и сделаю
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший