Имя: Пароль:
1C
1С v8
Добавить в запрос еще один отбор
0 Мисти
 
03.03.14
20:08
Запрос и отбор будут в тексте.
127 Мисти
 
09.03.14
22:47
Ну, я так и написала.
Вообще, конечно, ерунда у меня какая-то в запросе получается - по каждой группе номенклатуры по 3 строки, по каждой номенклатуре - по 2.
128 Torquader
 
09.03.14
22:48
(125) Чтобы иерархия была красивой, нужно группы из запроса исключить - иначе на группу будет две строки, что выглядит не айс.
129 Мисти
 
09.03.14
22:49
У меня мэйл-агент не установлен. во всяком случае, я им не пользуюсь.
130 Torquader
 
09.03.14
22:50
(127) Две вижу, а вот три - это кто-то явно перестарался.
Везде, где выбирается номенклатура вставь "И НЕ Номенклатура.ЭтоГруппа"
131 m-serg74
 
09.03.14
22:56
(127) итоги потому что еще в прошлой теме я же писал в топку нада
132 Мисти
 
09.03.14
23:00
Значит, моя идея, что сначала всё отобрать по справочнику была неправильной.
Давайте всё сначала!
133 Мисти
 
09.03.14
23:00
ВЫБРАТЬ
    |    СвободныеОстаткиОстатки.Номенклатура,
    |    СвободныеОстаткиОстатки.Склад,
    |    СвободныеОстаткиОстатки.ВНаличииОстаток,
    |    СвободныеОстаткиОстатки.ВРезервеОстаток,
    |    NULL КАК КОтгрузкеОстаток
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток,
    |    NULL,
    |    ТоварыНаСкладахОстатки.КОтгрузкеОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
134 NcSteel
 
09.03.14
23:02
Угадываю автора по теме.... Сразу понял кто автор, так как тема глупа ... ))) Это просто Света из Свет.
135 Мисти
 
09.03.14
23:04
Тогда только здесь, потом-то только отсюда вся номенклатура берется, разве нет?

    "ВЫБРАТЬ
    |    СПрНом.Ссылка КАК Номенклатура
    |ПОМЕСТИТЬ ВТ_СписокНом
    |ИЗ
    |    Справочник.Номенклатура КАК СПрНом
    |ГДЕ
    |    (&НоменклатураНеЗаполнена
    |            ИЛИ СПрНом.Ссылка В ИЕРАРХИИ (&ВыбТМЦ))
    |    И (НЕ &ВидНоменВыбран
    |            ИЛИ СПрНом.ВидНоменклатуры = &ВыбВидНомен И НЕ Номенклатура.ЭтоГруппа)
    |;";
136 Мисти
 
09.03.14
23:05
Где я теперь получу ВНаличииОстаток, если он мне нужен из регистра ТоварыНаСкладахОстатки?
137 NcSteel
 
09.03.14
23:08
Никогда! Запомните НИКОГДА не используйте в условиях ИЛИ.... по крайней мере два раза..... это рукалицо
138 Мисти
 
09.03.14
23:10
(137) Почему??
139 m-serg74
 
09.03.14
23:14
(138) просто прими на веру... НИКОГДА ... ДВА РАЗА... иначе это просто напрасно
140 Мисти
 
09.03.14
23:16
Не, ну мне так совсем непонятно. Должен же быть ответ!
141 Мисти
 
09.03.14
23:16
В книжке моей про это ничего нет.
142 m-serg74
 
09.03.14
23:17
ты сама пишешь книжку?
143 Torquader
 
09.03.14
23:17
ТекстЗапроса="ВЫБРАТЬ
|СпрНом.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ ВТ_СписокНом
|ИЗ
|Справочник.Номенклатура КАК СпрНом";
Если(НоменклатураЗаполнена)ИЛИ(ВыбранВидНоменклатуры)Тогда
ТекстЗапроса=ТекстЗапроса+"
|ГДЕ";
Если НоменклатураЗаполнена Тогда
  ТекстЗапроса=ТекстЗапроса+"
   |СпрНом.Ссылка В ИЕРАРХИИ (&ВыбТмц)";
  Зпр.УстановитьПараметр("ВыбТмц",СписокНоменклатуры);
