Имя: Пароль:
1C
1С v8
Выборка элементов табличной части справочника
0 HGW
 
14.07.12
12:43
Есть справочник "НормыВыдачиСпецодежды" в нем 2 реквизита Подразделение и Должность. Так же табличная часть содержащая колонки Спецодежда, Количество, Срок. Необходимо получить строки ТЧ справочника, поиск по реквизитам Подразделение и Должность. Эти строки вывести в таблицу на форме обработки. Делаю так:

Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
      | НормыВыдачиСпецодежды.Состав.Спецодежда КАК Спецодежда,
      | НормыВыдачиСпецодежды.Состав.Количество КАК Количество,
      | НормыВыдачиСпецодежды.Состав.Срок КАК Срок
      |ИЗ
      | Справочник.НормыВыдачиСпецодежды КАК НормыВыдачиСпецодежды
      |ГДЕ
      | НормыВыдачиСпецодежды.Подразделение = &Подразделение
      | И НормыВыдачиСпецодежды.Должность = &Должность";

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

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
   СтрТаб = Спецодежда.Добавить();
   СтрТаб.Спецододежда = Выборка.Спецодежда;
   СтрТаб.Количество = Выборка.Количество;
   СтрТаб.Срок = Выборка.Срок;
КонецЦикла;

Запрос срабатывает. в отладчике смотрел, в переменной Результат есть необходимые колонки. Но независимо от кол-ва строк ТЧ попадающих под условие, добавляет в таблицу одну пустую строку. Если условие убрать из запроса, то добавляет пустых строк столько сколько строк с основными реквизитами в справочнике. Не могу разобраться. Может как то по другому обход результата делать?
Заранее спасибо за помощь.
1 Error pro
 
14.07.12
12:46
Спецодежда.Загрузить(Результат.Выгрузить). Только имена колонок должны совпадать
2 izekia
 
14.07.12
12:49
там не элементы
3 ЧашкаЧая
 
14.07.12
12:50
А если так?

ВЫБРАТЬ
   НормыВыдачиСпецодеждыСостав.Спецодежда КАК Спецодежда,
   НормыВыдачиСпецодеждыСостав.Количество КАК Количество,
   НормыВыдачиСпецодеждыСостав.Срок КАК Срок
ИЗ
   Справочник.НормыВыдачиСпецодежды КАК НормыВыдачиСпецодежды
   ЛЕВОЕ СОЕДИНЕНИЕ  Справочник.НормыВыдачиСпецодежды.Состав КАК НормыВыдачиСпецодеждыСостав
   ПО НормыВыдачиСпецодежды.Ссылка = НормыВыдачиСпецодеждыСостав.Ссылка
ГДЕ
НормыВыдачиСпецодежды.Подразделение = &Подразделение
И НормыВыдачиСпецодежды.Должность = &Должность
4 mirosh
 
14.07.12
12:51
(3) зачем соединять-то, можно сразу ТЧ выбрать ;)
5 izekia
 
14.07.12
12:52
(0) значит у тебя везде по пустой строке
6 mirosh
 
14.07.12
12:53
(5) там запрос неправильный, надо как (3)
7 HGW
 
14.07.12
12:53
с (Результат.Выгрузить()) не работает.пробовал уже. Справочник заполнен.Условие срабатывает.Если вводить значения которых нет в справочнике то строка не добавляется.
Сейчас попробую поменять запрос
8 izekia
 
14.07.12
12:57
о а что за бредовый запрос?
9 izekia
 
14.07.12
12:57
только сейчас прочитал
10 izekia
 
14.07.12
12:58
в (3) правильно, можно еще с допразыменованием, скорее всего с тем же результатом
11 HGW
 
14.07.12
13:01
С таким запросом работает.Спасибо огромное!1с сам сижу изучаю,поэтому пока не успел хорошо подружиться) Еще раз спасибо.
12 mirosh
 
14.07.12
13:02
(11) если будет время, потренируйся сразу в запросе из табличной части выбирать
13 mirosh
 
14.07.12
13:03
вот так
ВЫБРАТЬ
   НормыВыдачиСпецодеждыСостав.Спецодежда КАК Спецодежда,
    НормыВыдачиСпецодеждыСостав.Количество КАК Количество,
    НормыВыдачиСпецодеждыСостав.Срок КАК Срок
ИЗ
   Справочник.НормыВыдачиСпецодеждыСостав КАК НормыВыдачиСпецодеждыСостав
 
ГДЕ
НормыВыдачиСпецодеждыСостав.Ссылка.Подразделение = &Подразделение
И НормыВыдачиСпецодеждыСостав.Ссылка.Должность = &Должность
15 andrewks
 
14.07.12
13:04
(12)(13) какая наивность.   зачем так настойчиво давать вредные советы?
16 mirosh
 
