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

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Суть проблемы: Некорректная сортировка объединенных запросов в СКД

Наш коллега столкнулся с ситуацией, когда потребовалось вывести в отчете СКД три блока данных:

  1. Строка "Начальный остаток".
  2. Детальные записи.
  3. Строка "Конечный остаток".

При этом "Начальный остаток" должен быть в самом начале, а "Конечный остаток" — в самом конце, перед итогами. Распространенный и, в целом, правильный подход в таких случаях — это объединение нескольких запросов с использованием дополнительного поля для сортировки.

Наш коллега предпринял именно такой шаг, объединив три запроса:

  1. Запрос для начального остатка.
  2. Запрос для детальных записей.
  3. Запрос для конечного остатка.

В каждый из этих запросов было добавлено дополнительное поле, например, Порядок, которому были присвоены значения для последующей сортировки:

Затем была настроена сортировка по полю Порядок. Однако, несмотря на эти действия, строка "Конечный остаток" упорно не хотела опускаться в самый конец таблицы, что свидетельствовало о том, что сортировка по каким-то причинам не отрабатывала так, как ожидалось.

Почему сортировка по полю "Порядок" может не работать в СКД?

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

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

Мы можем выделить несколько ключевых моментов, приводящих к некорректной работе сортировки:

  1. Поле Порядок не является ресурсом или не участвует в группировке. Это наиболее частая причина. Если поле Порядок просто добавлено в выбранные поля, но не указано как ресурс и не включено в группировку, СКД может не знать, откуда брать значения этого поля для упорядочивания каждой строки.
  2. Сортировка задана на уровне запроса, а не СКД. Хотя мы можем задавать сортировку непосредственно в тексте запроса, СКД имеет свой собственный, более мощный и управляемый механизм упорядочивания. Настройки СКД могут переопределять или дополнять сортировку запроса, и именно настройки СКД являются приоритетными. Рекомендуется выполнять упорядочивание средствами самой СКД.
  3. Конфликт сортировок. Если для отчета задана общая сортировка, а также сортировка в группировках, то сначала будет применена сортировка отчета, а затем сортировка по полю группировки. Неправильное сочетание этих настроек может привести к непредсказуемому результату.

Решение проблемы: Корректное использование поля "Порядок" в СКД

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

  1. Создание объединенного набора данных.

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

    Например, в консоли запросов или в тексте запроса к СКД это будет выглядеть так:

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

    Обратите внимание: здесь мы используем NULL для сумм в строках остатков, предполагая, что итоговые суммы будут рассчитываться отдельно или эти строки будут выводиться через макеты. Если нам нужны фактические значения остатков, мы должны их получить соответствующими запросами.

  2. Настройка СКД: Добавление поля Порядок в ресурсы или группировку.

    Это критически важный шаг. Чтобы СКД могла корректно использовать поле Порядок для сортировки, она должна "знать" о его существовании и способе его получения для каждой строки или группы.

    1. Добавьте поле Порядок в ресурсы (если это возможно): Если поле Порядок логически может быть ресурсом (например, если оно всегда одно для группы и не требует детального вывода), мы можем добавить его на вкладку "Ресурсы" и указать для него выражение Минимум(Порядок) или Максимум(Порядок). Это позволит СКД использовать его для сортировки группировок.

    2. Включите поле Порядок в группировку и скройте его: Это наиболее универсальный и часто используемый способ. Мы создаем новую группировку (или модифицируем существующую), добавляем в нее поле Порядок, а затем скрываем это поле, чтобы оно не отображалось в отчете. СКД будет использовать его для сортировки, но пользователь его не увидит.

      Разберем по шагам:

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

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

    1. На вкладке "Настройки" отчета СКД выделим группировку, для которой нам нужна сортировка.
    2. Перейдем на вкладку "Сортировка" для этой группировки (или на общую вкладку "Сортировка" для отчета, если нам нужна глобальная сортировка).
    3. Добавим поле Порядок в список полей сортировки.
    4. Установим тип упорядочивания "По возрастанию" (для 1, 2, 3) или "По убыванию" (если бы мы использовали 3, 2, 1).

    Важно: Убедитесь, что нет конфликтующих сортировок, которые могут перебить нашу сортировку по Порядку. При необходимости удалите или отключите другие сортировки для этой группировки.

Дополнительные возможности и альтернативные решения

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

1. Сложные выражения упорядочивания

В СКД можно задавать более сложные выражения упорядочивания для полей. Вместо простого числового поля Порядок мы можем использовать конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это может быть полезно, если требуется более гибкое управление порядком вывода строк, например, на основе их содержимого или определенных условий.

Пример выражения упорядочивания:


ВЫБОР
    КОГДА ТипСтроки = "Начальный остаток" ТОГДА 1
    КОГДА ТипСтроки = "Детали" ТОГДА 2
    КОГДА ТипСтроки = "Конечный остаток" ТОГДА 3
    ИНАЧЕ 4
КОНЕЦ

Такое выражение мы можем указать непосредственно в поле сортировки на вкладке "Настройки" СКД, вместо обычного поля. Это позволит нам динамически определять порядок, исходя из типа строки, если мы не хотим создавать отдельное поле Порядок в запросе.

2. Использование макетов для вывода произвольных строк

Если нам нужно не просто добавить строку, а еще и придать ей уникальное оформление или вывести специфический текст, мы можем использовать макеты СКД. Этот подход предполагает создание отдельных группировок для каждой произвольной строки (начальный и конечный остаток) и применение к ним пользовательских макетов.

  1. Создайте отдельные группировки: Вместо объединения всего в одном запросе, мы можем создать отдельные наборы данных или использовать один набор, но создать в СКД несколько группировок. Например, группировка для начального остатка, основная группировка для детальных записей и группировка для конечного остатка.

  2. Настройте макеты группировок:

    • Для группировки "Начальный остаток" на вкладке "Макеты" создайте макет заголовка или детальных записей.
    • В этом макете мы можем указать нужный текст (например, "Начальный остаток") и оформить его по своему усмотрению.
    • Аналогично поступите для группировки "Конечный остаток".
  3. Упорядочите группировки: Порядок вывода группировок в СКД обычно определяется их положением в дереве структуры отчета. Мы можем переместить их так, чтобы "Начальный остаток" был первым, а "Конечный остаток" — последним. При этом детальные записи должны быть между ними.

Этот метод дает максимальную гибкость в оформлении, но может быть сложнее в реализации, если требуется динамическое вычисление данных для этих строк.

3. Программная компоновка отчета

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

При программной компоновке мы можем:

  1. Сформировать основную часть отчета с помощью СКД.
  2. Получить табличный документ, сформированный СКД.
  3. Программно добавить необходимые строки ("Начальный остаток", "Конечный остаток") в начало и конец этого табличного документа.
  4. При необходимости, выполнить дополнительное форматирование этих строк.

Однако этот подход значительно сложнее и требует глубоких знаний программного API СКД и работы с табличными документами. Его стоит использовать только тогда, когда все остальные методы исчерпаны.

4. Начальные и конечные остатки по группировкам (стандартный подход)

Если речь идет о получении стандартных начальных и конечных остатков в разрезе группировок, которые являются частью учетного механизма (например, остатки по складу, по счетам бухгалтерского учета), то это типичная задача для СКД, которая часто решается с использованием виртуальных таблиц регистров (например, ОстаткиИОбороты) и указанием соответствующих полей как ресурсов в СКД.

В этом случае, мы обычно не создаем отдельные запросы для "Начального остатка" и "Конечного остатка", а используем стандартные возможности СКД для вывода итогов:

  1. В наборе данных используем виртуальную таблицу регистра остатков и оборотов (например, ОстаткиИОбороты).
  2. На вкладке "Ресурсы" СКД указываем необходимые ресурсы: НачальныйОстаток, Приход, Расход, КонечныйОстаток.
  3. В настройках отчета, для каждой группировки, указываем, какие ресурсы следует выводить в заголовке/подвале группировки или в общих итогах.

Этот подход предпочтителен, если наши "Начальный остаток" и "Конечный остаток" являются вычисляемыми значениями, а не просто статичными строками. Однако в нашем случае, судя по описанию задачи, требуется добавить именно произвольные строки.

Резюме и рекомендации

Для успешного добавления произвольных строк "Начальный остаток" и "Конечный остаток" в отчет СКД с корректной сортировкой, мы рекомендуем следующий подход:

  1. Объедините три запроса: для начального остатка, детальных записей и конечного остатка. В каждом запросе добавьте вычисляемое поле Порядок с уникальными значениями (например, 1, 2, 3).
  2. Включите поле Порядок в группировку СКД: Создайте группировку по этому полю или добавьте его в существующую. Это позволит СКД использовать его для сортировки.
  3. Скройте поле Порядок: Убедитесь, что поле Порядок не выводится в отчете, сняв соответствующий флажок в "Выбранных полях" для группировки.
  4. Настройте сортировку в СКД: На вкладке "Настройки" СКД для соответствующей группировки или для отчета в целом добавьте поле Порядок в список полей сортировки и установите упорядочивание "По возрастанию".

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

← На главную