Имя: Пароль:
1C
1С v8
Запрос в 1с по остаткам - баг или фича?
,
0 wasa
 
26.10.21
11:13
Создаем запрос типа:

ВЫБРАТЬ
    ТоварыНаСкладахОстатки1.СерияНоменклатуры КАК СерияНоменклатуры,
    ТоварыНаСкладахОстатки1.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки1.КоличествоОстаток КАК КоличествоОстаток,
    ТоварыНаСкладахОстатки1.Склад КАК Склад
//ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки1
ГДЕ
    ТоварыНаСкладахОстатки1.КоличествоОстаток < 0

Он возвращает, допустим, 400 позиций товаров, где есть отрицательные остатки по приведенным аналитикам. Теперь, в теле этого запроса делаем так:

ВЫБРАТЬ
    ТоварыНаСкладахОстатки1.СерияНоменклатуры КАК СерияНоменклатуры,
    ТоварыНаСкладахОстатки1.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки1.КоличествоОстаток КАК КоличествоОстаток,
    ТоварыНаСкладахОстатки1.Склад КАК Склад
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки1
ГДЕ
    ТоварыНаСкладахОстатки1.КоличествоОстаток < 0
;

Выбрать РАЗЛИЧНЫЕ ВТ.Номенклатура ИЗ ВТ

По идее результатом должен быть список из тех самых 400 +- позиций, по которым были остатки с минусом. Но - нет ) Результат всего четыре позиции, по которым остатки ТОЛЬКО по аналитике номенклатура суммарно - меньше нуля.  Где порылась собака? Мне в скиллбокс за новыми знаниями?
1 ДенисЧ
 
26.10.21
11:16
Начни от
Выбрать РАЗЛИЧНЫЕ ВТ.Номенклатура ИЗ ВТ
2 wasa
 
26.10.21
11:17
(1) Никакой разницы.
3 Галахад
 
гуру
26.10.21
11:22
400 позиций или 400 строк?
4 arsik
 
гуру
26.10.21
11:22
(0) Интересный случай. У вас волчанка.
5 Мультук
 
гуру
26.10.21
11:23
(0)

СКД ?
6 arsik
 
гуру
26.10.21
11:23
(0) СКД или просто запрос?
7 acht
 
26.10.21
11:24
(0) > Он возвращает, допустим, 400 позиций товаров, где есть отрицательные остатки по приведенным аналитикам.

Он возвращает, допустим, 400 позиций товаров, где есть отрицательные остатки по любым аналитикам.
8 wasa
 
26.10.21
11:27
Запрос В СКД и консоли запросов дает такой результат. Думаю, что в обычном запросе получу правильные данные. Но вопрос остается - что делает СКД?
9 Мультук
 
гуру
26.10.21
11:30
(8)
>>Запрос В СКД и консоли запросов дает такой результат

Не нужно путать консоль запросов и консоль СКД.

>>Но вопрос остается - что делает СКД?

Упрощает тебе жизнь. Что же еще?
Раньше она не пыталась "оптимизировать" временные таблицы, а теперь видать - научилась. Но это не точно(c)
10 wasa
 
26.10.21
11:31
(3) Пусть будет 400 различных товаров. Не суть. Суть в том, что 2-й вариант запроса возвращает ТОЛЬКО товары, по которым минуса СУММАРНО до номенклатуры.
11 Ivanich
 
26.10.21
11:32
А что вернёт
Выбрать ВТ.Номенклатура ИЗ ВТ
12 Dmitrii
 
гуру
26.10.21
11:34
(8) >> что делает СКД?

СКД выкидывает из запроса, те поля которые не используются в конечном запросе и не помечены как обязательные (можно поставить флажок в свойствах поля СКД).
Чтобы убедиться - посмотри запрос, который строится к БД. Некоторые конструкторы (включая типовой) это позволяют.
Но, как сказано в (9), это не точно.
13 youalex
 
26.10.21
11:34
вместо гадания по стеклянному шару давно бы посмотрел в тех же ИР какой запрос формирует СКД.
14 youalex
 
26.10.21
11:36
Скорее всего тупо выкидывает из вирт. таблицы поля, которые дальше не используются
15 acht
 
