Имя: Пароль:
1C
 
Нехорошее поведение регистра. Как поправить?
0 Галахад
 
гуру
30.10.18
06:06
Такой вот запрос выявил, что при чтении без периодичности количество больше в два раза:

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

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ДокументПродажи

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ДокументПродажи,
    0,
    СУММА(ПродажиОбороты.КоличествоОборот)
ИЗ
    РегистрНакопления.Продажи.Обороты(&D1, &D2, , ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ДокументПродажи
;

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

СГРУППИРОВАТЬ ПО
    ТаблицаПродаж.Номенклатура,
    ТаблицаПродаж.ДокументПродажи
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаПродажГрупп.Номенклатура,
    ТаблицаПродажГрупп.ДокументПродажи,
    ТаблицаПродажГрупп.КоличествоОборотПериод,
    ТаблицаПродажГрупп.КоличествоОборот
ИЗ
    ТаблицаПродажГрупп КАК ТаблицаПродажГрупп
ГДЕ
    ТаблицаПродажГрупп.КоличествоОборотПериод <> ТаблицаПродажГрупп.КоличествоОборот

УПОРЯДОЧИТЬ ПО
    ТаблицаПродажГрупп.ДокументПродажи.Дата
1 Галахад
 
гуру
30.10.18
06:09
Перепроведение "документов продаж" не меняет ситуацию.

Применение такой конструкции:
РегистрыНакопления.Продажи.ПересчитатьИтогиЗаПериод('20181001')
Не помогло.

Применение такой конструкции возможно только ночью.
РегистрыНакопления.Продажи.ПересчитатьИтоги()

Кто виноват? Что делать? Как починить?
2 catena
 
30.10.18
06:56
А как выглядят движения проблемных документов?
3 Галахад
 
гуру
30.10.18
07:07
(2) Гм. Вроде бы нормально выглядят. И количество там нормальное.
4 Галахад
 
гуру
30.10.18
07:08
(3) +
Или я не понял вопроса?
5 Мимохожий Однако
 
30.10.18
07:11
В чём цель запроса? Почему в первой таблице используешь объединение? Конфигурация типовая?
6 catena
 
30.10.18
07:12
(4)Глянуть можно? Хочу сымитировать, на моих регистрах запрос отрабатывает ровно.
7 Галахад
 
гуру
30.10.18
08:43
(5) Цель запроса, найти те записи у которых разные данные при различных видах обращения к ним.
1. Периодичность не указана.
2. Периодичность указанна.
Хотя, по логике данные всегда должны быть одинаковы.

(6) Скорее всего не воспроизведется. У меня проблема только в нескольких датах, предположительно в одном регистре.
8 Фрэнки
 
30.10.18
09:06
(7) а ты сколько раз проверял? Может надо и в файловый режим выгрузить и там проверить? Или пересчитать все регистры?
9 Галахад
 
гуру
30.10.18
09:10
(8) Как понять сколько? Запрос по другому данные не будет выводить.

В файловый не выгрузиться. А пересчитывать долго. Часа два назад запустил пересчет одного регистра на копии, считается до сих пор.
10 Фрэнки
 
30.10.18
09:18
(9) просто я как-то тоже наступал на грабли с использованием таблицы вида

РегистрНакопления.Продажи.Обороты( ...

Вылечилось запуском пересчета в ТИИ в конфигураторе.
Пока вразумительных версий никто не озвучил, может пусть оно промолотит где-то на тестовой копии в фоне и затем проверишь, что она выдаст после
11 Галахад
 
гуру
30.10.18
09:24
(10) Угу. Жду вот.
12 unregistered
 
30.10.18
09:58
(7) > по логике данные всегда должны быть одинаковы

C какого перепугу они должны быть одинаковыми?
Предположим, были движения в одном периоде
ДокументПродажи1 +10
ДокументПродажи1 -10

В результате запроса с периодичностью "Запись" получим:
ДокументПродажи1 0

В результате запроса без указания периодичности не получим ничего, так как виртуальная таблица Обороты сгруппировывает записи и исключает нулевые результаты.
13 unregistered
 
30.10.18
10:02
+ к (12) обычная история для возвратов, корректировок и т.п. сторнировочных записей.
14 Галахад
 
гуру
30.10.18
10:19
(12) Гм. Идея интересная. В моем случае не верная.
Мое утверждение можно подтвердить или опровергнуть очень легко, запустив запрос на своей базе.
15 Галахад
 
гуру
30.10.18
10:24
Такс. Пересчет регистра с начала года ничего не изменил. Жду полного пересчета.
16 catena
 
30.10.18
10:33
(12)Там объединение, а не соединение, не вижу, как ваше заявление может дать эффект удвоения количестваОборот, а не количества записей.
17 unregistered
 
30.10.18
11:05
(16) А я ничего не говорил про проблему удвоения. Я лишь отметил логическую ошибку автора, который утверждал, что результаты запросов к регистру с периодичностью должны быть идентичны результатам аналогичного запроса без периодичности.

Что касается удвоения, то если запрос совершенно точно такой, как в (0), а не упрощенный, то действительно удвоения быть вроде как не должно.

Остаётся еще вариант, что автор упростил для нас текст запроса. А реальный запрос имеет какие-то дополнительные особенности, которые приводят к описанной проблеме.
18 Галахад
 
гуру
30.10.18
11:21
(17) Запрос реальный.

Я тут подсчитал. Пересчет текущего года занял 67 минут. Пересчет с 2011 года закончится часов за 7... Беда.
19 Галахад
 
гуру
30.10.18
12:11
Пересчитал. Похорошело. На все про все ушло 6 часов.


Возник вопрос нельзя ли это как-то ускорить вот такой код?

РегистрыНакопления.Продажи.ПересчитатьИтоги();
20 unregistered
 
30.10.18
14:14
(19) > нельзя ли это как-то ускорить вот такой код?

На сколько я знаю, нет.
Для регистров остатков можно сократить период хранения итогов. Для оборотных регистров такой возможности нет. Соответственно пересчитываются абсолютно все итоги.
Альтернатива твоему методу только одна (код ниже), которая заключается в отключении итогов и последующем включении. При включении происходит их пересчет.

  РегистрыНакопления.Продажи.УстановитьИспользованиеИтогов(Ложь);
  РегистрыНакопления.Продажи.УстановитьИспользованиеИтогов(Истина);
21 1Сергей
 
30.10.18
14:22
(18) ну, это не долго. Я как-то меесяц за 12 часов смог пересчитать.

Вроде, можно нештатно пересчитывать итоги (средствами скуля), но там надо мега-запросы писать. И это не труъ
22 Мимохожий Однако
 
30.10.18
14:46
(7) Рассматривать обороты в разрезе регистраторов опрометчиво, т.е. неправильно,т.е. хреново
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший