Проблемы получения остатков в запросах

В данной статье описывается, по какой причине отчет, созданный при помощи системы компоновки данных, может выдавать неправильные остатки.

Отсутствие родительских полей - периодов в запросе

Данная проблема возникает например, если в запросе получают поле Регистратор, но не получают поле ПериодСекунда.

Пример неправильного запроса:

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

Для такого запроса система рассчитать правильные остатки не может.

Для устранения проблемы нужно обеспечить, чтобы в запросе присутствовало поле Период.

Пример правильного запроса:

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

Отсутствие в запросе парного поля - остатка

Данная проблема возникает когда в запросе получают только поле начального остатка или только поле конечного остатка.

Пример неправильного запроса:

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

Для устранения проблемы нужно обеспечить, чтобы в запросе присутствовал как начальный, так и конечный остатки.

Пример правильного запроса:

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

Не заполнены роли полей

Данная проблема возникает, когда у полей набора данных неправильно заполнены роли полей.

Правильно должны быть заполнены роли у полей - периодов, полей - измерений, полей остатков.

Поля - периоды должны иметь непрерывную нумерацию, начиная с 1. При этом, чем меньше номер периода, тем более точным должен быть период. Например, поле НомерСтроки является уточнением поля Регистратор, поэтому номер период поля НомерСтроки должен быть меньше, чем номер периода поля Регистратор. Аналогично и номер периода поля ПериодДень должен быть меньше, чем номер поля ПериодГод.

Пример неправильного заполнения роли периодов:

В данном примере у поля Регистратор не проставлена роль - период.

Поля, являющиеся измерениями, т.е. в разрезе которых получаются остатки, должны быть отмечены как измерения. Поля, не отмеченные как измерения при расчете итогов по полям остатка учитываться не будут, это может привести к получению неправильных остатков. И наоборот, поле, по сути, не являющееся измерением не должно быть отмечено как измерение. В противном случае остатки могут быть получены неправильно.

Пример неправильного заполнения:

В данном примере предполагается, что поле Примечание по сути измерением не является, но его отметили в схеме как измерение. Поле Склад наоборот измерением является, но его не отметили как измерение.

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

Пример:

В данном примере у полей остатка не указали их роль остатка и имя группы остатков.

Неправильная работа с реквизитами измерений

Данная проблема возникает, когда в запросе получают реквизит измерения.

Например, если в регистре имеется измерение Договор, у которого имеется реквизит Контрагент, и в запросе получается поле Договор.Контрагент.

В такой ситуации может возникнуть две проблемы:

Во-первых, в запросе получили реквизит измерения, но не получили само измерение. В этой ситуации итоги по полям остатка могут быть рассчитаны неправильно.

Пример неправильного запроса:

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

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

Пример правильного запроса:

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

Вторая проблема в том, что у поля - реквизита измерения может быть не указано родительское измерение. Для решения этой проблемы нужно указать родительское поле в роли поля - реквизита. Так, в приведенном выше примере, нужно у поля Контрагент указать роль Измерение и указать в качестве родительского поля поле Договор.

Использование в запросе измерений виртуальных таблиц, отсутствующих в списке выборки

Данная проблема возникает когда в запросе используется измерение виртуальной таблицы, однако данное поле не получается в списке выборки.

Пример неправильного запроса:

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

В данном примере виртуальная таблица выдает остатки с учетом измерения Склад, однако системе компоновки данных об этом поле ничего не известно.

Для устранения проблемы нужно обеспечить, чтобы все измерения виртуальной таблицы, задействованные вне параметров таблицы присутствовали в списке выборки.

Пример правильного запроса:

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

В данном примере поле Склад добавлено в список выборки, таким образом система компоновки данных будет учитывать это измерение при расчете итогов.

Другой пример правильного запроса:

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

В данном примере поле Склад не используется вне параметров виртуальной таблицы.

Не использование периодичности Авто

Данная проблема возникает, когда данные получаются из виртуальной таблицы ОстаткиИОбороты с указанием периодичности, отличной от Авто, если при этом в отчет выводятся не все поля - периоды. Эта проблема родственна проблеме "Отсутствие родительских полей - периодов в запросе", описанной в начале данной статьи.

Пример запроса, который может привести к получению неправильных остатков:

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

Для решения проблемы лучше в запросах для настраиваемых отчетов системы компоновки данных, в виртуальных таблицах ОстаткиИОбороты, использовать периодичность Авто. Или обеспечить обязательных вывод всех полей - периодов в результат отчета.

Пример запроса:

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

Использование периодичности Неделя совместно с бОльшими периодичностями

Данная проблема возникает уже не на уровне схемы компоновки данных, а на уровне настроек компоновки. Например, при совместном выводе в отчет группировки по месяцу и неделе.

Решение данной проблемы - не использовать совместно с периодичностью Неделя бОльшие периодичности.

Добавить комментарий