При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с нестандартным поведением виртуальной таблицы ОстаткиИОбороты: при сдвиге даты начала периода (например, при сокращении интервала с начала месяца до конца месяца) неожиданно меняется итоговый конечный остаток, хотя дата окончания отчета остается неизменной.
Проанализируем причины возникновения этой проблемы и рассмотрим практические способы ее решения в 1С.
Главная причина такого поведения кроется в механизме работы виртуальной таблицы ОстаткиИОбороты регистра накопления, особенно при указании периодичности Регистратор.
Когда в запросе указывается периодичность Регистратор без дополнительных полей периодов, виртуальная таблица выбирает только те сочетания измерений и аналитик (номенклатура, партия, счет-фактура и т. д.), по которым были движения (обороты) внутри выбранного интервала [НачалоПериода, КонецПериода].
Если по какой-то позиции на начало сокращенного периода остаток существовал, но в течение нового (более узкого) интервала не было ни одного документа движения, эта позиция полностью выпадает из выборки виртуальной таблицы. В результате её конечный остаток перестает суммироваться в итоговых группировках отчета.
Разберем самый простой и эффективный способ исправления запроса. Вместо жесткого указания периодичности Регистратор переведем периодичность в режим Авто или Период.
Посмотрим на пример некорректного запроса:
ВЫБРАТЬ
НДСОстаткиИОбороты.Номенклатура КАК Номенклатура,
НДСОстаткиИОбороты.Склад КАК Склад,
НДСОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
НДСОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
НДСОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
НДСОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.НДСПоПриобретеннымЦенностям.ОстаткиИОбороты(
НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ),
Регистратор,
,
Склад = &ФильтрСклад) КАК НДСОстаткиИОбороты
Для исправления заменим периодичность Регистратор на Авто и при необходимости добавим в список полей служебное поле периода, чтобы СКД могла корректно построить иерархию времени:
ВЫБРАТЬ
НДСОстаткиИОбороты.Номенклатура КАК Номенклатура,
НДСОстаткиИОбороты.Склад КАК Склад,
НДСОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда,
НДСОстаткиИОбороты.Регистратор КАК Регистратор,
НДСОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
НДСОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
НДСОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
НДСОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.НДСПоПриобретеннымЦенностям.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Авто,
,
) КАК НДСОстаткиИОбороты
Иногда искажение остатков вызвано сбоем в сохраненных итогах регистра накопления. В таком случае помогает операция пересчета итогов.
1С:Предприятие.НДСПоПриобретеннымЦенностям выполним отключение и повторное включение итогов или полное выполнение операции пересчета итогов.Рассмотрим еще один важный момент: корректность настройки ролей полей на вкладке Наборы данных в схеме компоновки данных.
Для корректного расчета итогов по ресурсам отчета проверим следующие настройки:
КоличествоНачальныйОстаток в колонке Роль должно быть указано тип остатка Начальный, а также задано имя парного поля (КоличествоКонечныйОстаток).КоличествоКонечныйОстаток роль должна содержать тип остатка Конечный.Склад, Номенклатура, Партия, СчетФактура).Если отчёт должен гарантированно выводить конечные остатки по абсолютно всем позициям (даже тем, по которым не было движений ни в одном из периодов), заменим один запрос с виртуальной таблицей ОстаткиИОбороты на соединение двух таблиц:
Остатки на дату &КонецПериода (без ограничения по начальной дате).[&НачалоПериода, &КонецПериода] из таблицы Обороты.ПОЛНОЕ СОЕДИНЕНИЕ или через связи наборов данных в СКД.При таком подходе смена даты начала отчета влияет исключительно на расчет оборотов за период, а итоговый конечный остаток останется неизменным и точным.