Имя: Пароль:
1C
1С v8
Что не так с группировкой?
,
0 Ayvengo
 
29.06.15
20:52
Вот текст запроса, явно видно группировки и невозможны одинаковые строки. Но все-равно выдает ошибку "Обнаружено дублирование ключевых значений в колонке "ГруппировкаСтроки". Отображение данных в списке невозможно. Что я делаю не так?:)
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДокументЗадания.Ссылка,
    МАКСИМУМ(ДокументЗадания.ПометкаУдаления) КАК ПометкаУдаления,
    МАКСИМУМ(ДокументЗадания.Номер) КАК Номер,
    МАКСИМУМ(ДокументЗадания.Дата) КАК Дата,
    МАКСИМУМ(ДокументЗадания.Проведен) КАК Проведен,
    МАКСИМУМ(ДокументЗадания.Автор) КАК Автор,
    МАКСИМУМ(ДокументЗадания.ВремяПоПлану) КАК ВремяПоПлану,
    МАКСИМУМ(ДокументЗадания.ДатаИсполнения) КАК ДатаИсполнения,
    МАКСИМУМ(ДокументЗадания.Заголовок) КАК Заголовок,
    МАКСИМУМ(ВЫРАЗИТЬ(ДокументЗадания.Задание КАК СТРОКА(1000))) КАК Задание,
    МАКСИМУМ(ДокументЗадания.Контрагент) КАК Контрагент,
    МАКСИМУМ(ДокументЗадания.Проект) КАК Проект,
    МАКСИМУМ(ДокументЗадания.Создано) КАК Создано,
    МАКСИМУМ(ДокументЗадания.Сотрудник) КАК Сотрудник,
    МАКСИМУМ(ДокументЗадания.СрокИсполнения) КАК СрокИсполнения,
    МАКСИМУМ(ДокументЗадания.Состояние) КАК Состояние,
    МАКСИМУМ(ЕСТЬNULL(ФактическиеЗатраты.Количество, 0)) КАК ФремяПоФакту,
    МАКСИМУМ(ВЫБОР
            КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено)
                ТОГДА 100
            ИНАЧЕ ВЫБОР
                    КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется)
                        ТОГДА 50
                    ИНАЧЕ ВЫБОР
                            КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано)
                                ТОГДА 25
                            ИНАЧЕ 1
                        КОНЕЦ
                КОНЕЦ
        КОНЕЦ) КАК Порядок,
    МАКСИМУМ(ДокументЗадания.ВходящийНомер) КАК ВходящийНомер,
    МАКСИМУМ(ЕСТЬNULL(ПорядокВыполнения.Порядок, 999)) КАК ОсновнойПорядок
ИЗ
    Документ.Задания КАК ДокументЗадания
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            Решения.Задание КАК Задание,
            СУММА(ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Решения.ВремяНачала, Решения.ВремяОкончания, МИНУТА) / 60 КАК ЧИСЛО(15, 2))) КАК Количество
        ИЗ
            Документ.Решения КАК Решения
        ГДЕ
            Решения.Проведен
            И ВЫБОР
                    КОГДА &ТолькоТекущийСотрудник
                        ТОГДА Решения.Сотрудник = &Сотрудник
                    ИНАЧЕ ИСТИНА
                КОНЕЦ
        
        СГРУППИРОВАТЬ ПО
            Решения.Задание) КАК ФактическиеЗатраты
        ПО ДокументЗадания.Ссылка = ФактическиеЗатраты.Задание
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ПорядокВыполненияЗаданий.Порядок) КАК Порядок,
            ПорядокВыполненияЗаданий.Задание КАК Задание
        ИЗ
            РегистрСведений.ПорядокВыполненияЗаданий КАК ПорядокВыполненияЗаданий
        ГДЕ
            ПорядокВыполненияЗаданий.Сотрудник = &Сотрудник
        
        СГРУППИРОВАТЬ ПО
            ПорядокВыполненияЗаданий.Задание) КАК ПорядокВыполнения
        ПО ДокументЗадания.Ссылка = ПорядокВыполнения.Задание
ГДЕ
    ДокументЗадания.Сотрудник = &Сотрудник
    И НЕ ДокументЗадания.Ссылка В
                (ВЫБРАТЬ
                    ВложенныйЗапрос.Задание
                ИЗ
                    (ВЫБРАТЬ
                        Задания.Задание КАК Задание,
                        Задания.Количество КАК Количество
                    ИЗ
                        (ВЫБРАТЬ
                            Задания.Ссылка КАК Задание,
                            СУММА(ВЫБОР
                                    КОГДА Задания.ВремяПоПлану = 0
                                        ТОГДА ЕСТЬNULL(ВремяПоРешениям.Количество, 0)
                                    ИНАЧЕ Задания.ВремяПоПлану
                                КОНЕЦ) КАК Количество
                        ИЗ
                            Документ.Задания КАК Задания
                                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                                    Решения.Задание КАК Задание,
                                    СУММА(ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Решения.ВремяНачала, Решения.ВремяОкончания, МИНУТА) / 60 КАК ЧИСЛО(15, 2))) КАК Количество
                                ИЗ
                                    Документ.Решения КАК Решения
                                ГДЕ
                                    Решения.Проведен
                                СГРУППИРОВАТЬ ПО
                                    Решения.Задание) КАК ВремяПоРешениям
                                ПО
                                    Задания.Ссылка = ВремяПоРешениям.Задание
                        ГДЕ
                            Задания.Проведен
                        СГРУППИРОВАТЬ ПО
                            Задания.Ссылка
                        ИМЕЮЩИЕ
                            СУММА(ВЫБОР
                                    КОГДА Задания.ВремяПоПлану = 0
                                        ТОГДА ЕСТЬNULL(ВремяПоРешениям.Количество, 0)
                                    ИНАЧЕ Задания.ВремяПоПлану
                                КОНЕЦ) > 0) КАК Задания
        
                    ОБЪЕДИНИТЬ ВСЕ
        
                    ВЫБРАТЬ
                        ЗаданияИзЗаказов.Задание,
                        -ЗаданияИзЗаказов.Количество
                    ИЗ
                        (ВЫБРАТЬ
                            ЗаказКлиентаЗадания.Задание КАК Задание,
                            СУММА(ЗаказКлиентаЗадания.Количество) КАК Количество
                        ИЗ
                            Документ.ЗаказКлиента.Задания КАК ЗаказКлиентаЗадания
                        ГДЕ
                            ЗаказКлиентаЗадания.Ссылка.Проведен
                        СГРУППИРОВАТЬ ПО
                            ЗаказКлиентаЗадания.Задание) КАК ЗаданияИзЗаказов) КАК ВложенныйЗапрос
                СГРУППИРОВАТЬ ПО
                    ВложенныйЗапрос.Задание
                ИМЕЮЩИЕ
                    СУММА(ВложенныйЗапрос.Количество) <= 0)