КонецЕсли;
Если ВыбранВидНоменклатуры Тогда
  ТекстЗапроса=ТекстЗапроса+"
   |СпрНом.ВидНоменклатуры=&ЗаданныйВид";
  Зпр.УстановитьПараметр("ЗаданныйВид",ВидНоменклатуры);
КонецЕсли;
КонецЕсли;
144 NcSteel
 
09.03.14
23:19
(140)
Использование логического ИЛИ в секции ГДЕ запроса

Не следует использовать ИЛИ в секции ГДЕ запроса. Это может привести к тому, что СУБД не сможет использовать индексы таблиц и будет выполнять сканирование, что увеличит время работы запроса и вероянтность возникновения блокировок. Вместо этого следует разбить один запрос на несколько и объединить результаты.
Например, запрос

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

следует заменить на запрос

ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "001"
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Товары КАК Товар ГДЕ Артикул = "002"
145 Torquader
 
09.03.14
23:20
Конечно, так как мы это условие используем в нескольких местах, то лучше его "сложить" в отдельную переменную, которую потом просто вставлять в запрос, где нужно.
146 Мисти
 
09.03.14
23:20
Ну, я раньше ьак всегда делала!
Хочу от этого отучиться, потому что быстрее же работает, если условия внутри регистра, например, задавать, а не потом - "где".
147 Torquader
 
09.03.14
23:21
(144) У неё там ИЛИ используется для того, чтобы выключать условие, которое она собирает до исполнения запроса. То есть, если всё написать стандартно - или просто не будет.
148 Мисти
 
09.03.14
23:21
(144) Ух ты! Спасибо! Выучу.
149 NcSteel
 
09.03.14
23:21
(146) Надо знать структуру таблиц и понимать, почему быстрее , а почему нет .... И далеко не всегда использовать параметры виртуальных таблиц работает быстрее
150 Мисти
 
09.03.14
23:24
А когда нет? Вот, например, условие по складу для регистра свободных остатков?
151 m-serg74
 
09.03.14
23:24
(148) я еще в прошлой теме написал - посмотри сообщения про "все должно руководствоваться головой" в каждом случае надо думать
152 m-serg74
 
09.03.14
23:25
(150) как минимум вместе [условие по складу] это сделать параметром виртуальной таблицы
153 Мисти
 
09.03.14
23:26
(143) Мы же решили начать с регистров!
154 Torquader
 
09.03.14
23:26
(150) А что там в условии ?
Если склад не задан, то просто его не указываем, если склад задан только один, то проверка на равно, если их несколько, тогда в списке.
И количество складов известно на момент формирования текста запроса, поэтому, на момент исполнения запроса известно, что там будет.
155 Torquader
 
09.03.14
23:27
(153) Я тебе показываю, что условие можно добавить в любое место запроса без всяких танцев с ИЛИ.
156 Мисти
 
09.03.14
23:27
Ну да, либо склад выбран, либо по всем - его быстрее в условии регистра или "Где"?
157 m-serg74
 
09.03.14
23:27
(152) вместе ... вместо
158 Мисти
 
09.03.14
23:28
(157) Так понятнее.
159 Мисти
 
09.03.14
23:28
У меня в запросе получается половина строк с единицей и артикулом, а половина - без. Ну, т.е. одна какая-то лишняя явно.
160 Torquader
 
09.03.14
23:29
(156) Так что мешает дописать его в текст запроса после ГДЕ по условию, а не городить что-то другое.
161 m-serg74
 
09.03.14
23:29
(159) соединение такое соединение
162 Мисти
 
09.03.14
23:29
Короче, кто мне наконец, уже более-менее всё это перепишет?
А я потом прикручу к этому цены - САМА!
163 Torquader
 
09.03.14
23:29
(159) Обход результата запроса с группировками нужно смотреть - вы там группировали по ИЕРАРХИИ (итоги строили), а потом обходите всё линейно.
164 m-serg74
 
09.03.14
23:30
(162) - (124)
165 Мисти
 
09.03.14
23:30
Я обхожу по группировкам.
166 Torquader
 
09.03.14
23:36
Пусть у нас СписокНоменклатуры - наш список номенклатуры, в котором она должна быть.
ВидНоменклатуры - наш вид номенклатуры, который пользователь может выбрать.

