Мы рассмотрим распространенную и достаточно сложную задачу в Системе Компоновки Данных (СКД) 1С: как добавить дополнительную колонку, содержащую значение реквизита или измерения, в "хвост" таблицы отчета, то есть после всех итоговых и ресурсных колонок, при этом не нарушая уже существующую сложную структуру отчета. Эта проблема часто возникает, когда необходимо, например, дублировать дату или какое-либо ключевое измерение в конце каждой строки для удобства восприятия на печатной форме.
Постановка проблемы:
Представьте, что у нас есть отчет СКД со следующей структурой:
Отчет _Таблица __Строки ___Измерение1,Измерение2 __Колонки ___Измерение3
В результате мы получаем таблицу вида:
_______________________Измерение3
Измерение1,Измерение2 | Ресурс____ |
Задача состоит в том, чтобы каким-либо образом добавить в "хвост" таблицы дублирующую колонку, например, с тем же Измерение1, чтобы получить нечто подобное:
_______________________Измерение3
Измерение1,Измерение2 | Ресурс____ | Измерение1
При попытке просто добавить Измерение1 в секцию колонок, мы часто сталкиваемся с тем, что Измерение3 разбивается на множество колонок Измерение1, а не появляется отдельной колонкой справа. Это происходит потому, что СКД строит иерархию колонок, и добавление измерения обычно приводит к его включению в эту иерархию, а не к появлению "отдельно стоящего" элемента. В более сложных случаях, когда в колонках уже имеется многоуровневая структура, например: Колонки _Измерение4(реквизит1) __Измерение5 ___Измерение6 _Измерение6(реквизит2), проблема становится еще острее.
Мы выяснили, что стандартная таблица СКД работает с измерениями и ресурсами несколько по-разному, и прямое добавление измерения в конец не всегда возможно без изменения общей структуры отчета. Давайте разберем несколько подходов к решению этой задачи.
Один из наиболее простых способов, который иногда может помочь, это создание пользовательского вычисляемого поля. Суть метода заключается в том, чтобы создать новое поле, которое будет дублировать значение нужного измерения, а затем это поле разместить в требуемой позиции.
Создание вычисляемого поля: Перейдите на закладку "Наборы данных" в схеме компоновки данных. Выберите основной набор данных (запрос). Перейдите на закладку "Вычисляемые поля".
Нажмите кнопку "Добавить", чтобы создать новое поле. Дайте ему понятное имя, например, Измерение1_КонецСтроки.
В поле "Выражение" укажите имя того измерения, которое вы хотите продублировать. Например, если Измерение1 это "Дата", то выражение будет просто Дата.
Дата
Если вам нужно получить только день из даты, как в примере автора, можно использовать функцию:
ДЕНЬ(Дата)
Если измерение, которое вы дублируете, является строкой или числом, выражение будет соответствующим.
Размещение поля в отчете: Перейдите на закладку "Настройки" вашего отчета. В разделе "Выбранные поля" добавьте созданное вычисляемое поле Измерение1_КонецСтроки.
Перетащите это поле в конец списка полей, выводимых в детальных записях или в группировке строк, где вы хотите его видеть. Если это таблица, то вы можете попробовать разместить его в "Выбранных полях" для горизонтальной группировки (колонок), но здесь мы снова можем столкнуться с проблемой иерархии.
Важно: Этот подход хорошо работает, если вы можете добавить это поле в группировку строк или в детальные записи. Если же вы хотите, чтобы оно появилось строго как отдельная колонка *после всех колонок-измерений и колонок-ресурсов*, без встраивания в их иерархию, то СКД может не дать такой гибкости в стандартном режиме, и это поле все равно будет восприниматься как часть иерархии колонок. Однако, для простых таблиц или если поле нужно в самом конце *строки* (а не колонки-ресурса), это может сработать.
Этот метод предоставляет максимальную гибкость и часто является наиболее эффективным для нестандартных требований к расположению элементов в отчете. Собственный макет позволяет нам вручную определить, где и как должно отображаться значение реквизита, в том числе после ресурсов или итогов, обходя ограничения стандартной компоновки.
Переход к макетам: Откройте схему компоновки данных. Перейдите на закладку "Макеты".
Нажмите кнопку "Добавить" и выберите "Макет области".
Выбор типа макета: Для нашей задачи, скорее всего, потребуется макет ячейки или макет группировки. Мы можем создать макет для конкретной ячейки, где должен отображаться наш реквизит. Например, можно создать макет для итоговой ячейки по строке.
Настройка макета:
В появившемся окне конструктора макета вы увидите табличный документ. В нужной ячейке (там, где вы хотите видеть дублирующую колонку) введите текст, например, [Измерение1] или [Измерение1_КонецСтроки], где Измерение1 — это имя вашего измерения или вычисляемого поля.
Укажите "Параметры" для этой ячейки, привязав Измерение1 к соответствующему полю из набора данных.
Вы можете настроить форматирование этой ячейки (шрифт, цвет, границы) прямо в макете.
Привязка макета к полю в настройках СКД:
Вернитесь на закладку "Настройки".
В структуре отчета (например, в группировке строк или в таблице) найдите свойства группировки или поля.
На закладке "Прочие настройки" или в свойствах соответствующего поля вы можете указать, какой макет использовать для заголовка, группировки или детальных записей.
Самый сложный момент: Как привязать этот макет к *колонке после ресурсов*. Для этого нам нужно создать макет *колонки*. Если в вашем отчете есть горизонтальные группировки (колонки), вы можете попробовать привязать макет к нужной группировке колонок или к ячейке, которая располагается после всех ресурсных колонок. Это часто требует детального анализа структуры вашего отчета СКД.
Обычно создается макет для ячейки, которая является "итогом по строке" или частью детальной записи, но размещается не там, где стандартные поля. Для этого может потребоваться более сложная настройка вложенных макетов или использование макета для "шапки/подвала" группы, который будет содержать наши данные.
Пример настройки макета ячейки:
Предположим, вы хотите вывести Измерение1 в конце каждой строки. Вы создаете макет для "Детальных записей" или для "Группировки строк". В макете, в новой колонке справа, вы помещаете параметр [Измерение1]. Затем в настройках отчета (в свойствах Детальных записей или Группировки строк) на закладке "Макеты" вы указываете ваш макет для "Области детальных записей" или "Области группировки".
Этот подход требует глубокого понимания структуры отчета СКД и может быть трудоемким, но позволяет добиться практически любого желаемого вывода.
Хотя автор темы изначально пытался избежать этого, в некоторых случаях можно перестроить группировки таким образом, чтобы нужный реквизит выводился как отдельная группировка на нужном уровне, имитируя дополнительную колонку. Однако, это может сильно изменить структуру отчета и потребовать дополнительной настройки.
Перемещение измерения: Если Измерение1, которое вы хотите продублировать, изначально находится в группировке строк, то его вывод в конце колонки может быть неочевидным.
Создание дополнительной группировки колонок: Теоретически можно попытаться создать фиктивную группировку колонок, в которую будет включено наше Измерение1. Однако, как показал автор, это часто приводит к разбиению существующих колонок (Измерение3 разбивается на Измерение1), что не является желаемым результатом.
Использование вложенных группировок строк: Если вас устроит, что Измерение1 будет выводиться не как отдельная "колонка" в конце, а как отдельная строка внутри каждой основной строки, то можно использовать вложенные группировки. Например, основная группировка по Измерение1, Измерение2, а внутри нее — еще одна "фиктивная" группировка или детальные записи, где будет выводиться только Измерение1. Это не совсем "колонка в хвосте", но может быть визуально похоже при определенном форматировании.
Важный нюанс: Этот подход может не подойти, если требуется сохранить сложную иерархию колонок (как в примере автора с Измерение4, Измерение5, Измерение6). Он чаще применим для более простых отчетов или если допустимы изменения в общей структуре таблицы.
Этот метод близок к тому, что применил автор темы, когда использовал численный ресурс Максимум(ДатаДень). Суть в том, чтобы "замаскировать" измерение под ресурс или включить его в состав полей группировки и выделить его для визуального отделения.
Добавление измерения как ресурс: Если ваше измерение является числом или датой, его можно добавить в список ресурсов. В наборе данных СКД, на закладке "Ресурсы", добавьте новое поле и в выражении укажите агрегатную функцию для вашего измерения. Например:
Максимум(Дата)
// или
Минимум(Дата)
Если Измерение1 это "Дата", то можно создать ресурс Максимум(Измерение1). Важно выбрать агрегатную функцию, которая не исказит значение для каждой строки (например, Максимум или Минимум, если на данном уровне группировки значение уникально).
Размещение ресурса: Добавьте этот новый ресурс в "Выбранные поля" отчета и разместите его после всех основных ресурсов.
Условное форматирование: Чтобы оператор не перепутал этот "ресурс" с обычными данными или чтобы он визуально отличался, используйте условное форматирование. В настройках отчета, на закладке "Условное оформление", создайте новое правило:
Для оформляемого поля выберите ваш ресурс (например, МаксимумИзмерение1).
В свойствах оформления укажите другой шрифт, цвет текста, фоновый цвет, или выделите жирным/курсивом.
Этот "колхозный" подход, как назвал его автор, может быть быстрым и эффективным решением для печати, где важна визуальная разметка, а не строгое соответствие логической структуре СКД.
Для более сложных сценариев, особенно когда требуется вывести реквизит, который не является прямым измерением текущей группировки, или когда нужно перегруппировать данные особым образом, возможно, потребуется модифицировать сам запрос набора данных СКД. Это позволяет подготовить данные таким образом, чтобы требуемая информация была доступна для вывода в виде отдельной колонки на нужном уровне.
Модификация запроса: Если у вас есть основной запрос, из которого СКД берет данные, вы можете изменить его, чтобы он включал дублирующую колонку. Это может быть сделано через:
Простое дублирование поля: Если Измерение1 уже есть в выборке, просто продублируйте его с другим псевдонимом: ВЫБРАТЬ ..., Измерение1 КАК Измерение1Основное, Измерение1 КАК Измерение1_ВКонецСтроки, ...
Вложенные запросы: Используйте вложенные запросы для вычисления или получения нужного измерения, а затем соедините его с основным набором данных.
Временные таблицы: Для сложных вычислений или объединений данных из разных источников можно использовать временные таблицы (ВТ). Вы сначала формируете данные во временной таблице, а затем выбираете из нее, добавляя нужное поле.
Пример использования временной таблицы:
Предположим, у нас есть таблица Документы.ЗаказПокупателя, и мы хотим вывести дату заказа в конце. Мы можем построить такой запрос:
ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК Заказ,
ЗаказПокупателя.Дата КАК ДатаЗаказа,
ЗаказПокупателя.Контрагент КАК Контрагент,
ЗаказПокупателя.СуммаДокумента КАК Сумма
ПОМЕСТИТЬ ВТ_ОсновныеДанные
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
;
ВЫБРАТЬ
ВТ_ОсновныеДанные.Заказ,
ВТ_ОсновныеДанные.ДатаЗаказа,
ВТ_ОсновныеДанные.Контрагент,
ВТ_ОсновныеДанные.Сумма,
ВТ_ОсновныеДанные.ДатаЗаказа КАК ДатаДляХвоста
ИЗ
ВТ_ОсновныеДанные КАК ВТ_ОсновныеДанные
В этом примере ДатаДляХвоста — это наше дублирующее поле, которое затем можно использовать как обычное поле в СКД. Оно будет доступно для размещения в выбранных полях.
Размещение поля в СКД: После того как поле ДатаДляХвоста появилось в наборе данных, его можно добавить в "Выбранные поля" на закладке "Настройки" и попытаться разместить в нужной позиции. Как и в случае с вычисляемыми полями, здесь могут быть ограничения по размещению в колонках, но для строк это работает хорошо.
Этот подход полезен, когда логика получения "хвостового" измерения сложнее, чем простое дублирование существующего поля.
Мы видим, что проблема добавления колонки-реквизита после итогов в отчете СКД, особенно с сохранением сложной иерархии колонок, не имеет одного универсального "простого" решения. Стандартные механизмы СКД стремятся выстраивать иерархию, а не просто "приклеивать" колонки сбоку.
Каждый из этих подходов имеет свои преимущества и недостатки:
Пользовательские поля — самый простой, но ограниченный в позиционировании в колонках.
Собственный макет — самый гибкий, но и самый трудоемкий, требующий детального понимания структуры макетов СКД.
Группировки — может изменить структуру отчета, подходит не всегда.
Обходной путь через ресурсы и форматирование — практичное решение для визуального отделения, но не строго логическое.
Вложенные запросы/ВТ — для сложных случаев подготовки данных, дает новое поле для работы.
Выбор конкретного метода зависит от требований к точному расположению колонки, сложности существующей структуры отчета, допустимости изменения общей логики отчета и готовности инвестировать время в разработку. В большинстве случаев комбинация этих подходов или тщательная работа с собственными макетами позволяет добиться желаемого результата.