Как вывести начальный остаток по номенклатуре в отчете с детализацией до уникальных номеров труб и регистратора

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

Разбор проблемы: Почему остаток по уникальному номеру всегда равен нулю

Проанализируем структуру регистра. Если измерение НомерТрубы уникально для каждой единицы продукции, то в базе данных запись о конкретной трубе появляется только в момент ее прихода (регистрации). До этого момента остатка по этой конкретной связке Номенклатура + НомерТрубы в системе не существует. Следовательно, на начало периода отчета начальный остаток по этому измерению физически равен нулю.

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

Решение 1: Настройка ролей полей в СКД

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

  1. Найдем поле НачальныйОстаток и откроем его роль.
  2. Убедимся, что установлена роль Остаток, тип — Начальный.
  3. В поле Счетчик для остатка должны быть указаны только те измерения, по которым этот остаток действительно должен считаться.
  4. Для поля Номенклатура установим флаг Обязательное в роли измерения, чтобы расчет остатков всегда производился в контексте товара.
  5. Для уникального поля НомерТрубы можно снять флаг учета в остатках, если оно используется только для детализации оборотов.

Решение 2: Использование ресурсов с особыми выражениями

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


Сумма(ВычислитьВыражениеСГруппировкойТаблица("Сумма(НачальныйОстаток)", "Номенклатура"))

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

Решение 3: Борьба с "пустым" регистратором и дублями строк

При добавлении поля Регистратор в виртуальную таблицу ОстаткиИОбороты система часто выводит две строки для одной и той же номенклатуры:

Чтобы избавиться от этого визуального разделения, проанализируем настройки группировки. Рекомендуется использовать иерархическую структуру в настройках отчета:

  1. Группировка: Номенклатура (здесь выводим начальный остаток).
  2. Вложенная группировка: НомерТрубы.
  3. Вложенная группировка: Регистратор.

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

Решение 4: Соединение двух виртуальных таблиц в запросе

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

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

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

Решение 5: Настройка дополнения периодов

Выясним еще одну причину исчезновения остатков. Если по номенклатуре есть остаток, но в выбранном периоде не было движений по трубам, группировка по трубам может просто не отобразиться. Чтобы этого избежать, в параметрах виртуальной таблицы запроса необходимо настроить Метод дополнения.

Используйте значение ДвиженияИГраницыПериода. Это заставит систему извлечь данные о состоянии регистра на границы периода, даже если внутри периода не было ни одного регистратора. В СКД это настраивается на вкладке "Настройки" в поле "Дополнение периода" для соответствующих группировок дат.

Важный момент: При работе с регистратором всегда помните о поле ПериодСекунда. Оно необходимо для правильной сортировки движений внутри одной секунды и часто требуется СКД для корректного сопоставления остатков и оборотов в хронологическом порядке.

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

← На главную