26.10.21
11:53
(10) > 2-й вариант запроса возвращает ТОЛЬКО товары, по которым минуса СУММАРНО до номенклатуры.

Ну так ты же сам заказываешь различные значения одной колонки и потом удивляешься.

Товар1     Серия1    -1
Товар1     Серия2    -2

Что ожидается?
16 wasa
 
26.10.21
11:59
Этот запрос я формировал в стандартной консоли отчетов 1С
База: Комплексная автоматизация, редакция 1.1 (1.1.67.1)
Платформа: 1С:Предприятие 8.3 (8.3.11.2899)

Еще раз: Суть в том что при выборке из виртуальной таблицы, и стандартная обработка "КОнсоль запросов" И Отчет на СКД ведут себя одинаково, а именно - при выборке из виртуальной таблицы неявно агрегируют данные там, где их не просили.

ДОПУСТИМ У вас есть 100 товаров с отрицательными остатками в разрезе серий. Но если они "компенсируются" положительными по другим сериям - результат запроса будет пустота.
Серии, или склады, или вообще неважно что.

Изначальный вопрос был в том, чтобы выбрать предварительно список товаров имеющих проблемы и построить по ним отчет по остаткам. В рамках одного запроса.

Что нужно указать в тексте запроса, чтобы обойти эту лишнюю операцию агрегирования?
17 wasa
 
26.10.21
12:00
Да, вопрос чисто академический. Конечно я понимаю как обойти это программно и не морочить голову.
18 acht
 
26.10.21
12:05
(16) > список товаров имеющих проблемы
Ты его и получаешь.

X товаров умножить на Y серий = 400 записей об отрицательных остатов по комбинации товар+серия

Ты честно получил свой X. Чего ты хочешь еще?
Хочешь комбинаций товар+серия, так напиши "выбрать разлчиные товар, серия из ..."
19 acht
 
26.10.21
12:06
- У вас вопрос, или вы не знаете как работает бухгалтерия?
- У меня вопрос. Как работает бухгалтерия?
20 Garykom
 
гуру
26.10.21
12:11
(17) У тебя непонимание какое то в (0)

И в (1) тебе правильно ответили!
21 Dmitrii
 
гуру
26.10.21
12:35
(18) >> Ты его и получаешь.

Не получает он его. В этом и проблема. Я бы тоже ждал на выходе список проблемных номенклатур, а не данных просуммированных по одному лишь измерению.

Имеем

Товар1 Серия1 -1
Товар1 Серия2  1


По идее после выполнения первого запроса должно быть.

Товар1 Серия1 -1


После помещения этого результата в ВТ и выборки из ВТ должно остаться.

Товар 1


А вместо этого уже при выполнении первого запроса система получила данные только в разрезе номенклатур и не найдя там отрицательных остатков получила пустую таблицу ВТ.
Для меня такое поведение тоже является несколько неожиданным. Первый то запрос у меня в разрезе серий специально сделан, чтобы остатки увидеть в их разрезе.
22 timurhv
 
26.10.21
12:36
23 acht
 
26.10.21
12:41
(21) > По идее после выполнения первого запроса должно быть
Товар1 Серия1 -1

Эт почему?
24 acht
 
26.10.21
12:42
А, там единица, Ну да
25 Kesim
 
26.10.21
12:43
(21) вроде всегда так было
26 Garykom
 
гуру
26.10.21
12:57
(16) Убрать ВТ и сделать Группировку на Номенклатуру
https://infostart.ru/1c/articles/125988/
27 ptiz
 
26.10.21
13:22
(0) Это фича СКД. В обычной консоли запросов всё нормально.
28 pechkin
 
26.10.21
13:29
автозаполнение отключай
29 Classic
 
26.10.21
13:41
(0)
В первом же посте ответили.

УБЕРИ РАЗЛИЧНЫЕ!!!!!
30 wasa
 
26.10.21
13:59
Извините, кому не отвечу, в основном ответы неверны.

