Как в СКД объединить контрагентов с одинаковым ИНН и разными наименованиями

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

Разберем распространенную проблему, с которой часто сталкиваются разработчики при проектировании отчетов в Системе компоновки данных (СКД). Представьте ситуацию: в вашей базе данных ведется детальный учет по торговым точкам, обособленным подразделениям или филиалам. У всех этих объектов один и тот же ИНН (поскольку это одно юридическое лицо), но разные наименования (например, "Магазин на Ленина", "Магазин на Победы").

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

Почему происходит раздвоение строк в СКД?

Проанализируем ситуацию, которая возникает у начинающих разработчиков. Основная ошибка заключается в том, что в настройках структуры отчета (на вкладке "Настройки") в состав полей группировки добавляют одновременно и ИНН, и Контрагент.Наименование (или просто Контрагент).

Поскольку СКД осуществляет группировку по уникальным комбинациям значений всех выбранных полей группировки, наличие разных строк в поле Контрагент.Наименование заставляет систему выводить каждую торговую точку в отдельную строку. Для СКД "Магазин 1" и "Магазин 2" — это разные значения, даже если у них совпадает ИНН. Чтобы группировка по ИНН сработала корректно, нам необходимо исключить детальное поле наименования из самих полей группировки и вывести его альтернативными путями.

Рассмотрим детально четыре практических способа решения этой задачи.

Способ 1. Использование агрегатных функций в ресурсах СКД (Максимум/Минимум)

Этот способ является самым простым и производительным, если вам не важно, какое именно из названий филиалов будет выведено напротив общего ИНН. Система просто возьмет первое или последнее наименование по алфавиту.

Разберем этот метод по шагам:

  1. Откройте схему компоновки данных и перейдите на вкладку "Наборы данных". Убедитесь, что у вас выбраны поля ИНН и Наименование (или ссылка Контрагент).
  2. Перейдите на вкладку "Настройки". В структуре отчета добавьте группировку только по одному полю — ИНН (или Контрагент.ИНН). Ни в коем случае не добавляйте туда само поле контрагента или его наименование.
  3. Перейдите на вкладку "Ресурсы" в верхней части конструктора СКД.
  4. Добавьте ваше поле Контрагент (или Контрагент.Наименование) в список ресурсов.
  5. В колонке "Выражение" для этого ресурса укажите агрегатную функцию:

Максимум(Контрагент.Наименование)

Или, если вы оперируете ссылками:

Максимум(Контрагент)

После этого вернитесь на вкладку "Настройки", выберите вашу группировку по ИНН и на вкладке "Выбранные поля" добавьте этот ресурс. Теперь СКД сгруппирует все продажи строго по ИНН, а в поле контрагента покажет одно из названий, не раздваивая строки отчета.

Способ 2. Объединение названий через функцию СоединитьСтроки()

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

Для реализации этого подхода выполните следующие действия:

  1. Как и в предыдущем способе, оставьте группировку в настройках структуры только по полю ИНН.
  2. Перейдите на вкладку "Ресурсы".
  3. Добавьте поле Контрагент.Наименование в ресурсы.
  4. В качестве выражения ресурса напишите формулу с использованием встроенного языка выражений СКД:

СоединитьСтроки(ТаблицаЗначений(Различные Контрагент.Наименование), ", ")

Рассмотрим, как работает эта формула. Функция ТаблицаЗначений собирает все детальные записи наименований для конкретного ИНН. Ключевое слово Различные гарантирует, что если по какому-то магазину было 100 продаж, его название не продублируется в строке 100 раз — оно запишется единожды. Функция СоединитьСтроки объединяет эти значения в одну строку, разделяя их запятой с пробелом.

В результате в строке группировки по ИНН пользователь увидит красивый и информативный результат, например: "Магазин №1, Магазин №2, Филиал Южный".

Способ 3. Группировка данных на уровне запроса

В некоторых случаях, когда отчет простой и не требует последующей сложной расшифровки пользователем (drill-down), проще и быстрее сгруппировать данные еще на этапе получения их из базы данных. Это снизит нагрузку на оперативную память сервера при компоновке результата.

Посмотрим на пример такого запроса:


ВЫБРАТЬ
    Контрагенты.ИНН КАК ИНН,
    МАКСИМУМ(Контрагенты.Наименование) КАК Наименование,
    СУММА(Продажи.СуммаОбороты) КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО Продажи.Контрагент = Контрагенты.Ссылка
СГРУППИРОВАТЬ ПО
    Контрагенты.ИНН

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

Способ 4. Использование свойства "Выражение представления"

Если вам нужно, чтобы группировка происходила по ИНН, но на экране выводилось красивое составное представление (например, "ИНН: 7712345678 (Магнат)"), можно использовать специальное свойство полей СКД.

  1. Перейдите на вкладку "Наборы данных".
  2. Найдите ваше поле ИНН.
  3. В колонке "Выражение представления" напишите формулу:

Строка(ИНН) + " (" + Выбор Когда Контрагент.Наименование Есть Null Тогда "" Иначе Контрагент.Наименование Конец + ")"

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

Методологический аспект: Партнеры и Контрагенты

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

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

← На главную