Тогда сначала формируем условие.

УсловиеЗапроса="";
Если СписокНоменклатуры.Количество()>0 Тогда
УсловиеЗапроса=УсловиеЗапроса+"
  |СпрНом.Ссылка В ИЕРАРХИИ(&ПарамСписокНоменклатуры)";
Зпр.УстановитьПараметр("ПарамСписокНоменклатуры",СписокНоменклатуры);
КонецЕсли;
Если ЗначениеЗаполнено(ВидНоменклатуры)Тогда
УсловиеЗапроса=УсловиеЗапроса+"
  |СпрНом.ВидНоменклатуры=ПарамВидНоменклатуры";
Зпр.УстановитьПараметр("ПарамВидНоменклатуры",ВидНоменклатуры);
КонецЕсли;

Далее, это можно вставить в запрос.
167 Torquader
 
09.03.14
23:39
ТекстЗапроса="
    |ВЫБРАТЬ
    |    СвободныеОстаткиОстатки.Номенклатура,
    |    СвободныеОстаткиОстатки.Склад,
    |    СвободныеОстаткиОстатки.ВНаличииОстаток,
    |    СвободныеОстаткиОстатки.ВРезервеОстаток,
    |    NULL КАК КОтгрузкеОстаток
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки";
Если УсловиеЗапроса<>"" Тогда
ТекстЗапроса=ТекстЗапроса+"
    |ГДЕ
    |"+УсловиеЗапроса;
КонецЕсли;
ТекстЗапроса=ТекстЗапроса+"
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток,
    |    NULL,
    |    ТоварыНаСкладахОстатки.КОтгрузкеОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";
Если УсловиеЗапроса<>"" Тогда
ТекстЗапроса=ТекстЗапроса+"
    |ГДЕ
    |"+УсловиеЗапроса;
КонецЕсли;

в общем, где-то так.
168 Torquader
 
09.03.14
23:42
С условием, кстати, я фигню написал - там ИЛИ нужно вставлять.
То есть так:

УсловиеЗапроса="";
Если СписокНоменклатуры.Количество()>0 Тогда
УсловиеЗапроса="СпрНом.Ссылка В ИЕРАРХИИ(&ПарамСписокНоменклатуры)";
Зпр.УстановитьПараметр("ПарамСписокНоменклатуры",СписокНоменклатуры);
КонецЕсли;
Если ЗначениеЗаполнено(ВидНоменклатуры)Тогда
Если УсловиеЗапроса<>"" Тогда
  УсловиеЗапроса="("+УсловиеЗапроса+")И(СпрНом.ВидНоменклатуры=ПарамВидНоменклатуры)";
Иначе
  УсловиеЗапроса="СпрНом.ВидНоменклатуры=ПарамВидНоменклатуры";
КонецЕсли;
Зпр.УстановитьПараметр("ПарамВидНоменклатуры",ВидНоменклатуры);
КонецЕсли;
169 Torquader
 
09.03.14
23:47
Ой, и ещё Null заменить на 0, так как Null в запросе просто никому не нужен.

Ну и сгруппировать нужно результат по выбранным полям с суммой, особенно, если склад не указан - иначе будет куча строк для одной и той же номенклатуры.
170 Torquader
 
09.03.14
23:49
В общем, если немного посидеть, то можно и дописать.
171 Мисти
 
10.03.14
12:49
Надо максимум ограничений прямо в регистре указать, а не "где", за это меня уже пороли!
Или это мало влияет на скорость?
172 Мисти
 
