Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Список Элементов Справочника (число прочтений - 8828 )
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Список Элементов Справочника
07. Марта 2012 :: 10:13
Печать  
   Делаю ПрямойЗапрос, выгружаю результат в СЗ.
Далее, ИспользоватьСписокЭлементов(СЗ).
Блин, но тормозит, причем не запрос, а конкретно Сам список.
Подскажите, пожалуйста, как правильно сделать?
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #1 - 07. Марта 2012 :: 10:20
Печать  
    Просто мне нужен сложный фильтр элементов справочника.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Список Элементов Справочника
Ответ #2 - 07. Марта 2012 :: 10:31
Печать  
Тормозило и будет тормозить. По простому, без напряженной работы - нормально не перепишешь. Поэтому предложения:
1. Разобраться с "Поставщик данных" (посмотреть, в частности, работу со справочниками)
2. или Разобраться с "Табличное поле", "Поставщик данных" для ТП, составить ГРАМОТНЫЙ SQL-запрос, прикрутить картинки и т.д.
Второй вариант я как-то давно реализовывал - работало быстро, но работы было проведено очень много
  
Наверх
ICQ  
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #3 - 07. Марта 2012 :: 10:34
Печать  
Да запрос-то как раз выполняется мгновенно, а по поводу "Поставщик данных", не можешь кинуть ссылку на пример со справочником (а то я уже всё перерыл, ничего конкретного найти не могу, а если и есть что-то, то не работает).
Заранее благодарен.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Список Элементов Справочника
Ответ #4 - 07. Марта 2012 :: 10:45
Печать  
(0) покажи хоть свои запросы.
если не подходит  ТП
то можешь улучшить свой вариант: 
результат  sql запроса сразу в список значений ( вместо тз а потом выгружать в список значений)
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #5 - 07. Марта 2012 :: 10:50
Печать  
     СЗ = СоздатьОбъект("СписокЗначений");
     Запрос = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
     |SELECT
     |      C.ID AS [Объект $Справочник.Контрагенты]
     |FROM
     |      SC133 as C
     |      LEFT JOIN SC112 as D ON D.PARENTEXT = C.ID
     |WHERE
     |      D.SP45104 LIKE '%4%' OR C.ISFOLDER = 1
     |GROUP BY
     |      C.ID";

     Запрос.ВыполнитьИнструкцию(ТекстЗапроса).Выгрузить(СЗ);
     Форма.ПолучитьАтрибут();
     ИспользоватьСписокЭлементов(СЗ);
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Список Элементов Справочника
Ответ #6 - 07. Марта 2012 :: 11:14
Печать  
(5)
1.используй 4
2.поставь nolock
3 убери |GROUP BY       C.ID";
4. непонятно зачем тебе в результате нужны все папки по справочнику Контрагенты
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #7 - 07. Марта 2012 :: 11:18
Печать  
Z1 писал(а) 07. Марта 2012 :: 11:14:
(5)
1.используй 4
2.поставь nolock
3 убери |GROUP BY       C.ID";
4. непонятно зачем тебе в результате нужны все папки по справочнику Контрагенты

Да нет, запрос работает нормально. Не в нем проблема.
Как сделать так, что-бы список элементов справочника не тормозил Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Список Элементов Справочника
Ответ #8 - 07. Марта 2012 :: 11:25
Печать  
DmitriyOvchinnikov писал(а) 07. Марта 2012 :: 11:18:
Z1 писал(а) 07. Марта 2012 :: 11:14:
(5)
1.используй 4
2.поставь nolock
3 убери |GROUP BY       C.ID";
4. непонятно зачем тебе в результате нужны все папки по справочнику Контрагенты

Да нет, запрос работает нормально. Не в нем проблема.
Как сделать так, что-бы список элементов справочника не тормозил Улыбка

как причем тут запрос мой запрос лучше(оптимальней ) твоего.


