Как убрать пустые строки без регистратора в отчете СКД Остатки и обороты

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

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

Выясним причину появления строк без регистратора

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

Если в настройках виртуальной таблицы параметр Метод дополнения установлен в значение Авто, система автоматически создает технические записи для отображения состояния регистра на контрольных точках. Именно эти точки мы и видим как строки с пустым регистратором. В них Приход и Расход обычно равны нулю, а НачальныйОстаток равен КонечномуОстатку.

Способ 1. Настройка ролей полей в СКД

Это самый корректный и «чистый» способ решения проблемы, не требующий радикального изменения логики запроса. Разберем его по шагам:

  1. Откроем схему компоновки данных и перейдем на закладку Наборы данных.
  2. Найдем в списке полей Регистратор.
  3. Нажмем на кнопку в колонке Роль для этого поля.
  4. В открывшемся окне установим флажок Игнорировать значения NULL. Это заставит СКД не выводить строки, где поле регистратора не заполнено.
  5. Установим флажок Обязательное. Это укажет системе, что данное поле должно присутствовать в выборке для корректного построения связей.
  6. Важный нюанс: проверим настройки периодов. Для корректной работы иерархии периодов полю Регистратор необходимо назначить тип Период и указать порядковый номер. Рассмотрим пример: если у нас есть ПериодСекунда с номером 1, то Регистратору можно присвоить номер 2 или выше. Часто помогает установка Регистратора как основного периода с номером 1, если другие периоды не используются.

Способ 2. Использование метода дополнения Движения

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


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

Обратим внимание на четвертый параметр — МетодДополнения. По умолчанию там стоит Авто. Если мы заменим его на Движения, система перестанет генерировать технические строки для границ периода. Однако проанализируем ситуацию: если по какому-то товару был остаток, но в выбранном периоде не было ни одного документа (движения), такой товар полностью исчезнет из отчета. Если ваша задача — ведомость остатков, этот метод может не подойти, так как вы потеряете данные о «зависших» остатках.

Способ 3. Обработка значения Регистратор в запросе

Иногда СКД не воспринимает пустое значение регистратора как NULL, считая его значением Неопределено. В этом случае флажок «Игнорировать NULL» в ролях может не сработать. Чтобы гарантированно отсечь пустые строки, преобразуем поле в запросе:


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

После такого преобразования на уровне запроса, настройка в роли поля Игнорировать значения NULL начнет отрабатывать корректно, и пустые строки исчезнут из финального отчета.

Способ 4. Фильтрация через настройки отчета (Отбор)

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

  1. Перейдем в настройки отчета (вкладка Настройки в СКД).
  2. Выберем вкладку Отбор.
  3. Добавим новый элемент отбора: Регистратор — Заполнено (или Вид сравнения: Заполнено).

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

Способ 5. Разделение наборов данных (для сложных случаев)

Проанализируем ситуацию, когда стандартные методы «ломают» расчет остатков. Такое бывает, если отчет сложный и включает в себя соединения с другими таблицами. В этом случае профессиональным решением будет разделение получения данных на два набора:

  1. Набор данных «Остатки»: использует виртуальную таблицу Остатки. Он отвечает за получение актуального сальдо.
  2. Набор данных «Движения»: использует виртуальную таблицу Обороты в разрезе регистраторов.
  3. Связи наборов данных: связываем их по измерениям (Номенклатура, Склад и т.д.).

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

Резюме и рекомендации

Подводя итог, можно сказать, что выбор метода зависит от ваших целей. Если вам нужен быстрый результат и вы готовы пожертвовать отображением товаров без движений — используйте МетодДополнения.Движения. Если вам нужно сохранить все остатки, но убрать технический мусор — используйте настройку Ролей поля с флагом Игнорировать NULL и обязательным приведением регистратора к NULL через оператор ВЫБОР в тексте запроса. Всегда проверяйте конечные итоги отчета после внесения изменений, так как манипуляции с регистратором в СКД напрямую влияют на алгоритм расчета итогов по периодам. Для быстрой проверки и отладки запросов непосредственно из схемы отчета СКД можно использовать инженерную консоль запросов для 1С с поддержкой схем СКД.

← На главную