При работе с Системой Компоновки Данных (СКД) в 1С часто возникает необходимость добавить в отчет произвольные строки, например, "Начальный остаток" и "Конечный остаток", которые должны располагаться в самом начале и в самом конце таблицы данных, непосредственно перед общими итогами. Казалось бы, простая задача, но на практике она может вызвать затруднения, особенно если привычные методы сортировки не дают ожидаемого результата. Давайте разберем эту ситуацию подробнее и выясним, как добиться корректного вывода и упорядочивания таких строк.
Наш коллега столкнулся с ситуацией, когда потребовалось вывести в отчете СКД три блока данных:
При этом "Начальный остаток" должен быть в самом начале, а "Конечный остаток" — в самом конце, перед итогами. Распространенный и, в целом, правильный подход в таких случаях — это объединение нескольких запросов с использованием дополнительного поля для сортировки.
Наш коллега предпринял именно такой шаг, объединив три запроса:
В каждый из этих запросов было добавлено дополнительное поле, например, Порядок, которому были присвоены значения для последующей сортировки:
1 для начального остатка2 для детальных записей3 для конечного остаткаЗатем была настроена сортировка по полю Порядок. Однако, несмотря на эти действия, строка "Конечный остаток" упорно не хотела опускаться в самый конец таблицы, что свидетельствовало о том, что сортировка по каким-то причинам не отрабатывала так, как ожидалось.
Давайте проанализируем, почему наш, казалось бы, логичный подход к сортировке через дополнительное поле Порядок может давать сбой. Система Компоновки Данных имеет свои особенности обработки данных и их упорядочивания. Если поле Порядок, которое мы используем для сортировки, не учтено СКД должным образом, оно будет проигнорировано или его влияние будет недостаточным.
Основная причина заключается в том, что СКД по умолчанию упорядочивает группировки по их полям. Если поле Порядок не является ресурсом или не включено в группировку (даже если эта группировка скрыта), СКД может его игнорировать при сортировке данных, полученных из объединенных запросов. Для корректной работы сортировки по дополнительному полю, его необходимо либо сделать ресурсом, либо включить в группировку.
Мы можем выделить несколько ключевых моментов, приводящих к некорректной работе сортировки:
Порядок не является ресурсом или не участвует в группировке. Это наиболее частая причина. Если поле Порядок просто добавлено в выбранные поля, но не указано как ресурс и не включено в группировку, СКД может не знать, откуда брать значения этого поля для упорядочивания каждой строки.Для того чтобы сортировка по полю Порядок работала как надо, нам необходимо убедиться, что СКД правильно обрабатывает это поле. Мы будем действовать по шагам, используя метод объединения запросов, который наш коллега уже пробовал, но с учетом важных нюансов настройки СКД.
Создание объединенного набора данных.
Начнем с создания общего набора данных, который будет объединять информацию о начальных остатках, детальных записях и конечных остатках. Для этого нам потребуются три отдельных запроса. Каждый запрос должен формировать свой блок данных и включать поле Порядок с уникальным значением.
Например, в консоли запросов или в тексте запроса к СКД это будет выглядеть так:
ВЫБРАТЬ
"Начальный остаток" КАК Наименование,
NULL КАК Сумма, // или реальное значение начального остатка
1 КАК Порядок,
"Итоги" КАК ТипСтроки
ИЗ
КакойТоРегистрОстатки.ВиртуальнаяТаблица(ПараметрыНачальногоОстатка) // Пример
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Ссылка.Представление КАК Наименование,
Сумма КАК Сумма,
2 КАК Порядок,
"Детали" КАК ТипСтроки
ИЗ
КакойТоРегистрОстаткиИОбороты.ВиртуальнаяТаблица(ПараметрыОборотов) // Пример
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Конечный остаток" КАК Наименование,
NULL КАК Сумма, // или реальное значение конечного остатка
3 КАК Порядок,
"Итоги" КАК ТипСтроки
ИЗ
КакойТоРегистрОстатки.ВиртуальнаяТаблица(ПараметрыКонечногоОстатка) // Пример
Обратите внимание: здесь мы используем NULL для сумм в строках остатков, предполагая, что итоговые суммы будут рассчитываться отдельно или эти строки будут выводиться через макеты. Если нам нужны фактические значения остатков, мы должны их получить соответствующими запросами.
Настройка СКД: Добавление поля Порядок в ресурсы или группировку.
Это критически важный шаг. Чтобы СКД могла корректно использовать поле Порядок для сортировки, она должна "знать" о его существовании и способе его получения для каждой строки или группы.
Добавьте поле Порядок в ресурсы (если это возможно): Если поле Порядок логически может быть ресурсом (например, если оно всегда одно для группы и не требует детального вывода), мы можем добавить его на вкладку "Ресурсы" и указать для него выражение Минимум(Порядок) или Максимум(Порядок). Это позволит СКД использовать его для сортировки группировок.
Включите поле Порядок в группировку и скройте его: Это наиболее универсальный и часто используемый способ. Мы создаем новую группировку (или модифицируем существующую), добавляем в нее поле Порядок, а затем скрываем это поле, чтобы оно не отображалось в отчете. СКД будет использовать его для сортировки, но пользователь его не увидит.
Разберем по шагам:
Порядок.Порядок является частью группировки, СКД сможет по нему сортировать. Чтобы оно не выводилось в отчете, в "Выбранных полях" для этой группировки найдите поле Порядок и снимите для него флажок "Выводить". Или, если есть такая опция, установите "Только для упорядочивания".Настройка сортировки в СКД.
После того как поле Порядок было корректно включено в структуру СКД (через ресурс или скрытую группировку), мы можем настроить по нему сортировку.
Порядок в список полей сортировки.Важно: Убедитесь, что нет конфликтующих сортировок, которые могут перебить нашу сортировку по Порядку. При необходимости удалите или отключите другие сортировки для этой группировки.
Хотя описанный выше метод с полем Порядок является самым распространенным и гибким, существуют и другие подходы, которые мы можем рассмотреть в зависимости от сложности задачи и требуемой детализации.
В СКД можно задавать более сложные выражения упорядочивания для полей. Вместо простого числового поля Порядок мы можем использовать конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Это может быть полезно, если требуется более гибкое управление порядком вывода строк, например, на основе их содержимого или определенных условий.
Пример выражения упорядочивания:
ВЫБОР
КОГДА ТипСтроки = "Начальный остаток" ТОГДА 1
КОГДА ТипСтроки = "Детали" ТОГДА 2
КОГДА ТипСтроки = "Конечный остаток" ТОГДА 3
ИНАЧЕ 4
КОНЕЦ
Такое выражение мы можем указать непосредственно в поле сортировки на вкладке "Настройки" СКД, вместо обычного поля. Это позволит нам динамически определять порядок, исходя из типа строки, если мы не хотим создавать отдельное поле Порядок в запросе.
Если нам нужно не просто добавить строку, а еще и придать ей уникальное оформление или вывести специфический текст, мы можем использовать макеты СКД. Этот подход предполагает создание отдельных группировок для каждой произвольной строки (начальный и конечный остаток) и применение к ним пользовательских макетов.
Создайте отдельные группировки: Вместо объединения всего в одном запросе, мы можем создать отдельные наборы данных или использовать один набор, но создать в СКД несколько группировок. Например, группировка для начального остатка, основная группировка для детальных записей и группировка для конечного остатка.
Настройте макеты группировок:
Упорядочите группировки: Порядок вывода группировок в СКД обычно определяется их положением в дереве структуры отчета. Мы можем переместить их так, чтобы "Начальный остаток" был первым, а "Конечный остаток" — последним. При этом детальные записи должны быть между ними.
Этот метод дает максимальную гибкость в оформлении, но может быть сложнее в реализации, если требуется динамическое вычисление данных для этих строк.
В самых сложных случаях, когда стандартных возможностей СКД оказывается недостаточно для достижения желаемого результата, мы можем прибегнуть к программной компоновке отчета. Это дает нам полный контроль над процессом формирования отчета и позволяет вручную добавлять строки в табличный документ, изменять их содержимое и форматирование.
При программной компоновке мы можем:
Однако этот подход значительно сложнее и требует глубоких знаний программного API СКД и работы с табличными документами. Его стоит использовать только тогда, когда все остальные методы исчерпаны.
Если речь идет о получении стандартных начальных и конечных остатков в разрезе группировок, которые являются частью учетного механизма (например, остатки по складу, по счетам бухгалтерского учета), то это типичная задача для СКД, которая часто решается с использованием виртуальных таблиц регистров (например, ОстаткиИОбороты) и указанием соответствующих полей как ресурсов в СКД.
В этом случае, мы обычно не создаем отдельные запросы для "Начального остатка" и "Конечного остатка", а используем стандартные возможности СКД для вывода итогов:
ОстаткиИОбороты).НачальныйОстаток, Приход, Расход, КонечныйОстаток.Этот подход предпочтителен, если наши "Начальный остаток" и "Конечный остаток" являются вычисляемыми значениями, а не просто статичными строками. Однако в нашем случае, судя по описанию задачи, требуется добавить именно произвольные строки.
Для успешного добавления произвольных строк "Начальный остаток" и "Конечный остаток" в отчет СКД с корректной сортировкой, мы рекомендуем следующий подход:
Порядок с уникальными значениями (например, 1, 2, 3).Порядок в группировку СКД: Создайте группировку по этому полю или добавьте его в существующую. Это позволит СКД использовать его для сортировки.Порядок: Убедитесь, что поле Порядок не выводится в отчете, сняв соответствующий флажок в "Выбранных полях" для группировки.Порядок в список полей сортировки и установите упорядочивание "По возрастанию".Таким образом, мы гарантируем, что СКД будет корректно видеть и использовать наше поле Порядок для упорядочивания строк, помещая "Начальный остаток" в самое начало, а "Конечный остаток" — в конец таблицы перед общими итогами. Мы всегда должны помнить о том, что СКД — это мощный, но требовательный инструмент, и для его эффективного использования необходимо учитывать все нюансы его работы с данными и настройками.