Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задваивание строк в результирующих данных запроса
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
1С8 Предприятие 8.2.19.130
Альфа-Авто 4.1.21.01

Добрый день.
Подскажите пожалуйста, как решить проблему с задваиванием строк в данных полученных запросом?

Есть такой запрос:
необходимо зарегистрироваться для просмотра ссылки
"ВЫБРАТЬ
                  |    Номенклатура1.Производитель.Наименование КАК Производитель,
                  |    Номенклатура1.Артикул КАК Артикул,
                  |    Номенклатура1.тАртикул КАК тАртикул,
                  |    Номенклатура1.Наименование,
                  |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток - ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК Количество,
                  |    ЦеныСрезПоследних.Цена,
                  |    NULL КАК Характеристика,
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик,
                  |    ПартииТоваровКомпанииОстатки.СуммаУпрОстаток / ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК Себест,
                  |    ПартииТоваровКомпанииОстатки.СуммаУпрОстаток / ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК СебестУпр,
                  |    ЦеныСрезПоследних.Цена КАК ЦенаУпр,
---->                  |    РАЗНОСТЬДАТ(ПартииТоваровКомпанииОстатки.Партия.Дата, &Дата, ДЕНЬ) КАК СрокХранения
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Дата, СкладКомпании В (&Склад)) КАК ОстаткиТоваровКомпанииОстатки
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = Номенклатура1.Ссылка
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(
                  |                &Дата,
                  |                ТипЦен = &Цена
                  |                    И ПодразделениеКомпании = &Подразделение) КАК ЦеныСрезПоследних
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровКомпании.Остатки КАК ПартииТоваровКомпанииОстатки
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ПартииТоваровКомпанииОстатки.Номенклатура
                  |ГДЕ
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 3
                  |
                  |ОБЪЕДИНИТЬ ВСЕ
                  |
                  |ВЫБРАТЬ
                  |    Номенклатура1.Производитель.Наименование,
                  |    Номенклатура1.Артикул,
                  |    Номенклатура1.тАртикул,
                  |    Номенклатура1.Наименование,
                  |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток - ОстаткиТоваровКомпанииОстатки.РезервОстаток,
                  |    NULL,
                  |    ЦеныСрезПоследних.ХарактеристикаНоменклатуры.Наименование,
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик,
                  |    NULL,
                  |    NULL,
                  |    ЦеныСрезПоследних.Цена,
                  |    NULL
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Дата, СкладКомпании В (&Склад)) КАК ОстаткиТоваровКомпанииОстатки
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = Номенклатура1.Ссылка
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(
                  |                &Дата,
                  |                ТипЦен = &Цена
                  |                    И ПодразделениеКомпании = &Подразделение) КАК ЦеныСрезПоследних
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
                  |            И (ЦеныСрезПоследних.ХарактеристикаНоменклатуры.Наименование = ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры.Наименование)
                  |ГДЕ
                  |    (Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 1
                  |            ИЛИ Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 2)";


Запрос выполняется нормально, но потребовалось добавить в запрос "СрокХранения" (сколько примерно запчасть лежит на складе).
Решил добавить в запрос строчку (в запросе отмечена "----> " ), после чего появилось задваивание некоторых данных.

Как показал анализ - задваиваются строки у которых есть больше одной партии, т.е. если старая партия еще не продалась, а пришла новая.
Думал исправить через команду Свернуть таблицу значения, но это приведет к суммированию остальных значений (Остатки, Цены и т.д.).

У меня уже других вариантов не осталось, кроме как получать СрокХранения отдельным запросом (Без повторяющихся) и потом в цикле объединять, но это как-то не по феншую наверное.

