Как правильно посчитать количество уникальных заказов в стандартном отчете 1С

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

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

Использование пользовательских полей-выражений

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

Разберем по шагам процесс создания такого поля:

  1. Откроем настройки отчета и перейдем на вкладку Пользовательские поля.
  2. Добавим новое поле типа Поле-выражение.
  3. В поле "Выражение детальных записей" можно оставить пустое значение или указать само поле заказа, но критически важным для нас является раздел Выражение итоговых записей.

Именно в выражении итогов мы пропишем формулу, которая позволит исключить дубли заказов, возникающие из-за строк с номенклатурой. Используем следующий код:

Количество(Различные [Заказ клиента])

Важный нюанс: функция Количество(Различные ...) игнорирует значения NULL. Это означает, что если в отчете присутствуют пустые корректировки или строки без привязки к заказу, они не будут искажать итоговую цифру. Проанализируем ситуацию: если у клиента "Иванов" есть 3 заказа, и в каждом заказе по 10 позиций номенклатуры, то без функции Различные отчет показал бы число 30, а с ней — корректную цифру 3.

Тонкости настройки расчета по группировкам

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

Если мы хотим, чтобы количество заказов отображалось только в строке с именем клиента (контрагента), нам следует:

Метод с порядковыми номерами и уникальностью

Иногда возникает специфическая задача: нужно не просто получить общую цифру в итоге, а пронумеровать заказы так, чтобы повторяющиеся номера одного и того же заказа имели один и тот же порядковый индекс, но при этом индекс увеличивался при переходе к новому заказу. Выясним причину, почему стандартный № п/п здесь не поможет — он просто пронумерует каждую строку товара.

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


ВычислитьВыражение("Количество(Различные [Заказ])", , "Группировка", "НачалоВыборки", "ТекущаяСтрока")

Посмотрим на пример работы этой формулы:
Заказ №123 — Строка товара 1 — Счетчик: 1
Заказ №123 — Строка товара 2 — Счетчик: 1
Заказ №233 — Строка товара 1 — Счетчик: 2
Заказ №233 — Строка товара 2 — Счетчик: 2

Это позволяет сохранить структуру отчета с детальными записями (товарами), но при этом четко видеть порядковый номер документа в списке. Для решения схожих задач агрегации данных можно использовать приемы расчета нарастающего итога и дельты в СКД.

Альтернативные варианты для встроенных отчетов

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

  1. Изменение структуры группировок: Попробуем временно отключить вывод детальных записей (номенклатуры) и оставить только группировку по полю Заказ клиента. В этом случае стандартный ресурс Количество, который есть почти в каждом встроенном отчете, автоматически покажет количество заказов, так как каждая строка в отчете теперь будет соответствовать одному уникальному документу.
  2. Использование фиктивных полей: В некоторых случаях (если есть доступ к изменению схемы) программисты добавляют в запрос поле-константу со значением 1. Если настроить итоги этого поля как Максимум по группировке заказа и Сумма по группировке контрагента, мы получим искомое количество.

Производительность и влияние на скорость

Проанализируем техническую сторону вопроса. Стоит помнить, что использование оператора DISTINCT (который инициируется функцией Различные) на стороне SQL-сервера требует дополнительных ресурсов для сравнения значений и исключения дублей. Если ваш отчет строится по сотням тысяч заказов за несколько лет, использование этой функции в пользовательских полях может замедлить формирование отчета. Рекомендуем всегда устанавливать период формирования отчета, чтобы минимизировать нагрузку на сервер при подсчете уникальных значений.

Подведем итог: для решения задачи в стандартном отчете наиболее эффективным является добавление пользовательского поля-выражения с формулой Количество(Различные [Заказ клиента]), прописанной именно в итогах. Это позволяет получить точный результат без изменения конфигурации и лишних сложностей с кодом.

← На главную