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