Подскажите пожалуйста, как подправить запрос, чтобы не дублировались строки из-за СрокХранения?
pablo
Добавьте группировку в запрос по всем полям, кроме Себест, СебестУпр и СрокХранения. Первые два поля суммировать, третье - Максимум.
bizisoft
pablo @ Сегодня, 12:46 необходимо зарегистрироваться для просмотра ссылки ,
Не совсем уяснил.
Если суммировать Себест, СебестУпр, Количество, Цена суммировать, то оно не просуммирует данные в задваивающихся строках?
Или это в самом запросе работает по другому, чем в Свернуть?
Petre
Если есть несколько партий, то как должен вычисляться СрокХранения?
pablo
bizisoft @ Сегодня, 12:03 необходимо зарегистрироваться для просмотра ссылки ,
1. Цену и количество суммировать не надо, т.к. они берутся не из партий. Они - поля для группировки
2. суммировать нужно партии, т.к. две разные по дате партии в сумме дадут общую стоимость по номенклатуре.
bizisoft
Цитата(Petre @ 30.04.20, 13:04) необходимо зарегистрироваться для просмотра ссылки
Если есть несколько партий, то как должен вычисляться СрокХранения?

Тут ограничений никаких не оговаривалось, поэтому я думал брать самую первую партию.
PABLO подсказал Максимум, т.е. если я правильно понял, то это будет брать максимальное значение.

pablo @ Сегодня, 13:07 необходимо зарегистрироваться для просмотра ссылки ,
Добавил все поля Артикул, Номенклатура, Производитель, Остаток, Цена в группировку, а СебестУпр, Себест, в суммируемое поле СУММ, а СрокХранение в суммированое поле как МАКСИМУМ

Получилось так:
...
|    СУММА(ПартииТоваровКомпанииОстатки.СуммаУпрОстаток / ПартииТоваровКомпанииОстатки.КоличествоОстаток) КАК Себест,
|    СУММА(ПартииТоваровКомпанииОстатки.СуммаУпрОстаток / ПартииТоваровКомпанииОстатки.КоличествоОстаток) КАК СебестУпр,
|    ЦеныСрезПоследних.Цена КАК ЦенаУпр,
|    МАКСИМУМ(РАЗНОСТЬДАТ(ПартииТоваровКомпанииОстатки.Партия.Дата, &Дата, ДЕНЬ)) КАК СрокХранения
|ИЗ
...


Я правильно понял идею?
pablo
bizisoft @ Сегодня, 12:21 необходимо зарегистрироваться для просмотра ссылки ,
да
bizisoft
Все получилось.
Благодарю за помощь.
bizisoft
Заметили некоторую неточность в работе запроса.
Если партия товара одна, то себестоимость считается нормально, но если партий больше, то после сворачивания результирующей ТЗ, получается неверная Себестоимость, которая суммирует Себестоимость каждой партии.

Подскажите пожалуйста, возможно-ли так, чтобы "Сворачивание" происходило в самом запросе, чтобы не требовалось выполнение Сворачивание результирующей ТЗ?
sava1
Сначала выбрать данные из рег.Партии, свернуть, а в основном запросе присоединять не рег., а полученную таблицу
bizisoft
sava1 @ Сегодня, 11:15 необходимо зарегистрироваться для просмотра ссылки ,
Я правильно понимаю, что это нужно делать через временную таблицу?
sava1
да. Выборка из рег.Партии - Поместить тВрем

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

