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