10.03.14
12:51
И чем плохо - сначала отобрать список номенклатуры (как я собиралась), а потом по нему рассчитывать остатки? (там еще и цены потом)
Или вот так - (как сначала было)

  "ВЫБРАТЬ
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.Склад, ТоварыНаСкладахОстатки.Склад) КАК Склад,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.Номенклатура.ВидНоменклатуры, ТоварыНаСкладахОстатки.Номенклатура.ВидНоменклатуры) КАК ВидНоменклатуры,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК ВРезерве,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК ВНаличии,
    |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ПолныйОстаток,
    |    СвободныеОстаткиОстатки.Номенклатура.ВидНоменклатуры КАК ВидНомен
    |ПОМЕСТИТЬ ВТ_СвободныеОстатки
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки(
    |            &НаДату,
    |            ВЫБОР
    |                    КОГДА &СкладВыбран
    |                        ТОГДА Склад = &ВыбСклад
    |                    ИНАЧЕ ИСТИНА
    |                КОНЕЦ
    |                И ВЫБОР
    |                    КОГДА &ВыбТМЦВыбран
    |                        ТОГДА Номенклатура В ИЕРАРХИИ (&ВыбТМЦ)
    |                    ИНАЧЕ ИСТИНА
    |                КОНЕЦ
    |                И ВЫБОР
    |                    КОГДА &ВидНоменВыбран
    |                        ТОГДА Номенклатура.ВидНоменклатуры = &ВыбВидНомен
    |                    ИНАЧЕ ИСТИНА
    |                КОНЕЦ {(Номенклатура)}) КАК СвободныеОстаткиОстатки
173 Мисти
 
10.03.14
12:52
Про полное соединение - это мне тут кто-то написал в прошлый раз.
Я так и не поняла, чем его заменить (как это будет выглядеть)
174 Torquader
 
10.03.14
14:16
(173) Полное соединение иногда интересно, но не в данном случае. Вы выбираете остатки из одного регистра и резервы - из другого, поэтому, логичнее отбирать сначала один, а потом другой (то есть объединение), а соединение в данном случае выглядит не очень понятно.
Кстати, можно посмотреть в любой типовой как делается любая выборка из нескольких регистров.

Кроме того, если у вас будут цены, то нужно предполагать, что на складе будут одинаковые товары с разными ценами (если, конечно, не розничная торговля).

Сначала отобрать список номенклатуры можно только тогда, когда есть доп-условия (по дополнительным свойствам) - так как соединение с основным запросом выглядит не очень красиво.

Если же условия на значения номенклатуры, то можно делать соединения сразу в отборе по регистру (однако, это всё равно будет обращение к таблице Номенклатура).

Хотя, если вы хотите получить все товары, которые удовлетворяют отбору вне зависимости от остатков, то вполне допустимо сначала просто их отобрать, так как всё равно от выборки по всем товарам не уйти, но в этом случае, количество товаров не должно быть большим.
Самое главное, что при выборе регистров всё равно будет делаться соединение с этой виртуальной таблицей товаров, и, если в ней товаров не сильно меньше, чем в самой таблице товаров, то вы потеряете время на формирование временной таблицы.
Можно не делать соединение с таблицей регистра и выбрать сначала остатки всех товаров, но, если большую часть этой выборки мы потом отбросим, то не за чем напрягать сервер.
175 Мисти
 
10.03.14
16:04
Цена нужна только какая-то одна. Если нет цены - то и не надо, пусть будут только остатки.
Тогда надо писать 4 разных запроса - с ценой один (у меня не получилось объединить), по всей номенклатуре - другой, по номенклатуре с отбором - третий, а с отбором по доп. реквизитам - четвертый.
176 Torquader
 
10.03.14
16:33
(175) Наконец-то, кто-то понял, что одним запросом несколько зайцев убить не получится.
177 Мисти
 
10.03.14
17:14
Да у меня и так их 2! Это как раз мой метод.
178 Мисти
 
10.03.14
17:14
Так что делать, если для всего справочника номенклатуры?
179 Мисти
 
10.03.14
17:19
Мне еще с иерархией надо разобраться!
И можно ли обойтись без итогов, если я потом делаю обход по группировкам?
180 Torquader
 
10.03.14
17:20
(178) Если для всего справочника, то "левое соединение" с двумя регистрами и выбор значений.
Номенклатура ЛевоеСоединение Рег1 По Ном.Ссылка=Рег1.Ном ЛевоеСоединение Рег2 По Ном.Ссылка=Рег2.Ном
181 Torquader
 
10.03.14
17:21
(179) Если хочется итоги по группам, то без итогов не обойтись - иначе группы будут, а итоги - нет.
182 Мисти
 
10.03.14
17:40
Пока надо решить основную проблему.
У меня написано в конце -
    |УПОРЯДОЧИТЬ ПО
    |    Артикул
    |ИТОГИ
    |    СУММА(ВРезерве),
    |    СУММА(ВНаличии),
    |    СУММА(ПолныйОстаток)
    |ПО
    |    Склад,
    |    Номенклатура ИЕРАРХИЯ
    |АВТОУПОРЯДОЧИВАНИЕ"; //


В итоге у меня всё упорядочивается по артикулу, товары попадают в свою группу, но группы идут не в том порядке, в котором в справочнике!
И что там у меня еще было ужасно? Спр.Группа убрала, задваивания строк нет! Это я не сообразила - первая строка идет по складу, вторая - по номенклатуре.
183 Torquader
 
10.03.14
18:04
Зачем нужно упорядочивание по артикулу ?
Или это заказчики хотели ?
Просто, в случае иерархии по номенклатуре это будет выглядеть очень странно.
184 Мисти
 
10.03.14
18:19
Да, они хотят, чтоб порядок групп - как в справочнике, а в группе - по артикулу.
Сейчас проверю - если убрать по артикулу и оставить автоупорядочивание (а это что?) - может, так и получится?
185 Мисти
 
10.03.14
18:34
Не-а, группы встали на место, а внутри группы - не по артикулу.
186 Мисти
 
10.03.14
18:37
По умолчанию, если открыть справочник номенклатуры - там тоже не по артикулу.
Я могу предложить только такой дурацкий способ - по группам выгружать в таблицу там сортировать, и выводить.
187 Torquader
 
10.03.14
19:02
Смотри - когда ты включаешь упорядочивание по артикулу - все товары в запросе выбираются по артикулу, а группы достраиваются после попадания товара в отчёт, то есть до появления товара группа никак не может попасть в запрос.
188 GANR
 
10.03.14
19:03
(0) Неужели не проще сделать за 2-3 недели то, что я рекомендовал, а не плодить в течение нескольких месяцев вопросы про один и тот же запрос??? Обучающий курс, про который я говорил, проходят даже люди, которым за 60 http://sql-ex.ru/users_page.php?uid=10332 - и ничего.
189 Мисти
 
10.03.14
19:06
Давай курс! Я уже почти созрела.
190 Мисти
 
10.03.14
19:07
(187) Это странно звучит, как будто речь о переборе.
Оно же всё одновременно появляется в запросе!
Если нет нормального пути - сделаю через таблицу.
191 Torquader
 
10.03.14
19:09
(190) Автоупорядочивание - в твоём случае, упорядочивание по наименованию справочника, но вы ему сказали по артикулу.
Можно попробовать добавить в запрос родителя номенклатуры, упорядочить сначала по нему (то есть по его имени), а потом уже по артикулу (будет для тех, у кого родитель совпал).
192 Мисти
 
10.03.14
19:16
Мне нравятся твои советы! У меня возникает вопрос - "почему я сама до этого не додумалась?", а не - "что этоо??"
193 Мисти
 
10.03.14
19:17
А зачем тогда нужна галка "автоупорядочивание", если и без нее всё так же упорядочивается?
194 Torquader
 
10.03.14
19:21
В системе результат запроса упорядочивается по внутреннему ID, который не очень понятен, если же сказано "автоупорядочивание", то это говорит машине, что пользователь хочет видеть упорядоченный результат так, как он показывается в списке.
Однако, автоупорядочивание работает уже после команды "упорядочить по", и в вашем случае "упорядочить ПО артикул" перекрывает автоупорядочивание, которое проявится только тогда, когда совпадут артикулы.
195 Torquader
 
10.03.14
19:23
(192) Если кто-то не хочет думать, это значит, что он на что-то отвлекается.
А вообще, можно почитать любую инструкцию по настоящему SQL, чтобы понять, как он работает - в 1С пытались сделать тоже самое, но на русском языке.
P.S. я видел женщину твоего возраста, которая на ура с Oracle работала, так что ничего невозможного нет.
196 Мисти
 
10.03.14
19:29
Да дело не в возрасте.
Ума у меня, и правда, маловато. Точнее, нет объемного воображения, чтоб с таблицами работать.
197 Мисти
 
10.03.14
19:33
Очень интересно! Группы построились правильно, а номенклатура - в обратном порядке.
198 Мисти
 
10.03.14
19:49
Усё. Получилось.
199 rphosts
 
10.03.14
20:12
не прошло и 2 недель...
200 Мисти
 
