gifts2017

Типичные проблемы при расчете остатков

Опубликовал в раздел Программирование - Практика программирования

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

Методические рекомендации по конфигурированию
19.08.2009

Типичные проблемы при расчете остатков

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

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

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

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

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

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

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

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

ВЫБРАТЬ
 УчетНоменклатурыОстаткиИОбороты.Регистратор,
 УчетНоменклатурыОстаткиИОбороты.

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

 

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

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

Пример:

 

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дмитрий Глух (IronDemon) 29.07.10 15:48
Найдите 10 отличий от ИТС?
2. Александр Шишкин (Шёпот теней) 29.07.10 15:58
(0) ... колись ... УЖЖЖ ... вот ... воруем... ?
4. nataly1c 19.12.11 16:30
5. Иван (SinglCOOLer) 25.11.12 11:26
6. Сергей Ярцев (SergTH0000) 27.06.13 10:05
За роль реквизита измерения, 2 дня мучался +
7. Alex Azarnin (1985Alex1985) 20.01.14 01:00
Пипец, уже до дыр зачитал статью все равно не помогает :( и периодичность авто, и секунду выбираю и все роли заполнены, а все равно с регистратором норм нач-кон остатки, а без регистратора ЗА-МНО-ЖА-ЕТ :(:(:(:(:( ПИПЕЦ у меня комплекс разовьется на этой почве :(:(:(
8. Alex Azarnin (1985Alex1985) 20.01.14 01:28
Опытным путем выяснил что замножает, т.к. у меня в некоторых полях есть разделение данных с учетом типа регистратора, например:

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

Подскажите кто знает, как сохранить такое деление, при этом не выводя сам регистратор?
9. Александр Жерздев (Al777) 24.07.14 09:19
Статья мне помогла, но теперь вывод данных по периодам перестал работать вообще.
10. Константин Юрин (kostyaomsk) 07.08.14 15:02
(8) 1985Alex1985, в профайлер SQL залезть и там пропасть. Пусть лучше уж или лишняя виртуальная таблица или вложенный запрос для отбора нужных регистраторов, а дальше арифметика.
11. Константин Юрин (kostyaomsk) 07.08.14 15:04
(7) 1985Alex1985, еще вот занятный вопрос: а построитель отчета какие глюки выдает. Получается и тут лучше перестраховаться и в фигурных скобочках лишнее выбрать чтоб тормозило. И еще перед выполнением (и в СКД тоже) посмотреть какой получился запрос.
12. Nelli A (Nelli_A86) 17.10.14 15:41
(8) 1985Alex1985, Тема старая, но может быть кому-то пригодится мое решение: для того, чтобы не выводить детализацию по регистратору и остатки не ломались в остальных группировках отчета, можно просто в группировке Детальные записи отключить все поля, которые туда попадают (если стоит авто, то развернуть и там их отключить)
mad375; OerlandHue; mindcannon; +3 Ответить
13. Hromov Anton (hromovanton) 22.03.16 13:53
Помогло только установка "Обязательного" поля для Регистратора! В таком случаем можно в запросе анализировать регистратор. Огромное спасибо за статью! Странно, что в статье ИТС "Типичные проблемы при расчете остатков" нет ни слова о том, что делать, если в запросе в полях есть что-то тип "Выбор когда ТипЗначенияч(Регистратор) = Тип()"
14. Hromov Anton (hromovanton) 22.03.16 13:54
(7) 1985Alex1985, попробуй поставь Регистратор обязательным полем в настройках Роли для поля Регистратор. Мне помогло.
15. dorofei Nikiforov (dorofei) 13.04.16 10:58
Я сейчас ломаю голову как исправить начальный/конечный остатки при использовании условия в регистре бухгалтерии
"ГДЕ НЕ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.РегламентнаяОперация"
Описанные выше способы не помогают((
16. dorofei Nikiforov (dorofei) 13.04.16 12:52
Вообще можно по регистратору фильтры делать?