ВЫБРАТЬ
                  |    Номенклатура1.Производитель.Наименование КАК Производитель,
                  |    Номенклатура1.Артикул КАК Артикул,
                  |    Номенклатура1.тАртикул КАК тАртикул,
                  |    Номенклатура1.Наименование,
                  |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток - ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК Количество,
                  |    ЦеныСрезПоследних.Цена,
                  |    NULL КАК Характеристика,
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик,
                  |    ЦеныСрезПоследних.Цена КАК ЦенаУпр,
                  |    ВЫБОР
                  |        КОГДА ЕСТЬNULL(ВложенныйЗапрос.Остаток, 0) > 0
                  |            ТОГДА ВложенныйЗапрос.Сумма / ВложенныйЗапрос.Остаток
                  |        ИНАЧЕ 0
                  |    КОНЕЦ КАК Себест,
                  |    ВЫБОР
                  |        КОГДА ЕСТЬNULL(ВложенныйЗапрос.Остаток, 0) > 0
                  |            ТОГДА ВложенныйЗапрос.Сумма / ВложенныйЗапрос.Остаток
                  |        ИНАЧЕ 0
                  |    КОНЕЦ КАК СебестУпр,
                  |    ВложенныйЗапрос.СрокХранения
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Дата, СкладКомпании В (&Склад)) КАК ОстаткиТоваровКомпанииОстатки
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = Номенклатура1.Ссылка
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(
                  |                &Дата,
                  |                ТипЦен = &Цена
                  |                    И ПодразделениеКомпании = &Подразделение) КАК ЦеныСрезПоследних
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                  |            МАКСИМУМ(РАЗНОСТЬДАТ(ПартииТоваровКомпанииОстатки.Партия.Дата, &Дата, ДЕНЬ)) КАК СрокХранения,
                  |            ПартииТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
                  |            СУММА(ПартииТоваровКомпанииОстатки.КоличествоОстаток) КАК Остаток,
                  |            СУММА(ПартииТоваровКомпанииОстатки.СуммаУпрОстаток) КАК Сумма,
                  |            СУММА(ПартииТоваровКомпанииОстатки.СуммаУпрОстаток) КАК СуммаУпр
                  |        ИЗ
                  |            РегистрНакопления.ПартииТоваровКомпании.Остатки КАК ПартииТоваровКомпанииОстатки
                  |        
                  |        СГРУППИРОВАТЬ ПО
                  |            ПартииТоваровКомпанииОстатки.Номенклатура) КАК ВложенныйЗапрос
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ВложенныйЗапрос.Номенклатура
                  |ГДЕ
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 3
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Номенклатура1.Производитель.Наименование,
                  |    Номенклатура1.Артикул,
                  |    Номенклатура1.тАртикул,
                  |    Номенклатура1.Наименование,
                  |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток - ОстаткиТоваровКомпанииОстатки.РезервОстаток,
                  |    ЦеныСрезПоследних.Цена,
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик,
                  |    ВложенныйЗапрос.СрокХранения,
                  |    ЦеныСрезПоследних.Цена,
                  |    ВЫБОР
                  |        КОГДА ЕСТЬNULL(ВложенныйЗапрос.Остаток, 0) > 0
                  |            ТОГДА ВложенныйЗапрос.Сумма / ВложенныйЗапрос.Остаток
                  |        ИНАЧЕ 0
                  |    КОНЕЦ,
                  |    ВЫБОР
                  |        КОГДА ЕСТЬNULL(ВложенныйЗапрос.Остаток, 0) > 0
                  |            ТОГДА ВложенныйЗапрос.Сумма / ВложенныйЗапрос.Остаток
                  |        ИНАЧЕ 0
                  |    КОНЕЦ
                  |
                  |ОБЪЕДИНИТЬ ВСЕ
                  |
                  |ВЫБРАТЬ
                  |    Номенклатура1.Производитель.Наименование,
                  |    Номенклатура1.Артикул,
                  |    Номенклатура1.тАртикул,
                  |    Номенклатура1.Наименование,
                  |    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток - ОстаткиТоваровКомпанииОстатки.РезервОстаток,
                  |    NULL,
                  |    ЦеныСрезПоследних.ХарактеристикаНоменклатуры.Наименование,
                  |    Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик,
                  |    ЦеныСрезПоследних.Цена,
                  |    NULL,
                  |    NULL,
                  |    NULL
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&Дата, СкладКомпании В (&Склад)) КАК ОстаткиТоваровКомпанииОстатки
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = Номенклатура1.Ссылка
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(
                  |                &Дата,
                  |                ТипЦен = &Цена
                  |                    И ПодразделениеКомпании = &Подразделение) КАК ЦеныСрезПоследних
                  |        ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЦеныСрезПоследних.Номенклатура
                  |            И (ЦеныСрезПоследних.ХарактеристикаНоменклатуры.Наименование = ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры.Наименование)
                  |ГДЕ
                  |    (Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 1
                  |            ИЛИ Номенклатура1.ТипНоменклатуры.ИспользованиеХарактеристик = 2)


Проверил несколько значений - вроде все теперь нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.