10.03.14
20:26
Бред какой-то! На меленькой группе (внутри еще один уровень подгрупп) - всё красиво, а на большой (внутри - 2 уровня подгрупп) - всё наоборот - подгруппы в неизвестно каком порядке и иерархия в обратную сторону.
201 Torquader
 
10.03.14
20:32
(200) Сортировка по родителям была в каком порядке ?
И по чему они упорядочены при выводе в списке ?
202 Мисти
 
10.03.14
20:36
Я не стала править то, что как бы и работает пока. Хоть бы добиться вида нужного.
    ТекстЗапроса =     
    "ВЫБРАТЬ
    |    СПрНом.Ссылка КАК Номенклатура
    |ПОМЕСТИТЬ ВТ_СписокНом
    |ИЗ
    |    Справочник.Номенклатура КАК СПрНом
    |ГДЕ
    |    (&НоменклатураНеЗаполнена
    |            ИЛИ СПрНом.Ссылка В ИЕРАРХИИ (&ВыбТМЦ))
    |    И (НЕ &ВидНоменВыбран
    |            ИЛИ СПрНом.ВидНоменклатуры = &ВыбВидНомен )И НЕ СПрНом.ЭтоГруппа
    |;";        
    Если Не ВыбПрограмма.Пустая() Тогда
        ТекстЗапроса = ТекстЗапроса+
        " /////////////////////////////////////
        |    ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Ссылка Как Номенклатура
        |ПОМЕСТИТЬ ВТ_СписокНом2
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Ссылка В (ВЫБРАТЬ ВТ_СписокНом.Номенклатура ИЗ ВТ_СписокНом)
        |    И НоменклатураДополнительныеРеквизиты.Значение = &ВыбПрограмма
        |;";        
    Иначе
        ТекстЗапроса = ТекстЗапроса+
        " /////////////////////////////////////
        |    ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Ссылка Как Номенклатура
        |ПОМЕСТИТЬ ВТ_СписокНом2
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Ссылка В (ВЫБРАТЬ ВТ_СписокНом.Номенклатура ИЗ ВТ_СписокНом)
        |    И НоменклатураДополнительныеРеквизиты.Значение = &ВыбПрограмма
        |;";        
    КонецЕсли;    
    ТекстЗапроса = ТекстЗапроса+
    
    "ВЫБРАТЬ
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.Склад, ТоварыНаСкладахОстатки.Склад) КАК Склад,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК ВРезерве,
    |    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК ВНаличии,
    |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ПолныйОстаток
    |ПОМЕСТИТЬ ВТ_СвободныеОстатки
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки(
    |            &НаДату,
    |            ВЫБОР
    |                    КОГДА &СкладВыбран
    |                        ТОГДА Склад = &ВыбСклад
    |                    ИНАЧЕ ИСТИНА
    |                КОНЕЦ
    |                И ВЫБОР
    |                    КОГДА НЕ &ВыбПрограммаВыбран
    |                        ТОГДА Номенклатура В
    |                                (ВЫБРАТЬ
    |                                    ВТ_СписокНом.Номенклатура
    |                                ИЗ
    |                                    ВТ_СписокНом)
    |                    ИНАЧЕ Номенклатура В
    |                            (ВЫБРАТЬ
    |                                ВТ_СписокНом2.Номенклатура
    |                            ИЗ
    |                                ВТ_СписокНом2)
    |                КОНЕЦ {(Номенклатура)}) КАК СвободныеОстаткиОстатки
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
    |                &НаДату,
    |                ВЫБОР
    |                        КОГДА &СкладВыбран
    |                            ТОГДА Склад = &ВыбСклад
    |                        ИНАЧЕ ИСТИНА
    |                    КОНЕЦ
    |                    И ВЫБОР
    |                        КОГДА &ВыбПрограммаВЫбран
    |                            ТОГДА Номенклатура В
    |                                    (ВЫБРАТЬ
    |                                        ВТ_СписокНом2.Номенклатура
    |                                    ИЗ
    |                                        ВТ_СписокНом2)
    |                        ИНАЧЕ Номенклатура В
    |                                (ВЫБРАТЬ
    |                                    ВТ_СписокНом.Номенклатура
    |                                ИЗ
    |                                    ВТ_СписокНом)
    |                    КОНЕЦ {(Номенклатура)}) КАК ТоварыНаСкладахОстатки
    |        ПО СвободныеОстаткиОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
    |            И СвободныеОстаткиОстатки.Склад = ТоварыНаСкладахОстатки.Склад
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    СПрНом.Ссылка КАК Номенклатура,
    |    ЕСТЬNULL(СвободныеОстатки.Склад, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Склад,
    |    ЕСТЬNULL(СвободныеОстатки.ВРезерве, 0) КАК ВРезерве,
    |    ЕСТЬNULL(СвободныеОстатки.ВНаличии, 0) КАК ВНаличии,
    |    ЕСТЬNULL(СвободныеОстатки.ПолныйОстаток, 0) КАК ПолныйОстаток,
    |    ПРЕДСТАВЛЕНИЕ(СвободныеОстатки.Номенклатура.ЕдиницаИзмерения) КАК ТовЕд,
    |    СвободныеОстатки.Номенклатура.Артикул КАК Артикул,
    |    СвободныеОстатки.Номенклатура.ЭтоГруппа,
    |    СПрНом.Код,
    |    СПрНом.Родитель КАК Родитель
    |ИЗ
    |    Справочник.Номенклатура КАК СПрНом
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СвободныеОстатки КАК СвободныеОстатки
    |        ПО СПрНом.Ссылка = СвободныеОстатки.Номенклатура
    |ГДЕ
    |    (НЕ &ВыбПрограммаВЫбран
    |                И СПрНом.Ссылка В
    |                    (ВЫБРАТЬ
    |                        ВТ_СписокНом.Номенклатура
    |                    ИЗ
    |                        ВТ_СписокНом)
    |            ИЛИ &ВыбПрограммаВЫбран
    |                И СПрНом.Ссылка В
    |                    (ВЫБРАТЬ
    |                        ВТ_СписокНом2.Номенклатура
    |                    ИЗ
    |                        ВТ_СписокНом2))
    |
    |УПОРЯДОЧИТЬ ПО
    |    Родитель,
    |    Артикул
    |ИТОГИ
    |    СУММА(ВРезерве),
    |    СУММА(ВНаличии),
    |    СУММА(ПолныйОстаток)
    |ПО
    |    Склад,
    |    Номенклатура ИЕРАРХИЯ";
203 Мисти
 
10.03.14
20:37
Смотрю в отладчике результат запроса - там так и есть, первая группа упорядочена по артикулу по возрастанию, а остальные - по убыванию.
Терроризм какой-то.
204 GANR
 
10.03.14
21:04
(189) А чего его давать? Регистрируемся на ресурсе из (188), решаем 63 упражнения (1-й сертификат) на рейтинговом этапе и такие вопросы отпадают.
205 Torquader
 
10.03.14
21:12
(202) А почему Артикул выбирается из СвободныхОстатков - что там будет, когда остатков нет - Null и что с этим делать ?
206 Мисти
 
10.03.14
21:25
(205) чушь какая. Это кто так написал???
207 Torquader
 
10.03.14
21:29
(206) И ЭтоГруппа оттуда же.
Кто написал, по-мойму, это очевидно - и ему должно быть стыдно и обидно.
208 Мисти
 
10.03.14
22:54
Теперь по артикулу всё идет правильно, а группы - еще в запросе стоят не в том порядке, не по алфавиту.
Хотя уже написала - сортировать по наименованию родителя.
    |    СПрНом.Код,
    |    СПрНом.ЭтоГруппа,
    |    СПрНом.Артикул КАК Артикул,
    |    СПрНом.Родитель.Наименование КАК РодительНаименование
    |ИЗ
    |    Справочник.Номенклатура КАК СПрНом
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СвободныеОстатки КАК СвободныеОстатки
    |        ПО СПрНом.Ссылка = СвободныеОстатки.Номенклатура
    |ГДЕ
    |    ((НЕ &ВыбПрограммаВЫбран
    |                И СПрНом.Ссылка В
    |                    (ВЫБРАТЬ
    |                        ВТ_СписокНом.Номенклатура
    |                    ИЗ
    |                        ВТ_СписокНом)
    |            ИЛИ &ВыбПрограммаВЫбран
    |                И СПрНом.Ссылка В
    |                    (ВЫБРАТЬ
    |                        ВТ_СписокНом2.Номенклатура
    |                    ИЗ
    |                        ВТ_СписокНом2))и не Спрном.ЭтоГруппа)
    |
    |УПОРЯДОЧИТЬ ПО
    |    РодительНаименование,
    |    Артикул
    |ИТОГИ
    |    СУММА(ВРезерве),
    |    СУММА(ВНаличии),
    |    СУММА(ПолныйОстаток)
    |ПО
    |    Склад,
    |    Номенклатура ИЕРАРХИЯ"; //
    Возврат(ТекстЗапроса);
209 Мисти
 
10.03.14
22:58
(204) Так это не совсем чтоб 1С!
И вообще, я привыкла на русском писать.
Мне бы такой же - но прямо чтоб 1С.
210 Torquader
 
10.03.14
23:34
СпрНом.ЭтоГруппа при выборе вам зачем ?
Собственно, как и код.

Если и так не получилось, то выбирай номенклатуру в отдельную таблицу, как в иерархии, а потом из этой таблицы выбирай только элементы.
211 Мисти
 
10.03.14
23:54
Так элементы нормально! У меня группы набекрень.
212 Мисти
 
10.03.14
23:55
Код = чтоб в таблице посмотреть в отладчике.
А он мешает?
213 vicof
 
11.03.14
00:29
(210) удивляюсь вашему хладнокровию и педагогическим способностям.
214 Torquader
 
11.03.14
01:27
(213) Вы никогда не пробовали приучать котёнка к сортиру - вот там терпения нужно на целый день, так как эти животные не могут продумывать своих действий.
А в данном случае - человек - и даже что-то пытается сделать.
И, вполне вероятно, что даже сделает.

(211) Попробуй сначала выбрать справочник с группами (во временную таблицу), а потом группы убрать.
(И это можно делать на тестовом запросе без соединения с регистром - чтобы быстрее выполнялось).
215 Мисти
 
11.03.14
01:36
(214) Спасибо за помощь, но я не поняла, как это.
А кошки, кстати, сами понимают про сортир всё, во всяком случае, котята - точно. Вот щенки совсем не сразу.
216 vicof
 
11.03.14
02:41
(214) я кошку за один день приучил, просто отнес в туалет и все) сама все поняла. Но человека заставить сделать самому-просто отнести,положить,показать,разжевать мало. Пока у Мисти не появится внутренняя мотивация-так и будет сидеть и тупить. Человеке животное ленивое.
217 Torquader
 
