Как правильно настроить хронологическую сортировку документов в отчете СКД

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

При разработке отчетов по взаиморасчетам в 1С (особенно в современных конфигурациях вроде Управление торговлей 11.5, ERP 2.5 или Комплексная автоматизация 2.5) программисты часто сталкиваются с проблемой «прыгающих» документов. Вместо стройной очереди «Реализация — Оплата — Реализация» отчет выводит сначала все отгрузки, а затем все оплаты, либо сортирует их по непонятной логике. В этой статье мы подробно разберем, почему так происходит и как добиться идеальной хронологии в Системе компоновки данных (СКД). Для получения результатов без самостоятельного создания отчета можно использовать готовый отчет по анализу продаж и оплат по объектам расчетов.

Разбор основной ошибки: почему стандартная сортировка не работает

Проанализируем типичную ситуацию. Программист пишет запрос к виртуальной таблице ОстаткиИОбороты регистра накопления РасчетыСКлиентами. В качестве основного аналитического разреза используется поле ОбъектРасчетов. Логично предположить, что сортировка по ОбъектРасчетов.Дата должна решить задачу. Однако в УТ 11 ОбъектРасчетов — это не всегда документ, а ссылка на справочник Объекты расчетов. Даже если это документ, он часто является «головой» цепочки (например, Заказ клиента или Договор). Если вы сортируете по дате этого объекта, все движения в рамках одного заказа получат одинаковый вес при сортировке, и система выведет их в произвольном порядке.

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

Шаг 1: Настройка параметров виртуальной таблицы

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

  1. Установить значение параметра Периодичность в Запись или Авто.
  2. Обязательно выбрать поле Регистратор в списке выбираемых полей запроса.
  3. Выбрать поле ПериодСекунда (или Период) для точного позиционирования во времени.

Шаг 2: Правильное построение запроса

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


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втДанные.АналитикаУчетаПоПартнерам,
    втДанные.ОбъектРасчетов,
    втДанные.Регистратор,
    втДанные.ПериодСекунда,
    втДанные.СуммаПриход,
    втДанные.СуммаРасход
ИЗ
    втДанные КАК втДанные
ГДЕ
    (втДанные.СуммаПриход <> 0 ИЛИ втДанные.СуммаРасход <> 0)

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

Шаг 3: Настройка ролей полей в СКД

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

  1. Для поля ПериодСекунда установите роль Период. Укажите тип периода — 2.
  2. Для поля Регистратор также установите роль Период, тип периода — 1. Поставьте галочку Обязательное. Это предотвратит «схлопывание» разных документов, созданных в одну секунду.
  3. Для полей остатков убедитесь, что правильно указаны роли Остатки (Имя, Бух. тип, Поле выражения).

Шаг 4: Окончательная настройка сортировки в Настройках СКД

Как справедливо заметили участники обсуждения, сортировку в УПОРЯДОЧИТЬ ПО внутри запроса СКД часто игнорирует или переопределяет. Поэтому разберем, как задать порядок на уровне настроек отчета:

Перейдите на вкладку Настройки, выберите нужную группировку (или уровень Детальные записи) и перейдите на закладку Сортировка. Добавьте поля в следующем порядке:

  1. ПериодСекунда (По возрастанию) — обеспечит общую временную последовательность.
  2. Регистратор (По возрастанию) — если два документа созданы в одну секунду, 1С отсортирует их по внутреннему моменту времени (GUID или порядку в базе), что гарантирует стабильный результат.

Важный нюанс: избегайте сортировки по полю ОбъектРасчетов.Дата. Как мы выяснили ранее, это дата документа-основания. Если к одному «Заказу клиента» от 01.01.2025 относятся три реализации от 05.01.2025, 07.01.2025 и 10.01.2025, то при сортировке по дате объекта расчетов все они будут иметь «вес» первого января, и их взаимный порядок внутри списка станет непредсказуемым.

Почему документы могут «плыть» даже после настроек?

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

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

Резюме для реализации

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

  1. Используйте виртуальную таблицу ОстаткиИОбороты с периодичностью Запись.
  2. Включайте в запрос поля Регистратор и ПериодСекунда.
  3. Настраивайте роли этих полей как Период в наборе данных.
  4. Задавайте сортировку исключительно в настройках СКД (вкладка «Сортировка»), используя ПериодСекунда и Регистратор.
  5. Для детальной сверки всегда используйте в структуре отчета ветку Детальные записи. Чтобы сократить время на поиск расхождений в результатах, запустите автоматическое сравнение бухгалтерских и налоговых проводок между базами 1С.

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

← На главную