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