11.03.14
09:01
В общем, в умной книжке написано, что для получения правильной иерархии нужно выбирать с группами, а в упорядочивании писать СпрНом.Ссылка ИЕРАРХИЯ.
Соответственно, группы можно будет потом "выкинуть" при получении результата запроса.
218 Мисти
 
11.03.14
09:14
Ого! Говорит - "Нельзя использовать иерархическую сортировку в запросе с итогами.
219 Wobland
 
11.03.14
09:17
не хочу читать двести постов. вижу желание группировки в (208), сформулированное странным образом
220 Мисти
 
11.03.14
10:36
А что там странного?
Там же соединение с остатками!
|ИЗ
    |    Справочник.Номенклатура КАК СПрНом
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СвободныеОстатки КАК СвободныеОстатки
221 Torquader
 
11.03.14
10:44
(219) Она хочет "интересную" группировку и итоги по группам - что тут такого странного (разве что желание внутри группы отсортировать по артикулу).
222 Wobland
 
11.03.14
10:48
(221) она знает, что ЭТОГИ дадут ей дерево?
223 Мисти
 
11.03.14
10:49
Да, потом обход по группировкам - по складу и по номенклатуре.
224 Torquader
 
11.03.14
12:15
(222) Они ей уже дали дерево, только ветки на этом дереве в другую сторону смотрят.
225 Torquader
 
11.03.14
12:16
На самом деле - задача не совсем тривиальная - получить дерево, как оно выглядит в справочнике да ещё и с итогами по ветвям.
226 GANR
 
11.03.14
16:17
(209) Не важно какой язык - суть в том, чтобы развить пространственное воображение, нужное при написании запросов.
Программист всегда исправляет последнюю ошибку.