Еще раз: Имеем
Товар 1  - сумма остатка -1
Серия1 - 10
Серия2 - -11
Товар 2 - сумма остатка 0
Серия1 - -1
Серия2 - 1
Товар2 - сумма остатка - +1
Серия1 - -5
Серия2 - 6
Кроме них, в регистре имеем еще 97 товаров с разными сериями, в которых остатки в разрезе товара или серий - положительные, нам они не нужны

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

Запрос из (0) ИЗ КОНСОЛИ ЗАПРОСОВ ИЛИ СКД вернет ОДНУ позицию, Товар1
Этот же запрос в чистом виде вернет ТРИ товара. Товар1, Товар2, Товар3
31 wasa
 
26.10.21
14:04
(27) Извини, ты проверил? Я то как раз удивился тому, что в моей консоли возвращает неправильно.
32 wasa
 
26.10.21
14:08
(27) Спасибо. Интересно, эта фича как то документируется 1с? )
33 timurhv
 
26.10.21
14:09
(30)
>Запрос из (0) ИЗ КОНСОЛИ ЗАПРОСОВ ИЛИ СКД вернет ОДНУ позицию, Товар1
>Этот же запрос в чистом виде вернет ТРИ товара. Товар1, Товар2, Товар3

Что за консоль такая? Я бы выкинул\переименовал ее.
34 wasa
 
26.10.21
14:14
(33) Стандартная, из конфы Комплексная автоматизация, редакция 1.1 (1.1.67.1)
35 wasa
 
26.10.21
14:41
Проверил запрос на конфе 1С:Комплексная автоматизация 2 (2.4.13.209) в консоли отчетов. Работает правильно, результат из описанного выше примера - три записи.
Резюме: В СКД есть баг, который агрегирует то, что его не просили. Отсюда и ошибка.
В конкретной моей консоли запросов - тот же баг, скорее всего она построена также на скд.
На это тему наверное можно закрыть.
36 Garykom
 
гуру
26.10.21
14:46
(35) Это не баг это фича с оптимизацией запросов
Убирает неиспользуемые поля из всех запросов, перед тем как отправить на выполнение движку/серверу
37 Garykom
 
гуру
26.10.21
14:51
(36)+ Абсолютно такая же что и в динамических списках, где даже изобрели галочку "Использовать всегда"
38 wasa
 
26.10.21
15:10
(36) Да, соглашусь. Мой запрос из (0) ПЕРЕД выполнением на СКД будет преобразован в вид:

Выбрать
РегОстатки.Номенклатура
Поместить ВТ
ИЗ РегистрыНакопления.Товары.Остатки() как РегОстатки
Где РегОстатки.КОличествоОстаток <0;
//////
Выбрать Вт.Номенклатура ИЗ ВТ

Потому и агрегирует до номенклатуры.
39 ptiz
 
26.10.21
15:23
(35) Тебе всю тему долбят, что твоя консоль на СКД сделана.
40 Xapac
 
26.10.21
15:25
(0) Пришлите копию базы для анализа
41 серый КТУЛХУ
 
26.10.21
19:08
имхо ничего оно не агрегирует и скд не косячит.
читаем по слогам: Выбрать РАЗЛИЧНЫЕ ВТ.Номенклатура ИЗ ВТ
--- ну так различные "номенклатура" и получаешь... это разве по сути не то же самое, что ВТ.Выгрузить().Свернуть("Номенклатура","") ?..
42 Garykom
 
гуру
26.10.21
19:26
(41) попробуй ))
43 DTX 4th
 
26.10.21
20:56
Я бы посмотрел на эту КОНСОЛЬ ЗАПРОСОВ)
Выкладывай сюда
44 DTX 4th
 
26.10.21
20:59
https://i.imgur.com/u4MYWQb.png

17 лет стажа, а консоль запросов не освоена) Как так
45 wasa
 
27.10.21
10:16
(39) Да все уже.
(41) Нет. Не то же.
(43) Да нафиг оно тебе? Стандартная консоль, неуправляемые формы.
Тема разобрана, добавить уже нечего.

Остался правда вопрос, как в СКД все таки получить из (30) все три значения, чтобы в дальнейшем их использовать в отборе в другом запросе. Но оно уже за рамками темы.
46 Garykom
 
гуру
27.10.21
10:19
(45) >как в СКД

условие наложи на пропадаемые поля, ну там не нулл например