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