Как убрать пустые строки и пустые регистраторы в отчетах 1С на базе регистра накопления

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

При разработке отчетов в системе 1С:Предприятие 8, особенно в таких конфигурациях, как Управление торговлей 11 или ERP, программисты часто сталкиваются с неприятным визуальным эффектом. При использовании виртуальной таблицы ОстаткиИОбороты с периодичностью Регистратор в отчете появляется пустая строка, где поле регистратора не заполнено, но при этом выведен начальный остаток. Рассмотрим подробно, почему это происходит и как правильно настроить отчет, чтобы данные выглядели корректно.

Почему появляется «пустой» регистратор: анализируем механику платформы

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

Проанализируем ситуацию: представим, что на 1 января у нас на остатке числится 10 единиц возвратной тары. В течение января были движения (приходы и расходы). Если мы строим отчет за январь, платформа должна показать нам начальный остаток (10 шт.). Но какой документ-регистратор она должна указать для этой цифры? Те документы, которые сформировали этот остаток, остались в прошлом году, они находятся вне выбранного периода отчета. Поэтому система создает виртуальную строку «начального остатка», в которой поле Регистратор логически равно NULL.

Попытки решить это через ПОЛНОЕ СОЕДИНЕНИЕ нескольких временных таблиц, как это часто делают начинающие разработчики, обычно приводят лишь к усложнению кода и замедлению работы отчета, но не убирают корень проблемы. Нам нужно научить Систему компоновки данных (СКД) правильно интерпретировать эти записи.

Метод №1: Настройка ролей полей в СКД (Рекомендуемый)

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

Выполним следующие шаги:

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

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

Метод №2: Использование структуры группировок и отборов

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

  1. Создадим группировку по измерениям (например, Партнер, затем Номенклатура).
  2. Внутри группировки по номенклатуре добавим группировку «Детальные записи».
  3. Для «Детальных записей» на вкладке «Отбор» добавим условие: Регистратор Заполнено (или Регистратор НЕ ЕСТЬ NULL).
  4. В выбранные поля «Детальных записей» добавим обороты (Приход, Расход) и сам Регистратор.
  5. В выбранные поля вышестоящих группировок (Номенклатура) добавим Начальный и Конечный остатки.

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

Метод №3: Оптимизация запроса через поле ПериодСекунда

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


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

Обратим внимание на параметр «Периодичность». Вместо жесткого Регистратор мы указали Авто. Это позволяет СКД самостоятельно выбирать нужные периоды. Поле ПериодСекунда в роли поля должно быть помечено как «Период, Номер 1». Это дает системе четкую временную ось, помогая избежать дублирования остатков и появления «фантомных» строк.

Метод №4: Использование объединения (UNION ALL) для полного контроля

Иногда типовых механизмов СКД недостаточно, например, когда нужно вывести остатки по регистратору «Остаток на начало» текстом. В этом случае проанализируем ситуацию с точки зрения чистого SQL/запроса 1С. Мы можем объединить две таблицы:


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

ОБЪЕДИНИТЬ ВСЕ

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

После этого результат можно сгруппировать в СКД. Этот метод дает 100% контроль над каждой строкой отчета, хотя и требует более внимательного написания запроса для корректного расчета конечного остатка (как суммы начального и оборотов).

Особенности регистра «Переданная возвратная тара» в УТ 11.3

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

Помните, что Регистратор в УТ 11/ERP — это не просто ссылка на документ, это ключ к анализу движений. Если документ помечен на удаление или не проведен, он не попадет в виртуальную таблицу оборотов, но может влиять на остатки, если остались «битые» записи в регистрах. В таких случаях рекомендуется выполнить регламентную операцию «Исправление развернутых остатков» или «Тестирование и исправление».

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

← На главную