Имя: Пароль:
1C
1С v8
Странное поведение СКД
, ,
0 ValeriTim
 
22.09.21
10:46
Впервые сталкиваюсь с таким поведением СКД: есть запрос (не очень сложный), в запросе определяется продажа товаров за период и остатки товара на конец этого периода, особенность базы такова, что в не зависимости от того каково наименование товара - каждая позиция номенклатуры имеет свой элемент справочника номенклатуры и естественно уникальный код (иными словами у меня в справочнике бывают по 2-3 элемента с одинаковымнаименованием), в запросе помимо прочего я получаю и бренд номенклатуры - это реквизит элемента справочника и строю СКД по двум группировкам Бренд и Номенклатура. С двумя группировками запрос и таблица отрабатывают нормально, но вот когда я выключаю (галкой) вторую группировку (Номенклатура) запрос начинает работать странно - по какой то причине два элемента с одинаковым наименованием номенклатуры воспринимаются как один и в группировке "Бренд" учитываются как одно издение, соответственно итоги по Бренду оказываются меньше, чем есть на самом деле.

С чем это может быть связано и как это исправить ?
1 Asmody
 
22.09.21
10:48
(0) в группировке Наименование или Ссылка?
2 ValeriTim
 
22.09.21
10:50
В группировках и номенклатура и бренд выбираются как ссылки. Причем я сначала группироку Бренд строил как Номенклатура.Бренд и когда увидел странное поведение стал бренд выбирать уже в запросе, но и это не помогло.
3 Asmody
 
22.09.21
10:51
укажи, что Номенклатура и Бренд - это измерения и поставь зависимость второго от первого
4 ValeriTim
 
22.09.21
10:53
(3) точно - щас попробую
5 shuhard
 
22.09.21
10:53
(0) у Хрусталевой детально расписаны ограничения работы СКД с остатками на конец периода и выборкой данных
6 ValeriTim
 
22.09.21
11:00
(5) тут не в этом дело

Итак помогло - у поля Бренд я поставил тип "Измерение" (Номенклатура и так была как измерение) и у обоих измерений я поставил галку "обязательное" - стало работать нормально.

Спасибо
7 Asmody
 
22.09.21
11:03
(6) логично. оно же выкидывает из итогового запроса неиспользуемые поля
8 ValeriTim
 
22.09.21
11:03
И еще поставить галку "обязательное" достаточно только у измерения "Номенклатура"
9 ValeriTim
 
22.09.21
11:05
(7) Ну вот что значит выкидывает? Итоги то как то по ним считает, но вот считает весьма странно - такое ощущение, что СКД начинает воспринимать номенклатуру не как элемент справочника, а как наименование элемента и встречая два одинаковых - считает, что это одно... Вот как так?
10 fisher
 
22.09.21
11:21
(9) А формулы ресурсов какие использовались?
11 ValeriTim
 
22.09.21
11:22
(10) не понял вопроса ... ну предположу ... я получал КоличествоПродаж, СебестоимостьПродаж, СтоимостьПродаж, КоличествоОстаток, СебестоимостьОстаток. Все это считается в запросе
12 toypaul
 
гуру
22.09.21
11:23
(9) сделать запрос без учета группировки по номенклатуре и все встанет на свои места. также на инфостарте сделать поиск по "Отладка СКД", чтобы впредь таких вопросов не задавать или задавать меньше
13 ValeriTim
 
22.09.21
11:24
(12) вот ты интересный - а как его сделать без учета группировки Номенклатура, когда из нее то и считаются итоговые значения полей
14 fisher
 
22.09.21
11:25
(11) Что-то тут не так. Если ресурсы классические и структура регистра классическая, то выкидывание неиспользуемого измерения не должно было привести к искажению итогов по бренду. Стопудово у тебя там еще какая-то заковыка есть.
15 fisher
 
22.09.21
11:29
Покажи запрос, если он не сильно развесистый.
16 toypaul
 
гуру
22.09.21
11:29
(13) мде. тяжелый случай
17 ValeriTim
 
22.09.21
11:30
(14) Ну... запрос не совсем простой - в виду особенностей учета получить требуемые данные из просто регистров не получается, имеются несколько организаций, получающих товар от поставщиков и передают этот товар на реализацию друг другу (не весь, конечно, а по определенным условиям). Так вот в запросе я должен получать себестоимость товара как ту себестоимость, которая сформировалась при закупке у поставщика, а не ту, которая получилась при передачи на реализацию.
18 fisher
 
22.09.21
11:31
Выкидывание поля могло повлиять на ресурсы, которые при вычислении опираются на количество детальных записей. Ну там средние всякие и т.п.
19 ValeriTim
 
22.09.21
11:31
(16) в своем репертуаре ... очень многозначительно ... :)
20 ValeriTim
 
22.09.21
11:33
(18) если бы у меня считалось где то среднее или что то еще ... Нету там этого... Нет.
21 fisher
 
22.09.21
11:34
(17) Ну, не глядя на запрос сложно понять, что могло пойти не так. СКД может достаточно сильно перекраивать результирующий запрос, пытаясь его оптимизировать под пользовательские настройки. Например, может выбросить соединение с какой-то временной таблицей, если решит что это не должно повлиять на результат, так как напрямую поля оттуда не задействованы.
22 ValeriTim
 
22.09.21
11:34
Какие теги для вставки кода запроса ?
23 Asmody
 
22.09.21
11:36
(22) [ 1C ] [ /1C ] только без пробелов.
но оно само распознается (может быть)
24 ValeriTim
 
22.09.21
11:38
Вот текст запроса:

ВЫБРАТЬ
    ЮС_СоответствияОрганизацийКонтрагентов.Организация,
    ЮС_СоответствияОрганизацийКонтрагентов.Контрагент
ПОМЕСТИТЬ ВтНашиОрганизации
ИЗ
    РегистрСведений.ЮС_СоответствияОрганизацийКонтрагентов КАК ЮС_СоответствияОрганизацийКонтрагентов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
    ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры
ПОМЕСТИТЬ ВтПартииТоваровНаСкладахОстаткиОбороты
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ПартииТоваровНаСкладахОстаткиИОбороты
;

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

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

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Организация,
    ВложенныйЗапрос.Контрагент,
    ВтНашиОрганизацииОрганизация.Организация,
    ВтНашиОрганизацииКонтрагент.Контрагент,
    ВложенныйЗапрос.НоменклатураКод,
    ВложенныйЗапрос.Номенклатура,
    ВложенныйЗапрос.ХарактеристикаНоменклатуры
;

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

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ПродажиОбороты.Организация,
    ПартииТоваровНаСкладахОбороты.Склад,
    ПартииТоваровНаСкладахОбороты.СтатусПартии,
    ПродажиОбороты.Номенклатура.Код,
    ПродажиОбороты.Номенклатура.Бренд,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры,
    0,
    0,
    ПродажиОбороты.КоличествоОборот,
    ПродажиОбороты.КоличествоОборот * ВЫБОР
        КОГДА ПартииТоваровНаСкладахОбороты.СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
            ТОГДА ВтПартииТоваровПереданные.Цена
        ИНАЧЕ ПартииТоваровНаСкладахОбороты.СтоимостьОборот / ВЫБОР
                КОГДА ПартииТоваровНаСкладахОбороты.КоличествоОборот = 0
                    ТОГДА 1
                ИНАЧЕ ПартииТоваровНаСкладахОбороты.КоличествоОборот
            КОНЕЦ
    КОНЕЦ,
    ПродажиОбороты.СтоимостьОборот
ИЗ
    РегистрНакопления.Продажи.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, Авто, ) КАК ПродажиОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты({(&НачалоПериода)}, {(&КонецПериода)}, Авто, ) КАК ПартииТоваровНаСкладахОбороты
            ЛЕВОЕ СОЕДИНЕНИЕ ВтПартииТоваровПереданные КАК ВтПартииТоваровПереданные
            ПО ПартииТоваровНаСкладахОбороты.Номенклатура = ВтПартииТоваровПереданные.Номенклатура
                И ПартииТоваровНаСкладахОбороты.ХарактеристикаНоменклатуры = ВтПартииТоваровПереданные.ХарактеристикаНоменклатуры
            ЛЕВОЕ СОЕДИНЕНИЕ ВтТоварыПоПоставщикам КАК ВтТоварыПоПоставщикам
            ПО ПартииТоваровНаСкладахОбороты.Номенклатура = ВтТоварыПоПоставщикам.Номенклатура
                И ПартииТоваровНаСкладахОбороты.ХарактеристикаНоменклатуры = ВтТоварыПоПоставщикам.ХарактеристикаНоменклатуры
        ПО ПродажиОбороты.Регистратор = ПартииТоваровНаСкладахОбороты.Регистратор
            И ПродажиОбороты.Номенклатура = ПартииТоваровНаСкладахОбороты.Номенклатура
            И ПродажиОбороты.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОбороты.ХарактеристикаНоменклатуры
ГДЕ
    ВЫБОР
            КОГДА ПродажиОбороты.Организация В
                        (ВЫБРАТЬ
                            ВтНашиОрганизации.Организация
                        ИЗ
                            ВтНашиОрганизации КАК ВтНашиОрганизации)
                    И ПродажиОбороты.Контрагент В
                        (ВЫБРАТЬ
                            ВтНашиОрганизации.Контрагент
                        ИЗ
                            ВтНашиОрганизации КАК ВтНашиОрганизации)
                ТОГДА ЛОЖЬ
            ИНАЧЕ ИСТИНА
        КОНЕЦ
{ГДЕ
    ПродажиОбороты.Организация.*,
    ПартииТоваровНаСкладахОбороты.Склад.*,
    ПартииТоваровНаСкладахОбороты.СтатусПартии.*,
    ПродажиОбороты.Номенклатура.*,
    ПродажиОбороты.ХарактеристикаНоменклатуры.*}
25 fisher
 
22.09.21
11:42
Непонятно, нафига ты явно описывал используемые поля, если не отключал автонастройки. Поле бренда у тебя например явно не описано. Может коктейль какой-то получился...
Попробуй или отключить автонастройки или явно описать бренд. Но это пока так - что сразу в глаза бросилось. Смотрю дальше...
26 fisher
 
22.09.21
11:44
Тьфу. "Или удалить явное описание выбираемых полей, или явно описать бренд и отключить автонастройки".
Хотя отключение автонастроек скорее всего само по себе поможет, так как убирает самодеятельность СКД.
27 fisher
 
22.09.21
11:45
Правда, смутно припоминаю что отключение автонастроек не всю самодеятельность убирает. Сталкивался как-то...
28 ValeriTim
 
22.09.21
11:46
Я сюда обратился, когда уже перепробовал свои комбинации ... ну, что в голову пришло - все пробовал - это остаток от последних попыток...
29 fisher
 
22.09.21
11:48
Попробуй еще убрать поля остатков. Если ресурсы по оборотам считаются правильно, то забей. При нетривиальных запросах СКД часто нужно удовлетворять обязательными ключевыми полями, чтобы СКД смогло правильно остатки посчитать.
30 toypaul
 
гуру
22.09.21
11:55
(19) конечно в своем. можно объяснять что-то старое тому кто на форуме год, пол-года. но когда на форуме 17 лет и тяжело понять что написано в (12), то это случай непростой
31 youalex
 
22.09.21
12:02
Кмк изначальная причина "странного поведения" может быть в том что вирт. таблицы итогов группируются по указанным измерениям, но не по их реквизитам.
32 fisher
 
22.09.21
12:03
Хм... А ВтТоварыПоПоставщикам тебе зачем, если ты его не используешь? Если оно влияет на количество записей, тогда ее выбрасывание могло повлиять на результат.
33 toypaul
 
гуру
22.09.21
12:04
хоспаде. да всего лишь нужно выполнить отчет в консоли КД и посмотреть какой запрос выполняется. чо тут гадать на кофейной гуще
34 fisher
 
22.09.21
12:05
(33) Профессионалы не пользуются отладчиком! Правда, они и код пишут без ошибок...
35 toypaul
 
гуру
22.09.21
12:20
(35) профессионалы доверяют процесс отладки пользователям!
36 fisher
 
22.09.21
12:40
Делегирование, правило "третьего гвоздика" и административный ресурс - вот столпы "no code development"!