Как правильно настроить отчет СКД по регистру накопления с группировкой по регистратору?

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

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

В этой статье мы подробно разберем, почему так происходит, и как правильно настроить виртуальную таблицу ОстаткиИОбороты, чтобы получить аккуратный и достоверный отчет.

Разбор проблемы: почему данные отображаются неверно?

Рассмотрим стандартную ситуацию. У нас есть регистр накопления ОстаткиМатериалов. Мы строим запрос к виртуальной таблице ОстаткиИОбороты, выбирая поля Материал, Регистратор, Период и ресурсы (остатки и обороты). Проблемы обычно проявляются в двух вариантах:

  1. Группировка по полю Период: Вместо ссылки на документ в отчете отображается только дата и время. Это происходит потому, что Период — это точка на временной оси, а не сам объект-документ.
  2. Группировка по полю Регистратор: В отчете появляются строки с пустым регистратором, но заполненными начальными остатками, или остатки «размазываются» по строкам так, что итоговая сумма кажется ошибочной. Это следствие стандартного поведения виртуальной таблицы, которая пытается дополнить данные для корректного отображения временных интервалов.

Решение №1: Изменение метода дополнения

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

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

Чтобы исправить ситуацию, выполним следующие шаги:

  1. Откроем Конструктор запроса в наборе данных СКД.
  2. Перейдем к параметрам виртуальной таблицы ОстаткиИОбороты.
  3. Установим значение параметра Метод дополнения в Движения.

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

Решение №2: Правильная настройка ролей полей

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

Для корректного вывода регистратора рекомендуется использовать следующую схему настройки ролей:

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

Пример правильного текста запроса

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


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

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

Особенности работы с «Моментом времени»

Проанализируем ситуацию, когда несколько документов имеют одинаковую дату и время. В 1С документ характеризуется не только временем, но и Моментом времени (сочетание даты и ссылки). Когда мы выводим отчет с периодичностью Регистратор, СКД фактически использует момент времени для сортировки.

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

Итоги и рекомендации

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

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

← На главную