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