Как правильно перевести отчет по взаиморасчетам с контрагентами на СКД и обеспечить корректный расчет остатков?

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

Перевод отчетов с обычного построителя или «Универсального отчета» на Систему компоновки данных (СКД) — это стандартная задача при модернизации систем на базе 1С:Предприятие 8. Однако разработчики часто сталкиваются с тем, что в новом отчете СКД начальные и конечные остатки считаются некорректно, суммы удваиваются или не сходятся при детализации до регистратора. Особенно остро эта проблема проявляется в регистрах взаиморасчетов, где важна последовательность документов и аналитика по сделкам.

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

Анализ проблемы: почему остатки «врут»?

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

  1. Неправильная настройка ролей периодов: СКД не понимает, в каком порядке идут документы внутри одной секунды или одного дня, если не указана иерархия периодов.
  2. Отсутствие поля ПериодСекунда: Для отчетов с детализацией до регистратора это поле является критически важным для однозначного определения момента времени.
  3. Вложенные запросы: Если виртуальная таблица обернута в подзапрос, механизм «Автозаполнения» СКД может не распознать поля остатков и не назначить им нужные роли автоматически.
  4. Левые соединения (Left Join): При присоединении данных из регистров сведений (например, контактной информации или параметров агентов) количество строк в выборке может увеличиться, что приведет к суммированию одной и той же суммы остатка несколько раз.

Шаг 1: Правильная работа с виртуальными таблицами и периодами

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

Рассмотрим пример правильного выбора полей в запросе:


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

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

Шаг 2: Настройка ролей полей на вкладке «Набор данных»

Это самый ответственный этап. Выясним, как правильно проставить роли для всех участников расчета. Перейдем в конструктор схемы компоновки данных на закладку «Наборы данных».

Для полей периодов:

Поля-периоды должны иметь непрерывную нумерацию, начиная с 1. Чем меньше номер, тем более точным является период.

Для полей остатков:

Важно, чтобы парные поля (Начальный и Конечный остаток) имели одинаковое Имя группы. Проанализируем настройки:

Для измерений:

Все поля, в разрезе которых получаются остатки (Организация, Контрагент, Договор, ДокументРасчетов), должны быть отмечены флажком Измерение в колонке «Роль». Если вы забудете отметить, например, ДокументРасчетов как измерение, СКД просуммирует остатки по всем документам в одну кучу, и вы получите неверные данные в строках отчета.

Шаг 3: Проблема «Размножения» данных при соединениях

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

Как этого избежать?

  1. Используйте Связи наборов данных вместо JOIN в одном запросе. Вынесите получение контактной информации в отдельный набор данных (запрос к регистру сведений) и свяжите его с основным набором по контрагенту или торговой точке.
  2. Если используете один запрос, применяйте агрегатные функции (например, МАКСИМУМ) для полей, которые могут вызвать дублирование, и обязательно группируйте данные в подзапросе перед выводом в СКД.
  3. Получайте дополнительные данные через Вычисляемые поля, используя функции общих модулей, если это допустимо по производительности.

Шаг 4: Расчет ресурсов

На закладке «Ресурсы» необходимо правильно прописать выражения для итогов. Для ресурсов остатков выражения должны быть простыми:

Важный момент: в колонке «Рассчитывать по...» для начального и конечного остатка не нужно выбирать поля периодов. Оставьте там только бизнес-аналитику (Организация, Контрагент и т.д.) и «Общий итог».

Резюме: чек-лист для исправления отчета

Проанализируем ваш отчет по следующему списку, если он продолжает считать неверно:

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

← На главную