СГРУППИРОВАТЬ ПО
    ДокументЗадания.Ссылка
1 Zhuravlik
 
29.06.15
21:06
(0) Предположу, что эта ошибка фиксируется платформой перед тем как формируется группировка. Дин. список же не работает с какой-то коллекцией, он именно отображает данные по запросу, и тут свои нюансы...
2 Ненавижу 1С
 
гуру
29.06.15
21:06
Не справился парсер с твоими вложениями. Надо смотреть скуль запрос и лучше во временные таблицы перенести
3 Zhuravlik
 
29.06.15
21:08
А вообще какой-то хитро навороченный запрос, с несколькими уровнями вложенности... Вы уверены, что это будет работать с норм. скоростью, даже если бы и взлетело?..
4 Zhuravlik
 
29.06.15
21:10
+ причем запрос по документам, а не РС или РН...
5 Zhuravlik
 
29.06.15
21:11
(2) Насколько помню дин. список с ВТ не работает, нет?..
6 Ayvengo
 
29.06.15
21:14
Возможно,что это из-за прав, так как с полными правами все работает идеально и быстро
7 Ayvengo
 
29.06.15
21:15
В консоли запросов с этими правами дублирующихся строк нет., вложенные запросы нужны, что бы сгруппировать "на всякий случай" для получение доп. полей.
8 Ненавижу 1С
 
гуру
29.06.15
21:15
(5) да. Тупанул
9 Zhuravlik
 
29.06.15
21:19
(6) Все возможно. Хорошая возможность попробовать мой анализатор - сразу будет ясно чего пользователю не хватает
http://catalog.mista.ru/public/346452/
Прав может не быть на данные вложенных запросов.
-
Но повторюсь - запрос не кошерен с точки зрения производительности, я бы задумался о более правильной организации данных. То, что на тестовых данных работает быстро может умереть через неделю в попытке проглотить одно из вложенных условий.
10 Zhuravlik
 
29.06.15
21:21
+ Вообще *любая* сложность в отображении данных говорит о неправильном методологическом подходе. Цитата по памяти с ИТС.
11 Ayvengo
 
29.06.15
21:28
(10) о ленивом программисте ))
12 Ayvengo
 
29.06.15
21:30
Теперь запрос такой
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДокументЗадания.Ссылка,
    ДокументЗадания.ПометкаУдаления КАК ПометкаУдаления,
    ДокументЗадания.Номер КАК Номер,
    ДокументЗадания.Дата КАК Дата,
    ДокументЗадания.Проведен КАК Проведен,
    ДокументЗадания.Автор КАК Автор,
    ДокументЗадания.ВремяПоПлану КАК ВремяПоПлану,
    ДокументЗадания.ДатаИсполнения КАК ДатаИсполнения,
    ДокументЗадания.Заголовок КАК Заголовок,
    ВЫРАЗИТЬ(ДокументЗадания.Задание КАК СТРОКА(1000)) КАК Задание,
    ДокументЗадания.Контрагент КАК Контрагент,
    ДокументЗадания.Проект КАК Проект,
    ДокументЗадания.Создано КАК Создано,
    ДокументЗадания.Сотрудник КАК Сотрудник,
    ДокументЗадания.СрокИсполнения КАК СрокИсполнения,
    ДокументЗадания.Состояние КАК Состояние,
    ВЫБОР
        КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Завершено)
            ТОГДА 100
        ИНАЧЕ ВЫБОР
                КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Выполняется)
                    ТОГДА 50
                ИНАЧЕ ВЫБОР
                        КОГДА ДокументЗадания.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаданий.Запланировано)
                            ТОГДА 25
                        ИНАЧЕ 1
                    КОНЕЦ
            КОНЕЦ
    КОНЕЦ КАК Порядок,
    ДокументЗадания.ВходящийНомер КАК ВходящийНомер
ИЗ
    Документ.Задания КАК ДокументЗадания
ГДЕ
    ДокументЗадания.Сотрудник = &Сотрудник

Никаких изменений, все так же ошибка.
13 Ayvengo
 
29.06.15
22:15
Ошибка в том, что на справочник "Партнеры" (в запросе - контрагент) были права только на чтение, этого не достаточно. Пришлось дать на просмотр.
14 Ненавижу 1С
 
гуру
29.06.15
23:24
Есть такая бага-фича в рлс
хз с чем связана
пару раз на скд отчетах попадал