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

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

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

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

Основная сложность заключается в специфике работы виртуальных таблиц в 1С. Когда мы накладываем условие, например, ГДЕ Номенклатура В ИЕРАРХИИ(&Группа), непосредственно в параметры виртуальной таблицы ОстаткиИОбороты, система начинает фильтровать записи на этапе формирования этой таблицы.

Суть проблемы: Виртуальная таблица выводит записи только за те периоды, в которых были движения (обороты). Если в какой-то день по конкретной номенклатуре не было движений, запись в таблице отсутствует. В обычных условиях система «достраивает» остатки, но при наложении жесткого фильтра в параметрах виртуальной таблицы нарушается целостность временной шкалы. В результате отчет показывает только те даты, где были обороты, а дни «тишины» выпадают или отображаются неверно, так как движок СКД теряет возможность корректно «протянуть» остаток через пустые периоды.

Разберем по шагам, как исправить отчет

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

Метод 1: Перенос отбора в настройки СКД

Это самый простой и правильный путь. Вместо того чтобы фильтровать данные внутри текста запроса, мы должны позволить системе получить полный набор данных, а фильтрацию применить уже на уровне визуализации.

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

При таком подходе СКД сначала выберет данные, сохранив временную последовательность, а затем отфильтрует их в соответствии с вашими требованиями, не нарушая логику вывода остатков.

Метод 2: Проверка ролей полей в СКД

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

Проанализируем настройки на вкладке Наборы данных:

Метод 3: Использование «Таблицы периодов» (для продвинутых случаев)

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

Разберем логику:

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

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

Итог: что важно запомнить

Главное правило при работе с ОстаткиИОбороты: минимизируйте использование параметров в тексте запроса виртуальной таблицы. Все отборы, которые можно вынести в настройки пользователя или настройки СКД — выносите туда. Это позволит платформе 1С правильно интерпретировать периоды и выводить данные согласно их реальным остаткам, а не только по факту совершения движений.

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

← На главную