Как в СКД вывести расчетное поле только в итогах и скрыть его в детальных записях?

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

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

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

Почему расчет разностей в запросе — это методологическая ошибка

Многие начинающие разработчики пытаются решить эту задачу «в лоб» — еще на уровне SQL-запроса, прописывая разность полей в выражении выборки:


Выбрать
    ЗаказПокупателя,
    Номенклатура,
    КоличествоЗаказано,
    КоличествоЗарезервировано,
    КоличествоЗаказано - КоличествоЗарезервировано Как МожноЗарезервировать
Из
    РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК Заказы

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

Правильный методологический подход в СКД — всегда рассчитывать разность именно на уровне ресурсов как разность итоговых сумм:

Сумма(КоличествоЗаказано) - Сумма(КоличествоЗарезервировано)

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

Способ 1. Создание пустого вычисляемого поля (Лайфхак с форума)

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

  1. Перейдем в схему компоновки данных на вкладку «Вычисляемые поля».
  2. Добавим новое поле с именем МожноЗарезервировать. Поле «Выражение» оставим абсолютно пустым (или укажем в нем Null), чтобы в детальных записях отчета система возвращала пустое значение.
  3. Перейдем на вкладку «Ресурсы».
  4. Добавим наше вычисляемое поле МожноЗарезервировать в список ресурсов.
  5. В колонке «Выражение» пропишем формулу расчета для итогов: Сумма(КоличествоЗаказано) - Сумма(КоличествоЗарезервировано).
  6. В колонке «Рассчитывать по...» укажем конкретные группировки (например, Заказ) и Общий итог, для которых этот расчет должен выполняться.

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

Способ 2. Настройка «Рассчитывать по...» в ресурсах без создания лишних полей

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

Выполним следующие настройки на вкладке «Ресурсы»:

  1. Добавим поле МожноЗарезервировать в список ресурсов в первый раз. В поле «Выражение» укажем 0, Null или пустую строку "". В колонке «Рассчитывать по...» выберем значение Детальные записи.
  2. Добавим это же поле МожноЗарезервировать в список ресурсов во второй раз. В поле «Выражение» напишем нашу формулу: Сумма(КоличествоЗаказано) - Сумма(КоличествоЗарезервировано). В колонке «Рассчитывать по...» укажем те уровни группировок, где нам необходим расчет (например, ОбщийИтог или конкретная аналитика, например, ЗаказПокупателя).

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

Способ 3. Отключение автополей в настройках детальных записей

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

  1. Перейдем на вкладку «Настройки» схемы компоновки данных.
  2. В структуре отчета найдем и выделим группировку Детальные записи.
  3. В нижней части окна перейдем на вкладку «Выбранные поля».
  4. По умолчанию там стоит флажок «Авто». Снимем этот флажок.
  5. Вручную перенесем из списка доступных полей в выбранные поля все реквизиты, которые должны отображаться в детальных строках (например, Номенклатура, Заказано, Зарезервировано). Важно: поле МожноЗарезервировать переносить сюда не нужно.
  6. Для вышестоящих группировок (например, по заказам или складам) и для всего отчета в целом оставим автополя включенными или вручную добавим туда поле МожноЗарезервировать.

В результате в детальных строках колонка просто не будет выводиться (или останется пустой в зависимости от общей структуры таблицы), а в строках группировок и в общих итогах данные отобразятся в полном объеме.

Способ 4. Использование механизмов условного оформления

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

Разберем алгоритм настройки условного оформления:

  1. Перейдем в настройки отчета на вкладку «Условное оформление».
  2. Добавим новый элемент оформления.
  3. В свойстве «Оформление» найдем параметр «Текст», установим флажок и оставим поле значения абсолютно пустым (или введем пробел).
  4. В списке «Оформляемые поля» выберем наше поле МожноЗарезервировать.
  5. В списке «Условие» нам необходимо задать правило, которое определит, что строка является детальной записью. Для этого можно использовать системное поле уровня группировки. Например, добавим условие: СистемныеПоля.УровеньВГруппировке Больше 1 или настроим отбор по отсутствию заполнения ключевой группировочной аналитики (например, когда Заказ заполнен, а подчиненные детальные записи выводятся ниже).

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

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

← На главную