При работе со стандартными отчетами в 1С пользователи часто сталкиваются с ситуацией, когда необходимо увидеть не просто количество строк с товарами, а именно общее количество документов Заказ клиента, относящихся к конкретному контрагенту. Сложность заключается в том, что в типовых отчетах одна строка заказа часто разбивается на несколько строк по количеству номенклатурных позиций. В итоге обычный подсчет строк выдает количество товаров, а не количество документов. В этой статье мы разберем, как с помощью Системы компоновки данных (СКД) решить эту задачу максимально эффективно.
Рассмотрим основной и самый правильный способ решения проблемы в пользовательском режиме, когда у нас нет возможности менять конфигурацию или схему отчета в конфигураторе. Проанализируем механизм работы пользовательских полей в СКД. Для того чтобы система понимала, что нам нужно считать только уникальные ссылки на документы, мы будем использовать специальную агрегатную функцию.
Разберем по шагам процесс создания такого поля:
Именно в выражении итогов мы пропишем формулу, которая позволит исключить дубли заказов, возникающие из-за строк с номенклатурой. Используем следующий код:
Количество(Различные [Заказ клиента])
Важный нюанс: функция Количество(Различные ...) игнорирует значения NULL. Это означает, что если в отчете присутствуют пустые корректировки или строки без привязки к заказу, они не будут искажать итоговую цифру. Проанализируем ситуацию: если у клиента "Иванов" есть 3 заказа, и в каждом заказе по 10 позиций номенклатуры, то без функции Различные отчет показал бы число 30, а с ней — корректную цифру 3.
Когда мы создаем итоговое выражение, важно понимать, где именно оно должно отображаться. Рассмотрим подробнее настройку "Рассчитывать по...". В СКД для каждого ресурса или пользовательского поля можно указать конкретные уровни иерархии. Для детального изучения этого механизма подойдет методика настройки расчета ресурсов и пользовательских полей для разных группировок.
Если мы хотим, чтобы количество заказов отображалось только в строке с именем клиента (контрагента), нам следует:
Иногда возникает специфическая задача: нужно не просто получить общую цифру в итоге, а пронумеровать заказы так, чтобы повторяющиеся номера одного и того же заказа имели один и тот же порядковый индекс, но при этом индекс увеличивался при переходе к новому заказу. Выясним причину, почему стандартный № п/п здесь не поможет — он просто пронумерует каждую строку товара.
Для реализации такой "умной" нумерации в СКД проанализируем функцию ВычислитьВыражение. Это мощный инструмент, позволяющий делать вычисления в контексте всей выборки. Для получения накопительного итога уникальных заказов можно использовать конструкцию:
ВычислитьВыражение("Количество(Различные [Заказ])", , "Группировка", "НачалоВыборки", "ТекущаяСтрока")
Посмотрим на пример работы этой формулы:
Заказ №123 — Строка товара 1 — Счетчик: 1
Заказ №123 — Строка товара 2 — Счетчик: 1
Заказ №233 — Строка товара 1 — Счетчик: 2
Заказ №233 — Строка товара 2 — Счетчик: 2
Это позволяет сохранить структуру отчета с детальными записями (товарами), но при этом четко видеть порядковый номер документа в списке. Для решения схожих задач агрегации данных можно использовать приемы расчета нарастающего итога и дельты в СКД.
Если отчет сильно ограничен программно и не позволяет добавлять сложные выражения, рассмотрим более простые, "архитектурные" способы настройки:
Заказ клиента. В этом случае стандартный ресурс Количество, который есть почти в каждом встроенном отчете, автоматически покажет количество заказов, так как каждая строка в отчете теперь будет соответствовать одному уникальному документу.Максимум по группировке заказа и Сумма по группировке контрагента, мы получим искомое количество.Проанализируем техническую сторону вопроса. Стоит помнить, что использование оператора DISTINCT (который инициируется функцией Различные) на стороне SQL-сервера требует дополнительных ресурсов для сравнения значений и исключения дублей. Если ваш отчет строится по сотням тысяч заказов за несколько лет, использование этой функции в пользовательских полях может замедлить формирование отчета. Рекомендуем всегда устанавливать период формирования отчета, чтобы минимизировать нагрузку на сервер при подсчете уникальных значений.
Подведем итог: для решения задачи в стандартном отчете наиболее эффективным является добавление пользовательского поля-выражения с формулой Количество(Различные [Заказ клиента]), прописанной именно в итогах. Это позволяет получить точный результат без изменения конфигурации и лишних сложностей с кодом.