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