Имя: Пароль:
1C
1С v8
Работа с результатом запроса
0 Artyom20
 
23.09.14
09:41
Доброе утро, помогите пожалуйста разобраться с запросом:
У меня внешний отчет, который очень схож на отчет "Анализ заказов покупателей" - проблема в том, что он в некоторых местах мне дублирует строки

Я хочу после результата запроса искать одинаковые строки и оставлять из них одну.

Подскажите, как это написать.
1 Нуф1-Нуф1
 
23.09.14
09:43
я думаю от "дублей" правильнее будет избавляться в самом запросе...
2 Ёпрст
 
23.09.14
09:43
Чистыми руками и светлой головой.
3 Килограмм
 
23.09.14
09:43
а сам запрос поправить боишься что ли? Перебор большого массива данных всегда очень медленно работает.
4 Artyom20
 
23.09.14
09:47
(1) (3) запрос вытягивает данные из регистра заказа покупателей (показывает товары с заказов, которые не закрыты, но проблема в том если в заказе один товар разделен на две строки (в одной стоит резерв, а в другой нет, то он начинает дублировать строку без резерва, сколько я уже перекопал - вообще не понимаю почему (снизу текст запроса)



Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
    
         //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
        |    ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
        |    СУММА(ЗаказыПокупателейОстатки.КоличествоОстаток) КАК ОстатокПоЗаказу,
        |    СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК РезервПодЗАказ,
        |    СУММА(ТоварыВРезервеНаСкладахОстатки1.КоличествоОстаток) КАК ВсегоРезерв,
        |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ОстатокСклада
        |ИЗ
        |    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
        |        ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = ТоварыВРезервеНаСкладахОстатки.ДокументРезерва
        |            И ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки1
        |        ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки1.Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
        |        ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
        |
        |СГРУППИРОВАТЬ ПО
        |    ЗаказыПокупателейОстатки.Номенклатура,
        |    ЗаказыПокупателейОстатки.ЗаказПокупателя
        |
        |УПОРЯДОЧИТЬ ПО
        |    ЗаказПокупателя";

        Результат = Запрос.Выполнить().выгрузить();
        
        таблицаРезервирования = Новый ТаблицаЗначений();
        таблицаРезервирования.Колонки.Добавить("ЗАказ");
        таблицаРезервирования.Колонки.Добавить("Номенклатура");
        таблицаРезервирования.Колонки.Добавить("Количество");
        таблицаРезервирования.Колонки.Добавить("ОстатокСклада");
        таблицаРезервирования.Колонки.Добавить("РезервСклада");
        таблицаРезервирования.Колонки.Добавить("Артикул");
        //таблицаРезервирования.Колонки.Добавить("Количество");
        
        для каждого строка из результат цикл
            если не строка.ОстатокПоЗаказу = строка.резервподзаказ тогда
                если не (?(строка.остатокСклада=null,0,строка.остатокСклада)-?(строка.ВсегоРезерв=null,0,строка.ВсегоРезерв))< строка.остатокПоЗаказу тогда
                    нстро = таблицаРезервирования.Добавить();
                    нстро.номенклатура =  строка.Номенклатура;
                    нстро.ЗАказ = строка.ЗаказПокупателя;
                    нстро.Количество = строка.ОстатокПоЗаказу;
                    нстро.ОстатокСклада = строка.остатокСклада;
                    нстро.Артикул = строка.Номенклатура.Артикул;
                    
                    нстро.РезервСклада = строка.ВсегоРезерв;
                    
                    
                КонецЕсли;
                
                
                
            КонецЕсли;
            
            
        КонецЦикла;
        таблицаРезервирования.ВыбратьСтроку();
        
КонецПроцедуры
5 Artyom20
 
23.09.14
09:48
(если не (?(строка.остатокСклада=null,0,строка.остатокСклада)-?(строка.ВсегоРезерв=null,0,строка.ВсегоРезерв))< строка.остатокПоЗаказу тогда) эта строка в комментах стоит.
6 Ёпрст
 
23.09.14
09:57
(4) строка.остатокСклада=null
это че за нелепость ?
7 Artyom20
 
23.09.14
09:59
это строка закоментена, я в (5) написал ;)
8 Бледно Золотистый
 
23.09.14
10:01
(4) Запрос переписывай.
9 User_Agronom
 
23.09.14
10:02
Какое-то из ЛЕВЫХ СОЕДИНЕНИЙ их плодит.

Переписывай зАпрос.

Да и цикл переноса результатов зАпроса в ТЗ явно излишен.
10 Ёпрст
 
23.09.14
10:04
(0) для начала:

        |    СУММА(ЕстьNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток,0)) КАК РезервПодЗАказ,
        |    СУММА(ЕстьNULLТоварыВРезервеНаСкладахОстатки1.КоличествоОстаток,0)) КАК ВсегоРезерв,
        |    СУММА(ЕстьNULLТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК ОстатокСклада
11 Artyom20
 
23.09.14
10:16
(10)  тем самым у меня отчет больше не показывает )
12 Artyom20
 
