Имя: Пароль:
1C
1С v8
Запрос возвращает разные данные на конец закрытого периода
0 Бешеная Нога
 
21.11.13
17:49
Есть запрос. Получает остатки по РАУЗУ на начало и конец периода в разрезе подразделений и номенклатурных групп, получает такие же остатки по БУ по 20 счету и сравнивает их на предмет расхождения.

Запросы выполняется с датами 01.01.2013 и 30.09.2013. Дата запрета редактирования 31.12.2013.

Почему несколько раз нажимая кнопку Сфомировать я получаю разные итоги по колонке РАЗНИЦАНАЧАЛЬНАЯ?
Запрос выполнялся на живой базе УПП 1.3.
Может что-то с блокировками и ключами аналитик?

Вот запрос:

ВЫБРАТЬ
    АналитикаВидаУчета.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТаблицаАналитикВидаУчетаЗатраты
ИЗ
    РегистрСведений.АналитикаВидаУчета КАК АналитикаВидаУчета
ГДЕ
    АналитикаВидаУчета.СчетУчета В ИЕРАРХИИ(&СчетУчета)
    И АналитикаВидаУчета.РазделУчета = &РазделУчета
    И АналитикаВидаУчета.Организация = &Организация



ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АналитикаВидаУчета.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТаблицаАналитикВидаУчетаЗатратыНаВыпуск
ИЗ
    РегистрСведений.АналитикаВидаУчета КАК АналитикаВидаУчета
ГДЕ
    АналитикаВидаУчета.СчетУчета В ИЕРАРХИИ(&СчетУчета)
    И АналитикаВидаУчета.РазделУчета = &РазделУчета2
    И АналитикаВидаУчета.Организация = &Организация



ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АналитикаВидаУчета.Ссылка КАК Ссылка
ПОМЕСТИТЬ ТаблицаАналитикВидаУчетаПолная
ИЗ
    РегистрСведений.АналитикаВидаУчета КАК АналитикаВидаУчета
ГДЕ
    АналитикаВидаУчета.СчетУчета В ИЕРАРХИИ(&СчетУчета)
    И (АналитикаВидаУчета.РазделУчета = &РазделУчета
            ИЛИ АналитикаВидаУчета.РазделУчета = &РазделУчета2)
    И АналитикаВидаУчета.Организация = &Организация



ИНДЕКСИРОВАТЬ ПО
    Ссылка
;

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

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



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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

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



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ТаблицаНачальныхОстатков.НоменклатурнаяГруппа, ТаблицаКонечныхОстатков.НоменклатурнаяГруппа),
    ЕСТЬNULL(ТаблицаНачальныхОстатков.ПодразделениеОрганизации, ТаблицаКонечныхОстатков.ПодразделениеОрганизации)



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстатки.Субконто1,
    ХозрасчетныйОстатки.Субконто2



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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

СГРУППИРОВАТЬ ПО
    ХозрасчетныйОстатки.Субконто1,
    ХозрасчетныйОстатки.Субконто2



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ТаблицаНачальныхОстатковБУ.НоменклатурнаяГруппа, ТаблицаКонечныхОстатковБУ.НоменклатурнаяГруппа),
    ЕСТЬNULL(ТаблицаНачальныхОстатковБУ.ПодразделениеОрганизации, ТаблицаКонечныхОстатковБУ.ПодразделениеОрганизации)



ИНДЕКСИРОВАТЬ ПО
    ПодразделениеОрганизации,
    НоменклатурнаяГруппа
;

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


ИТОГИ
    СУММА(РАЗНИЦАНАЧАЛЬНАЯ),
    СУММА(РАЗНИЦАКОНЕЧНАЯ)
ПО
    ОБЩИЕ
1 Бешеная Нога
 
21.11.13
17:49
опечатка: Дата запрета редактирования 31.12.2012
2 Бешеная Нога
 
21.11.13
17:58
апну чтоли
3 Бешеная Нога
 
21.11.13
19:02
Спят наверно все...
4 kosts
 
21.11.13
19:35
Переменные в обработке не обнуляешь
5 GANR
 
