Разберем распространенную проблему, с которой часто сталкиваются разработчики при проектировании отчетов в Системе компоновки данных (СКД). Представьте ситуацию: в вашей базе данных ведется детальный учет по торговым точкам, обособленным подразделениям или филиалам. У всех этих объектов один и тот же ИНН (поскольку это одно юридическое лицо), но разные наименования (например, "Магазин на Ленина", "Магазин на Победы").
Когда мы строим отчет по продажам или взаиморасчетам, руководство часто хочет видеть общую сумму отгрузок в разрезе юридических лиц (то есть сгруппированную строго по ИНН), но при этом в строке отчета обязательно должно выводиться хоть какое-нибудь текстовое наименование, чтобы отчет оставался читаемым. По умолчанию СКД при попытке добавить наименование начинает разбивать одну строку на несколько. Выясним причину этого поведения и подробно рассмотрим, как решить эту задачу несколькими эффективными способами.
Проанализируем ситуацию, которая возникает у начинающих разработчиков. Основная ошибка заключается в том, что в настройках структуры отчета (на вкладке "Настройки") в состав полей группировки добавляют одновременно и ИНН, и Контрагент.Наименование (или просто Контрагент).
Поскольку СКД осуществляет группировку по уникальным комбинациям значений всех выбранных полей группировки, наличие разных строк в поле Контрагент.Наименование заставляет систему выводить каждую торговую точку в отдельную строку. Для СКД "Магазин 1" и "Магазин 2" — это разные значения, даже если у них совпадает ИНН. Чтобы группировка по ИНН сработала корректно, нам необходимо исключить детальное поле наименования из самих полей группировки и вывести его альтернативными путями.
Рассмотрим детально четыре практических способа решения этой задачи.
Этот способ является самым простым и производительным, если вам не важно, какое именно из названий филиалов будет выведено напротив общего ИНН. Система просто возьмет первое или последнее наименование по алфавиту.
Разберем этот метод по шагам:
ИНН и Наименование (или ссылка Контрагент).ИНН (или Контрагент.ИНН). Ни в коем случае не добавляйте туда само поле контрагента или его наименование.Контрагент (или Контрагент.Наименование) в список ресурсов.
Максимум(Контрагент.Наименование)
Или, если вы оперируете ссылками:
Максимум(Контрагент)
После этого вернитесь на вкладку "Настройки", выберите вашу группировку по ИНН и на вкладке "Выбранные поля" добавьте этот ресурс. Теперь СКД сгруппирует все продажи строго по ИНН, а в поле контрагента покажет одно из названий, не раздваивая строки отчета.
Если для пользователей принципиально важно видеть, какие именно магазины вошли в эту объединенную группу, отличным решением будет собрать все уникальные наименования в одну строку через запятую.
Для реализации этого подхода выполните следующие действия:
ИНН.Контрагент.Наименование в ресурсы.
СоединитьСтроки(ТаблицаЗначений(Различные Контрагент.Наименование), ", ")
Рассмотрим, как работает эта формула. Функция ТаблицаЗначений собирает все детальные записи наименований для конкретного ИНН. Ключевое слово Различные гарантирует, что если по какому-то магазину было 100 продаж, его название не продублируется в строке 100 раз — оно запишется единожды. Функция СоединитьСтроки объединяет эти значения в одну строку, разделяя их запятой с пробелом.
В результате в строке группировки по ИНН пользователь увидит красивый и информативный результат, например: "Магазин №1, Магазин №2, Филиал Южный".
В некоторых случаях, когда отчет простой и не требует последующей сложной расшифровки пользователем (drill-down), проще и быстрее сгруппировать данные еще на этапе получения их из базы данных. Это снизит нагрузку на оперативную память сервера при компоновке результата.
Посмотрим на пример такого запроса:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
МАКСИМУМ(Контрагенты.Наименование) КАК Наименование,
СУММА(Продажи.СуммаОбороты) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Продажи.Контрагент = Контрагенты.Ссылка
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
При таком подходе СКД сразу получает уже свернутые данные, где каждому ИНН соответствует ровно одна запись и ровно одно (максимальное по алфавиту) наименование контрагента. Нам остается лишь вывести эти поля в плоскую таблицу.
Если вам нужно, чтобы группировка происходила по ИНН, но на экране выводилось красивое составное представление (например, "ИНН: 7712345678 (Магнат)"), можно использовать специальное свойство полей СКД.
ИНН.
Строка(ИНН) + " (" + Выбор Когда Контрагент.Наименование Есть Null Тогда "" Иначе Контрагент.Наименование Конец + ")"
В настройках отчета сделайте группировку по полю ИНН. СКД выполнит строгое схлопывание по числовому или строковому значению ИНН, но визуально в отчете пользователь увидит строку с названием компании.
Проанализируем ситуацию с точки зрения архитектуры учета 1С. Часто сама необходимость группировать разные элементы справочника по ИНН возникает из-за некорректно спроектированной архитектуры данных или ошибок ведения учета. В современных типовых конфигурациях 1С (таких как ERP, Комплексная автоматизация или Управление торговлей) эта проблема решена на уровне платформы за счет разделения сущностей на Партнеров и Контрагентов.
Если вы работаете в конфигурации, поддерживающей эту модель, наиболее правильным решением будет строить отчет с группировкой по полю Партнер (или Партнер.ГоловнойПартнер). Это позволит избежать "костылей" с агрегацией строк в СКД, сохраняя при этом методологическую чистоту учета и высокую скорость работы отчетов.