23.09.14
10:19
у меня такие связи стоят - может быть в них проблема?
https://imagizer.imageshack.us/v2/1375x752q90/661/JPWrNN.png
13 Килограмм
 
23.09.14
10:26
можно попробовать везде добавить ВЫБРАТЬ РАЗЛИЧНЫЕ, чтобы дубли убрать
14 User_Agronom
 
23.09.14
10:29
(12) Конструктором запросы пишешь? //facepalm ;(
15 Artyom20
 
23.09.14
10:32
(14)
я в этом деле еще слабоват ))
16 Крошка Ру
 
23.09.14
10:36
(14) Пишешь запросы руками? doublefacepalm.jpg
17 User_Agronom
 
23.09.14
10:40
(15) Сейчас курнул твой запрос. Неудивительно, что у тебя есть дубли. Как верно угадали мои телепаты в (9) их плодят левые соединения.
(13) Это приведёт к такому жесточайшему костылю, что не надо.

Сейчас предложу вариант:

ВЫБРАТЬ
    ТаблицаСборная.ЗаказПокупателя,
    ТаблицаСборная.Номенклатура,
    СУММА(ТаблицаСборная.ОстатокПоЗаказу) КАК ОстатокПоЗаказу,
    СУММА(ТаблицаСборная.РезервПодЗАказ) КАК РезервПодЗАказ,
    СУММА(ТаблицаСборная.ВсегоРезерв) КАК ВсегоРезерв,
    СУММА(ТаблицаСборная.ОстатокСклада) КАК ОстатокСклада
ИЗ
    (ВЫБРАТЬ
        ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
        ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
        ЗаказыПокупателейОстатки.КоличествоОстаток КАК ОстатокПоЗаказу,
        ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток КАК РезервПодЗАказ,
        ТоварыВРезервеНаСкладахОстатки1.КоличествоОстаток КАК ВсегоРезерв,
        ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокСклада
    ИЗ
        РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
            ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = ТоварыВРезервеНаСкладахОстатки.ДокументРезерва
                И ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки1
            ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки1.Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
            ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура) КАК ТаблицаСборная

СГРУППИРОВАТЬ ПО
    ТаблицаСборная.ЗаказПокупателя,
    ТаблицаСборная.Номенклатура

УПОРЯДОЧИТЬ ПО
    ТаблицаСборная.ЗаказПокупателя
18 User_Agronom
 
23.09.14
10:42
(16) Если ты задаёшь вопросы типа (12), то запросы нужно писать ТОЛЬКО руками.
Пользоваться конструктором может позволить лишь тот, кто ответы на эти вопросы знает сам твёрдо.
Я могу пользоваться конструктором (по знанию языка запросов имею такое право), ТС - нет.
19 User_Agronom
 
23.09.14
10:43
+(17) Все замечания из (10) важны и необходимы, но кури их сам.
20 User_Agronom
 
23.09.14
10:44
И
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
            ПО ЗаказыПокупателейОстатки.ЗаказПокупателя = ТоварыВРезервеНаСкладахОстатки.ДокументРезерва
                И ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки1
            ПО ЗаказыПокупателейОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки1.Номенклатура

По моему перебор дважды одну таблицу присоединять
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн