Имя: Пароль:
1C
1С v8
Отчет на СКД, ИР и запрос выдают разные данные
0 slafor
 
23.12.21
01:57
Есть отчет на СКД по РН ПартииНаСкладах - нач/кон остатки и приход/расход. В общем, ничего особенного, я уже несколько раз его здесь обсуждал.
Решение нашел, но...

В некоторых позициях у меня почему-то данные запроса не совпадают с данными отчета. То есть выношу тот же запрос в консоль запросов и вижу, что там нет начальных остатков, а в отчете они почему-то есть.

Ладно, понимаю, что итоговый запрос на СКД может сильно отличаться от исходного. Поэтому запускаю Инструменты разработчика (ИР), переношу запрос туда, все параметры и прочее устанавливаю как в моем отчете, выполняю - и там тоже нет начальных остатков!
И в Универсальном отчете по этому регистру на выбранную дату они тоже нулевые.

Откуда же они могут взяться в отчете? Никто не сталкивался с подобным?

Вот это сам отчет с начальными остатками: https://disk.yandex.ru/i/VYbRs1f3r-Pcmg .
А вот это тот же отчет, но уже в консоли ИР: https://disk.yandex.ru/i/yXlCn_WHNSpv5Q .
1 slafor
 
23.12.21
02:30
+(0) Даже интереснее стало - заметил, что начальные остатки в моем отчете совпадают с конечными. Но ошибку никак не могу найти... Наверное, это утром надо поискать )
2 youalex
 
23.12.21
03:22
СКД итоги по остаткам сам накручивает, в зависимости от роли поля.
3 slafor
 
23.12.21
12:28
По начальным остаткам сделал так: остатки на начало периода беру из временной таблицы ОстаткиИОбороты, а на конец периода - из таблицы остатков. И почему-то теперь все работает правильно. Почему- пока не понял.

Тут еще ооочень большой вопрос по поводу отборов. И опять сравниваю с результатом в ИР.

Делаю отбор по номенклатуре и на предмет того, что количество конечный остаток больше нуля. В ИР все работает правильно: https://disk.yandex.ru/i/gtCA9w7gnq-W1w .
В отчете до установки галки на количество конечный остаток выглядит как в ИР без галки (то есть показывает все): https://disk.yandex.ru/i/WV7vViJC6qDhHw ,
а когда ставлю галку на условие "Количество больше нуля", выдает "все наоборот", то есть нулевые остатки показывает, а ненулевые - нет: https://disk.yandex.ru/i/wXVfa_mHUCiENg .

Запросы в обоих случая АБСОЛЮТНО одинаковые. Отборы тоже настроены одинаково, в отчете в конфигураторе: https://disk.yandex.ru/i/z5wNprNK4rcN6w , в ИР на первом скриншоте.
4 Базис
 
naïve
23.12.21
13:02
В это время никто в этой базе не меняет эти данные?
5 slafor
 
23.12.21
13:09
(4) Нет, это копия базы, для разработки, я там один.
6 slafor
 
23.12.21
13:47
С запросами все в порядке, они идентичны:

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втОсновнаяТаблица.Номенклатура КАК Номенклатура,
    втОсновнаяТаблица.Партия КАК Партия,
    втОсновнаяТаблица.Поставщик КАК Поставщик,
    втОсновнаяТаблица.ДатаПрихода КАК ДатаПрихода,
    втОсновнаяТаблица.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
    втОсновнаяТаблица.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
    втОсновнаяТаблица.КоличествоПриход КАК КоличествоПриход,
    втОсновнаяТаблица.СуммаПриход КАК СуммаПриход,
    втОсновнаяТаблица.КоличествоРасход КАК КоличествоРасход,
    втОсновнаяТаблица.СуммаРасход КАК СуммаРасход,
    втОсновнаяТаблица.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
    втОсновнаяТаблица.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
ИЗ
    втОсновнаяТаблица КАК втОсновнаяТаблица


Текст запроса, который получается в консоли запросов ИР:

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втОсновнаяТаблица.Номенклатура КАК Номенклатура,
    втОсновнаяТаблица.Поставщик КАК Поставщик,
    втОсновнаяТаблица.ДатаПрихода КАК ДатаПрихода,
    втОсновнаяТаблица.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
    втОсновнаяТаблица.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
    втОсновнаяТаблица.КоличествоПриход КАК КоличествоПриход,
    втОсновнаяТаблица.СуммаПриход КАК СуммаПриход,
    втОсновнаяТаблица.КоличествоРасход КАК КоличествоРасход,
    втОсновнаяТаблица.СуммаРасход КАК СуммаРасход,
    втОсновнаяТаблица.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
    втОсновнаяТаблица.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(втОсновнаяТаблица.Номенклатура) КАК НоменклатураПредставление,
    втОсновнаяТаблица.Номенклатура.Наименование КАК НоменклатураНаименование,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(втОсновнаяТаблица.Поставщик) КАК ПоставщикПредставление
ИЗ
    втОсновнаяТаблица КАК втОсновнаяТаблица
7 slafor
 
23.12.21
13:49
+(6) Первый запрос - это исходный, второй - итоговый, после установки отбора по поле Количество конечный остаток. Взял из консоли запросов ИР.
8 azernot
 
23.12.21
15:21
В СКД, на вкладке "Наборы данных", у каждого набора, для каждого поля могут быть указаны "Роли".
Например, роль может быть "Период" или "НачОст".
В зависимости от этих ролей, при расчёте данных, система может интерпретировать данные по-разному и отражать их по-разному.
Ну а уж если в СКД стоит галка "Автозаполнение", то всё ещё хуже. Это значит сама СКД начинает крутить-вертеть, строить отборы Так, что порой диву даёшься. Если есть желаение оставить "Автозаполнение", то поля в конечном запросе желательно хотя бы именовать нестандартно. Потому как добавление, казалось бы, простого отбора "КоличествоКонечныйОстаток>0" может привенсти к совершенно неожиданным результатам, поскольку этот отбор может срабатывать не только на окончательный (последний) запрос но и на все предыдущие, где есть поле с таким же названием.
9 slafor
 
23.12.21
16:03
(8) Спасибо за совет. Просто "пропустил мимо ушей" совет в (2), а теперь вспомнил, что у меня как раз есть расширенный курс по СКД, где есть отдельный блок про расчет итогов, и про нач/кон остатки. Когда проходил этот курс (частично), то именно "прошел" эту часть мимо. То есть, конечно, посмотрел и... забыл.
Сейчас попробую настроить роли правильно.
10 echo77
 
23.12.21
20:40
(0) Продажи с оборотами решили замешать? :-)
Тогда вам сюда: https://youtu.be/6QHBQ7nUxFY