Почему не сходятся начальные и конечные остатки в отчетах по регистрам накопления в 1С?

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

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

Разберем причину возникновения ошибки

Основная проблема заключается в том, как платформа обрабатывает поля, которые содержат остатки. Когда вы в тексте запроса складываете несколько полей, например СтоимостьНачальныйОстаток + ДопРасходыНачальныйОстаток, система перестает воспринимать результат как «остаток». Для механизма итогов 1С это становится обычным числовым полем (оборотом).

При выводе итогов по годам платформа автоматически применяет к таким ресурсам функцию Сумма. В результате остаток на конец 2018 года прибавляется к остатку на конец 2019 года, что математически неверно. Остаток — это состояние на конкретный момент времени, его нельзя суммировать по периодам.

Решение проблемы в СКД

Чтобы отчет работал корректно, необходимо правильно настроить ресурсы в СКД. Рассмотрим шаги по исправлению ситуации:

  1. Не используйте выражения в запросе для получения суммы остатков. Лучше выводить каждый показатель (СтоимостьНачальныйОстаток, ДопРасходыНачальныйОстаток) отдельным полем.
  2. Настройка ролей полей. В настройках СКД на вкладке «Ресурсы» для ваших полей остатков необходимо указать правильную формулу. Вместо Сумма нужно использовать функции, которые корректно обрабатывают иерархию, например Максимум или ПоследнееЗначение (в зависимости от настроек группировки).
  3. Использование ролей. Убедитесь, что в наборе данных для полей остатков установлены соответствующие роли, чтобы СКД понимала, что это показатели типа Остаток.

Работа с виртуальной таблицей ОстаткиИОбороты

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

Чтобы избежать этой проблемы, рекомендуется выполнить следующие действия:

Рассмотрим метод использования вложенных запросов:


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

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

Особенности границ периода

Часто ошибки возникают из-за разницы между датой и границей периода. Поскольку регламентные операции в 1С (например, расчет себестоимости) часто записываются на 23:59:59, важно использовать функцию КонецПериода в параметрах запроса:


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

Подведем итоги

Итак, мы выяснили, что:

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

← На главную