21.11.13
19:45
(0) Профайлер не пробовал смотреть? В СКЛ-варианте запрос выглядит одинаково или по-разному при условии, что выходные данные разные? Если по-разному - следует написать на v8@1c.ru.
6 GANR
 
21.11.13
19:52
(0) А данные регистра сведений АналитикаУчета, случайно, не "прыгают" от раза к разу.
7 Бешеная Нога
 
21.11.13
20:23
(4) это в консоли запросов
8 Бешеная Нога
 
21.11.13
20:24
(6) еще не смотрел, попробую глянуть
(7) а почему они должны прыгать?
9 GANR
 
21.11.13
21:49
(8) Например, некое фоновое задание с ними что-нибудь делает (правда, самому в такое не верится, но кто знает).
10 GANR
 
21.11.13
21:51
(8) Да, кстати, а параметры запроса, подаваемые на вход точно одинаковые? Будем постепенно исключать версии.
11 GANR
 
21.11.13
21:57
А если переписать (0) на вложенные запросы?
СУММА(РАЗНИЦАНАЧАЛЬНАЯ) - не может ли это быть фантомное чтение, от которого защищает только самый высокий уровень блокировок Serializable http://snipurl.com/287dr20 ?
12 GANR
 
21.11.13
22:00
Вспомнил, что когда-то смотрел запросы в профайлере и видел, что таблица остатков ведется на самую последнюю дату, а то что ДО этой даты - просто высчитывается путем вычитания оборотов/проводок. И, естественно, дата запрета от такой ситуации едва ли спасет - ВО! Вот это очень вероятно.
13 hhhh
 
21.11.13
22:04
(8) а причем здесь закрытые периоды? Специально нам лапшу вешаешь на уши, чтобы мы сбились со следа?
14 hhhh
 
21.11.13
22:06
и савмое первое, надо попробовать 2012-й год.
15 GANR
 
21.11.13
22:07
(13) Бешеная Нога не первый год программирует тяжелые конфигурации.
Короче, для того, чтобы гарантировать правильность этого самого остатка, система должна заблокировать таблицу итогов по счету _AccTtl0<n> самым жестким образом. А если это сделать - так все пользователи работать не смогут http://help1c.com/faq/view/673.html. Может, система этого не делает???
16 GANR
 
21.11.13
22:08
Может, решающее значение имеет режим разделения итогов по регистру?
17 hhhh
 
21.11.13
22:10
(15) не думаю что пользователи вносят данные за 2012-й год. Да еще и в большом количестве
18 GANR
 
21.11.13
22:16
(17) Неееет... Если считать, что в 2012 гарантированно ничего не меняется.

Засада в том, что отчет считает конечный остаток используя СКЛ-ную таблицу итогов по регистру - там итог считается на ВСЕ  движения для каждого счета и аналитики, полагаю - вот она то и "пляшет" скорее всего _AccTtl0<n> и из-за нее неправильный остаток.

(0) Посмотри, что в этой таблице на уровне СКЛ находится - должно сразу стать понятно, в чем дело. Если в профайлере видно обращение к этой таблице _AccTtl0<n> - понятно, в чем дело.
19 sanja26
 
21.11.13
22:18
а вот это зачем вообще?
ТаблицаАналитикВидаУчетаЗатратыНаВыпуск
ТаблицаАналитикВидаУчетаЗатраты
20 sanja26
 
21.11.13
22:25
по-моему, здесь проще ли здесь объединить
    ТаблицаНачальныхОстатков КАК ТаблицаНачальныхОстатков
        ПОЛНОЕ СОЕДИНЕНИЕ ТаблицаКонечныхОстатков КАК ТаблицаКонечныхОстатков
21 GANR
 
21.11.13
22:33
Короче, если _AccTtl0<n> не блокируется при запросе (0) - тогда понятно как день почему остатки пляшут. Я бы попробовал принудительно БлокировкаДанных заблокировать все, что необходимо сохранить неизменным на время выполнения запроса и уж потом смотреть результат.
Программист всегда исправляет последнюю ошибку.