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