Почему в СКД меняется конечный остаток при изменении даты начала периода и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Налоговый учет
← На главную

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

Проанализируем причины возникновения этой проблемы и рассмотрим практические способы ее решения в 1С.

Выясним причину проблемы

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

Когда в запросе указывается периодичность Регистратор без дополнительных полей периодов, виртуальная таблица выбирает только те сочетания измерений и аналитик (номенклатура, партия, счет-фактура и т. д.), по которым были движения (обороты) внутри выбранного интервала [НачалоПериода, КонецПериода].

Если по какой-то позиции на начало сокращенного периода остаток существовал, но в течение нового (более узкого) интервала не было ни одного документа движения, эта позиция полностью выпадает из выборки виртуальной таблицы. В результате её конечный остаток перестает суммироваться в итоговых группировках отчета.

Способ 1. Изменение периодичности виртуальной таблицы

Разберем самый простой и эффективный способ исправления запроса. Вместо жесткого указания периодичности Регистратор переведем периодичность в режим Авто или Период.

Посмотрим на пример некорректного запроса:


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

Для исправления заменим периодичность Регистратор на Авто и при необходимости добавим в список полей служебное поле периода, чтобы СКД могла корректно построить иерархию времени:


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

Способ 2. Проверка и пересчет итогов регистра

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

  1. Перейдем в режим конфигуратора или используем стандартную обработку Управление итогами в режиме 1С:Предприятие.
  2. Для регистра НДСПоПриобретеннымЦенностям выполним отключение и повторное включение итогов или полное выполнение операции пересчета итогов.
  3. В режиме администрирования можно также запустить процедуру Тестирование и исправление информационной базы с выбранным пунктом Пересчет итогов.

Способ 3. Проверка настройки ролей полей в СКД

Рассмотрим еще один важный момент: корректность настройки ролей полей на вкладке Наборы данных в схеме компоновки данных.

Для корректного расчета итогов по ресурсам отчета проверим следующие настройки:

  1. У поля КоличествоНачальныйОстаток в колонке Роль должно быть указано тип остатка Начальный, а также задано имя парного поля (КоличествоКонечныйОстаток).
  2. У поля КоличествоКонечныйОстаток роль должна содержать тип остатка Конечный.
  3. В настройках ролей остатков должны быть отмечены все измерения регистра (например, Склад, Номенклатура, Партия, СчетФактура).

Способ 4. Разделение запросов остатков и оборотов

Если отчёт должен гарантированно выводить конечные остатки по абсолютно всем позициям (даже тем, по которым не было движений ни в одном из периодов), заменим один запрос с виртуальной таблицей ОстаткиИОбороты на соединение двух таблиц:

  1. Получим конечные остатки из виртуальной таблицы Остатки на дату &КонецПериода (без ограничения по начальной дате).
  2. Получим обороты за выбранный период [&НачалоПериода, &КонецПериода] из таблицы Обороты.
  3. Соединим их по ключевым измерениям с помощью ПОЛНОЕ СОЕДИНЕНИЕ или через связи наборов данных в СКД.

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

← На главную