14.07.12
13:04
(15) нормально всё
17 izekia
 
14.07.12
13:05
(16) в профайлере смотрел?
я вот не знаю как 1С там соединит
18 andrewks
 
14.07.12
13:05
(16) нифига не нормально. ты наивно полагаешь, что в твоём запросе нет соединения?
19 HGW
 
14.07.12
13:05
Была попытка сделать так. Только не было слова "Ссылка"
20 mirosh
 
14.07.12
13:06
(18) есть, но он проще читается
21 mirosh
 
14.07.12
13:06
сори, в (13) опечатка, правильно вот

ВЫБРАТЬ
   НормыВыдачиСпецодеждыСостав.Спецодежда КАК Спецодежда,
    НормыВыдачиСпецодеждыСостав.Количество КАК Количество,
    НормыВыдачиСпецодеждыСостав.Срок КАК Срок
ИЗ
   Справочник.НормыВыдачиСпецодежды.Состав КАК НормыВыдачиСпецодеждыСостав
 
ГДЕ
НормыВыдачиСпецодеждыСостав.Ссылка.Подразделение = &Подразделение
И НормыВыдачиСпецодеждыСостав.Ссылка.Должность = &Должность
22 andrewks
 
14.07.12
13:08
(20) надо делать не как удобнее программисту, а как эффективнее
23 HGW
 
14.07.12
13:10
Так тоже работает. Но я все таки почитаю про левое соединение
24 mirosh
 
14.07.12
13:10
(22) во-первых, это утверждение по меньшей мере спорно, т.к. простота и скорость разработки часто перевешивают пользу от более эффективного решение. Причем неясно, эффективного в каком плане и что является критерием эффективности. Так что, часто этой эффективностью можно пожертвовать ради удобства поддержки и разработки.
Во-вторых, в данном случае разницы в какой бы то ни было эффективности нет в данной случае.

(23) ну да, за одно и потренируйся
25 andrewks
 
14.07.12
13:12
(24) "Во-вторых, в данном случае разницы в какой бы то ни было эффективности нет в данной случае. "

ну, давай, за базар отвечай. тексты и результаты низкоуровневых запросов к БД для обоих вариантов для разных СУБД в студию
26 mirosh
 
14.07.12
13:16
(25) нет, я уверен, что мой вариант работает не хуже твоего (как минимум). Более того, при очень большой таблице справочника он будет работать быстрее. Кроме того, ты первый усомнился в моей правоте, поэтому будь добр, САМ предоставь доказательства того, что твой вариант "эффективнее". А свои блатные замашки, типа "за базар отвечай" оставь кому-нибудь другому, уважаемый лайт-модератор, инженер знаний.
27 izekia
 
14.07.12
13:19
(26) "Более того, при очень большой таблице справочника он будет работать быстрее"
вот про это можно поподробнее?
28 andrewks
 
14.07.12
13:27
"Более того, при очень большой таблице справочника он будет работать быстрее"

феерично.

я не собираюсь тебе доказывать прописные истины при таких текстах. ибо, если ты мне докажешь, за счёт какого такого алгоритма неявное соединение (транслируемое в левое) даже гипотетически может работать быстрее явного (а явно можно использовать как то же самое левое, так и более быстрое внутреннее), ты перевернёшь моё мировоззрение
29 izekia
 
14.07.12
13:51
Первый вариант:
ВЫБРАТЬ
   ПользователиКонтактнаяИнформация.Представление,
   ПользователиКонтактнаяИнформация.Тип
ИЗ
   Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация ВНУТРЕННЕЕ СОЕДИНЕНИЕ  Справочник.Пользователи КАК Пользователи ПО
   ПользователиКонтактнаяИнформация.Ссылка = Пользователи.Ссылка
ГДЕ
   Пользователи.Наименование = "Вася"
   И Пользователи.Предопределенный = ЛОЖЬ

SELECT
T1._Fld424,
T1._Fld422RRef
FROM _Reference49_VT420 T1 WITH(NOLOCK)
INNER JOIN _Reference49 T2 WITH(NOLOCK)
ON (T1._Reference49_IDRRef = T2._IDRRef)
WHERE (T2._Description = P1) AND (T2._IsMetadata = @P2)
30 izekia
 
14.07.12
13:52
кстати в (3) не совсем правильно если нам тч нужна
31 izekia
 
14.07.12
13:54
второй:
ВЫБРАТЬ
   ПользователиКонтактнаяИнформация.Представление,
   ПользователиКонтактнаяИнформация.Тип
ИЗ
   Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
ГДЕ
   ПользователиКонтактнаяИнформация.Ссылка.Наименование = "Вася"
   И ПользователиКонтактнаяИнформация.Ссылка.Предопределенный = ЛОЖЬ

SELECT
T1._Fld424,
T1._Fld422RRef
FROM _Reference49_VT420 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Reference49 T2 WITH(NOLOCK)
ON T1._Reference49_IDRRef = T2._IDRRef
WHERE (T2._Description = P1) AND (T2._IsMetadata = @P2)
32 ЧашкаЧая
 
14.07.12
13:56
> кстати в (3) не совсем правильно если нам тч нужна
То есть?
33 izekia
 
14.07.12
14:01
(32) да нет, это я неправ ...по плану запроса если смотреть, то действительно ЛЕВОЕ СОЕДИНЕНИЕ
надо мне SQL подтянуть похоже
34 izekia
 
14.07.12
14:06
в целом получается что без джойна компактнее
35 izekia
 
14.07.12
14:07
ну и внутреннее в (29) использовать - это ошибка
36 m-serg74
 
14.07.12
14:09
(34) но... не в конкретном случае ТСа, но иногда вне зависимости от содержания ТЧ, бывает нужно вывести некие данные из ЭлСправочника, поэтому через соединение все таки лучше, потому что если ТЧ пустая вообще нифига не выйдет
37 m-serg74
 
14.07.12
14:09
но соединение левое
38 izekia
 
14.07.12
14:12
(36) о, стоп, правильно ли я понял, что если мы сделаем так:
ВЫБРАТЬ
   ПользователиКонтактнаяИнформация.Представление,
   ПользователиКонтактнаяИнформация.Тип,
   ПользователиКонтактнаяИнформация.Ссылка.Наименование
ИЗ
   Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация
ГДЕ
   ПользователиКонтактнаяИнформация.Ссылка.Наименование = "Вася"
   И ПользователиКонтактнаяИнформация.Ссылка.Предопределенный = ЛОЖЬ

то мы получим
39 m-serg74
 
14.07.12
14:17
думаю лажу, если в ТЧ нет ничего то ничего и не получим
40 izekia
 
14.07.12
14:17
в этом случае ок, надо попробовать ссылку на независимую таблицу
41 m-serg74
 
14.07.12
14:17
там не будет ни одной строки откуда можно б было взять .Ссылка
42 m-serg74
 
14.07.12
14:18
Справочник.Пользователи а к нему уж лев соед Справочник.Пользователи.КонтактнаяИнформация
43 izekia
 
14.07.12
14:20
да не все ок:
SELECT
T1._Fld424,
T1._Fld422RRef,
T2._Description
FROM _Reference49_VT420 T1 WITH(NOLOCK)
LEFT OUTER JOIN _Reference49 T2 WITH(NOLOCK)
ON T1._Reference49_IDRRef = T2._IDRRef
WHERE (T2._Description = P1) AND (T2._IsMetadata = @P2)
44 m-serg74
 
14.07.12
14:23
проверь на эл. спр. где ТЧ пустая и получешь нулевой результат
45 izekia
 
14.07.12
14:23
(44) а где лажа? так и должно быть
46 m-serg74
 
14.07.12
14:24
но... не в конкретном случае ТСа, но иногда вне зависимости от содержания ТЧ, бывает нужно вывести некие данные из ЭлСправочника
47 m-serg74
 
14.07.12
14:24
тогда (3)
48 m-serg74
 
14.07.12
14:30
например в (38) если конт. инф. у Васи не заполнена то нету и Васи, а он есть)
49 izekia
 
14.07.12
14:37
(48) и что? я тут не про обоснованность запроса, а просто думал как можно сломать механизм формирования, если сделать все без джойнов и пока не вижу такого
50 m-serg74
 
14.07.12
14:39
ничего. (46) и (36) первые 6 слов...
51 m-serg74
 
14.07.12
14:40
(49) и да: без джойнов это как если инфа в разных таблицах в БД лежит?
52 izekia
 
14.07.12
14:44
(51) с (13) почитай
я про джойны именно в этом контексте
53 m-serg74
 
14.07.12
14:46
я с (0) до конца читал и внимательно... а вот Вы наверное нет, я вроде все четко и ясно описал в каком случае и для чего...
54 izekia
 
14.07.12
14:55
(53) мне стало интересно какой запрос получится если добавить дополнительные детали и может ли нарушится внутренняя логика, вот и все, про то что Вы писали я понял и не спорил
55 m-serg74
 
14.07.12
14:56
я понял...
56 mirosh
 
14.07.12
15:55
ну что, что быстрее работает, уже потестили? а то я задумал проверить
57 mirosh
 
14.07.12
16:47
(27) (28)
итак, я провел тестирование на файловой базе при средних объемах данных и оказалось, что мой запрос (13) работает на 0,5 секунды быстрее, чем (3).

Подробности здесь:
v8: Сравние способов выбора в запросе табличной части объектов
58 izekia
 
14.07.12
17:51
(57) ураа