сам список справочника практически не может тормозить
сколько в справочнике элементов ?
Наиболее вероятная причина торможения вычисления в формулах
ну или совсем в плачевном состоянии сам sql сервер.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Список Элементов Справочника
Ответ #9 - 11. Марта 2012 :: 01:21
Печать  
[quote author=DmitriyOvchinnikov link=1331115184/0#5 date=1331117448]      СЗ = СоздатьОбъект("СписокЗначений");
     Запрос = СоздатьОбъект("ODBCRecordset");
     ТекстЗапроса = "
     |SELECT
     |      C.ID AS [Объект $Справочник.Контрагенты]
     |FROM
     |      SC133 as C
     |      LEFT JOIN SC112 as D ON D.PARENTEXT = C.ID
     |WHERE
     |      D.SP45104 LIKE '%4%' OR C.ISFOLDER = 1
     |GROUP BY
     |      C.ID";

     Запрос.ВыполнитьИнструкцию(ТекстЗапроса).Выгрузить(СЗ);
     Форма.ПолучитьАтрибут();
     ИспользоватьСписокЭлементов(СЗ);[/quote]
[list][*]Запрос.ВыполнитьИнструкцию(ТекстЗапроса, СЗ);
[*]Постарайся уйти от использования LIKE - он очень медленный. Неужели нет варианта поиска по числовому значению или ссылке?
[*]Ради увеличения читаьельности кода рекомендую использовать исходный запрос с долларами, а не результат с преобразованными именами таблиц и полей, т.к. метапарсер все равно будет задействован.
[*]Первое условие во WHERE лучше перенести в условие соединения, но с LIKEом разницы особо не заметишь, а вот если будет число или ссылка - почуствуешь разницу.
[*]Поясни, что значит "тормозит список"?
[/list]
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #10 - 11. Марта 2012 :: 03:11
Печать  
Тормозит - это значит, что список элементов при прокрутке колесом мыши притормаживает.
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #11 - 11. Марта 2012 :: 03:19
Печать  
В общем задача конкретно стоит такая:
Имеется справочник "Контрагенты", у него есть подчиненный справочник "Договоры". У справочника договоры есть реквизит "Подразделение" (справочник "Подразделения"). Нужно вывести список контрагентов (и папок) у которых есть хотя-бы один договор с подразделением как у текущего пользователя.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Список Элементов Справочника
Ответ #12 - 11. Марта 2012 :: 04:17
Печать  
DmitriyOvchinnikov писал(а) 11. Марта 2012 :: 03:11:
Тормозит - это значит, что список элементов при прокрутке колесом мыши притормаживает.
С этим можно помочь только заменой элемента управления или мыши (видел такие, где колесо как-бы дергается туда-сюда).

DmitriyOvchinnikov писал(а) 11. Марта 2012 :: 03:19:
В общем задача конкретно стоит такая:
Имеется справочник "Контрагенты", у него есть подчиненный справочник "Договоры". У справочника договоры есть реквизит "Подразделение" (справочник "Подразделения"). Нужно вывести список контрагентов (и папок) у которых есть хотя-бы один договор с подразделением как у текущего пользователя.

Это же совсем другой запрос (про элементы):
Код
Выбрать все
 ТекстЗапроса = "
     |SELECT
     |	DISTINCT C.ID AS [Объект $Справочник.Контрагенты]
     |FROM
     |	$Справочник.Контрагенты as C
     |	LEFT JOIN $Справочник.Договоры as D ON D.PARENTEXT = C.ID AND $D.Подразделение = :КакУЮзера
     |WHERE
     |	C.ISFOLDER = 2 AND D.ID IS NOT NULL"; 

А вот про папки я не понял. Как можно определить, что в этой папке есть контрагент с нужным договором?
Твое же условие выводило все папки без какого-либо порядка и проверки условий.
Короче, про папки еще надо думать, а с элементами все просто.
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #13 - 11. Марта 2012 :: 04:25
Печать  
Спасибо ОГРОМНОЕ за помощь!
А вот мышь - нормальная. Тормозит сам список контрагентов при навигации по нему, хоть с помощью мыши, хоть с помощью клавиатуры.
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #14 - 11. Марта 2012 :: 04:28
Печать  
А папки просто нужно вывести все.
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #15 - 11. Марта 2012 :: 04:38
Печать  
Блин, сейчас посмотрел списки других справочников - тоже тормозят.
Что такое может быть?
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #16 - 11. Марта 2012 :: 04:53
Печать  
$D.Подразделение = :Подразделение

Запрос.УстановитьТекстовыйПараметр("Подразделение", Пользователь.Подразделение);

   Не работает запрос. Выводит всех контрагентов.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Список Элементов Справочника
Ответ #17 - 11. Марта 2012 :: 05:40
Печать  
DmitriyOvchinnikov писал(а) 11. Марта 2012 :: 04:53:
Не работает запрос. Выводит всех контрагентов.
Запрос то покажи. Поди с условием напутал что-нибудь...
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #18 - 11. Марта 2012 :: 06:03
Печать  
ТекстЗапроса = "
     |SELECT
     |      DISTINCT C.ID AS [Объект $Справочник.Контрагенты],
     |      C.DESCR,
     |      C.ISFOLDER
     |FROM
     |      $Справочник.Контрагенты as C
     |      LEFT JOIN $Справочник.Контрагенты as D ON D.PARENTEXT = C.ID
    |            AND $D.Местонахождение = :Подразделение
    |ORDER BY
    |      C.ISFOLDER, C.DESCR";


Запрос.УстановитьТекстовыйПараметр("Подразделение", Пользователь.Сотрудник.Подразделение.Получить());

P.S. У справочника "Договоры" реквизит "Местонахождение" является ссылкой на справочник "Подразделение"
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Список Элементов Справочника
Ответ #19 - 11. Марта 2012 :: 06:13
Печать  
А где мое условие "D.ID IS NOT NULL"? Именно оно и гарантировало элементы ТОЛЬКО с нужным подразделением.
Но оно же не даст тебе вывести и папки.
Вот что тебе нужно:
Код
Выбрать все
ТекстЗапроса = "
     |SELECT
     |	DISTINCT C.ID AS [Объект $Справочник.Контрагенты]
     |FROM
     |	$Справочник.Контрагенты as C
     |	LEFT JOIN $Справочник.Договоры as D ON D.PARENTEXT = C.ID AND $D.Подразделение = :КакУЮзера
     |WHERE
     |	C.ISFOLDER = 2 AND D.ID IS NOT NULL
     |UNION
     |SELECT
     |	C.ID AS [Объект $Справочник.Контрагенты]
     |FROM
     |	$Справочник.Контрагенты as C
     |WHERE
     |	C.ISFOLDER = 1"; 

  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #20 - 11. Марта 2012 :: 06:23
Печать  
Огромное спасибо!!!!! Работает.

Вот только что-то я не догоняю смысла вот этого:
"WHERE
     C.ISFOLDER = 2 AND D.ID IS NOT NULL"
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Список Элементов Справочника
Ответ #21 - 11. Марта 2012 :: 06:41
Печать  
Строится таблица (виртуальная), образующаяся из справочника "Контрагенты", к которому дорисованы колонки из таблицы "Договоры" (не все элементы, а с учетом условия $D.Подразделение = :КакУЮзера) связанные по ИД. Из этой таблицы отфильтровываются записи, у которых C.ISFOLDER = 2 - т.е. это НЕ группа, а именно Элемент, И D.ID IS NOT NULL - т.е. при добавлении доп колонок - в данной строке значения были найдены
  
Наверх
ICQ  
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #22 - 11. Марта 2012 :: 06:59
Печать  
Спасибо!!!!
А как-то можно тебе плюсик на форуме поставить? Улыбка
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #23 - 11. Марта 2012 :: 07:03
Печать  
И еще один вопрос появился (по поводу оптимизации запроса): использование индексов (INDEX)
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Список Элементов Справочника
Ответ #24 - 12. Марта 2012 :: 06:56
Печать  
Правило №1) Не считай себя умнее оптимизатора скуля.
Правило №2) даже если прямое указание индекса ускоряет выполнение запроса, см п.1. Видимо, где-то в другом ты теряешь.

Если же ты по прежнему уверен, что выигрываешь больше, чем теряешь - бог в помощь.
Пишется что-то типо
From $Справочник.Контрагенты as C (Nolock INDEX=<имя индекса>)
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Список Элементов Справочника
Ответ #25 - 12. Марта 2012 :: 07:11
Печать  
Satans Claws писал(а) 12. Марта 2012 :: 06:56:
Правило №1) Не считай себя умнее оптимизатора скуля.
Это правило работает не всегда, но где-то в 99.9999999999% случаев оно справедливо  Подмигивание
  
Наверх
 
IP записан
 
DmitriyOvchinnikov
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 48
Местоположение: Екатеринбург
Зарегистрирован: 05. Марта 2012
Пол: Мужской
Re: Список Элементов Справочника
Ответ #26 - 12. Марта 2012 :: 11:23
Печать  
Спасибо за подробный ответ. Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать