При работе с отчетами на Системе Компоновки Данных (СКД) в 1С часто возникает необходимость отбирать данные не просто по конкретным элементам справочника, а по целым группам, включая все вложенные подгруппы и элементы. Например, нам требуется вывести отчет по продажам только для номенклатуры, входящей в определенную группу, такую как "Net sales Films" и все, что находится внутри нее.
Изначально, разработчики и пользователи сталкиваются с тем, что в стандартных настройках отбора СКД, при попытке выбрать правое значение для номенклатуры, доступно только "Пустое значение" или выбор конкретного элемента, но не группы с учетом иерархии. Это вызывает сложности, поскольку приходится либо вручную перечислять все необходимые элементы, либо настраивать отчет для каждого пользователя индивидуально, что крайне неудобно и неэффективно.
В этой статье мы подробно рассмотрим, как решить эту задачу, используя встроенные возможности СКД, а также предложим дополнительные подходы для различных сценариев.
Давайте разберем, почему возникает такая ситуация, когда в настройках отбора по номенклатуре мы видим лишь "Пустое значение". Обычно это происходит, когда поле отбора настроено на выбор элемента справочника, но не учтена возможность работы с иерархией. В результате, система предлагает либо выбрать конкретный элемент, либо оставить значение пустым, не предоставляя удобного механизма для указания целой группы.
Целью является создание такого отчета, который сможет гибко работать с группами номенклатуры. Это позволит:
Рассмотрим, как это реализовать.
Основным инструментом для решения нашей задачи является использование специального вида сравнения в СКД – "В ИЕРАРХИИ". Этот вид сравнения предназначен именно для работы с иерархическими справочниками, такими как "Номенклатура", "Контрагенты" или "Подразделения". Он позволяет нам указать родительскую группу, и система автоматически включит в отбор все элементы и подгруппы, входящие в эту родительскую группу на любом уровне вложенности.
Применение вида сравнения "В ИЕРАРХИИ" (на встроенном языке 1С он соответствует оператору "ВИерархии") значительно упрощает задачу, так как избавляет от необходимости вручную перечислять все подчиненные элементы или писать сложный код для их сбора. Он идеально подходит, когда требуется получить данные по определенной категории товаров или услуг, заданной через их группировку в справочнике.
Именно этот подход является наиболее изящным и правильным с точки зрения архитектуры СКД для решения нашей задачи.
Мы разберем процесс настройки отбора по номенклатурной группе по шагам. Эта настройка выполняется в режиме конфигуратора для схемы компоновки данных.
В конфигураторе, откройте макет отчета или отчет, содержащий схему компоновки данных (СКД). Перейдите на вкладку "Настройки". Здесь мы будем добавлять или изменять существующие отборы.
На вкладке "Настройки" в разделе "Отбор" или "Параметры" (в зависимости от структуры вашей СКД), найдите возможность добавить новый элемент отбора. Обычно это делается через кнопку "Добавить" или контекстное меню.
В качестве левого значения необходимо выбрать поле, по которому будет производиться отбор. В нашем случае, это будет поле, ссылающееся на справочник "Номенклатура", например, Номенклатура.Ссылка или Номенклатура.Код, Номенклатура.Наименование, в зависимости от того, какое поле является ключевым для вашего отчета. Наиболее универсальным и корректным выбором всегда является Номенклатура.Ссылка, так как именно она однозначно идентифицирует элемент справочника.
Это критически важный шаг. После того как вы указали левое значение, в колонке "Вид сравнения" откройте список доступных вариантов и выберите "В ИЕРАРХИИ". Если этого варианта нет, убедитесь, что тип данных левого значения является ссылкой на иерархический справочник.
В качестве правого значения отбора мы установим параметр. Это обеспечит гибкость, позволяя пользователю выбирать нужную группу при формировании отчета. Присвойте параметру понятное имя, например, &ГруппаНоменклатуры. Вы можете ввести это имя вручную или выбрать существующий параметр, если он уже создан.
После того как отбор с параметром добавлен, перейдите на вкладку "Параметры" в схеме компоновки данных. Найдите там ваш новый параметр (например, ГруппаНоменклатуры) и выполните следующие настройки:
После выполнения этих шагов, сохраните схему компоновки данных. Теперь, когда пользователь будет формировать отчет, он сможет легко выбрать нужную номенклатурную группу в поле отбора, и отчет покажет данные по всей номенклатуре, входящей в эту группу, включая все ее подгруппы.
Хотя основной метод с видом сравнения "В ИЕРАРХИИ" является наиболее универсальным, рассмотрим и другие сценарии или дополнения к нему.
В некоторых случаях, вам может потребоваться, чтобы отбор по номенклатурной группе был жестко задан и не мог быть изменен пользователем. Это так называемый фиксированный отбор. В этом случае, вместо параметра в правом значении отбора, вы можете сразу указать ссылку на предопределенный элемент справочника или на элемент, который будет найден программно.
&ГруппаНоменклатуры, вы можете прямо указать ссылку на нужную номенклатурную группу (например, "Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films")" или выбрать ее из списка, если это возможно в вашем интерфейсе). Важно также снять флаг "Включать в пользовательские настройки" для этого элемента отбора, чтобы пользователь не мог его изменить.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ (&МояФиксированнаяГруппа)
И затем для параметра &МояФиксированнаяГруппа задать значение по умолчанию или устанавливать его программно, но без возможности изменения пользователем.
Что делать, если пользователь хочет отобрать данные сразу по нескольким несвязанным группам? В этом случае для параметра, представляющего группу, на вкладке "Параметры" СКД, необходимо установить свойство "Доступен список значений". Тогда пользователь сможет выбрать несколько групп в качестве правого значения отбора, и система применит их все.
Для более сложных сценариев, когда отборы должны динамически меняться в зависимости от контекста или других действий пользователя, мы можем управлять отборами программно. Это выполняется через объекты СКД в модуле отчета или в форме.
Для программного управления отбором используются следующие объекты:
КомпоновщикНастроек: Объект, который содержит текущие настройки отчета. Через него мы получаем доступ к коллекции отборов.НастройкиКомпоновкиДанных: Свойство КомпоновщикНастроек.Настройки, представляющее собой текущие настройки компоновки данных.ОтборКомпоновкиДанных: Коллекция всех элементов отбора.ЭлементОтбораКомпоновкиДанных: Отдельный элемент отбора (например, "Номенклатура.Ссылка В ИЕРАРХИИ").ГруппаЭлементовОтбораКомпоновкиДанных: Используется для группировки нескольких элементов отбора (например, "И" или "ИЛИ").Вот пример того, как можно программно установить значение параметра группы в отчете:
// Предполагается, что "КомпоновщикНастроек" уже инициализирован,
// например, в модуле объекта отчета
// или в обработчике события формы отчета.
// Получаем текущие настройки отчета
НастройкиОтчета = КомпоновщикНастроек.Настройки;
// Ищем параметр по имени
// Убедитесь, что имя параметра совпадает с тем, что задано в СКД
ПараметрГруппа = НастройкиОтчета.ПараметрыДанных.Найти("ГруппаНоменклатуры");
Если ПараметрГруппа <> Неопределено Тогда
// Находим нужный элемент справочника "Номенклатура"
// Например, по наименованию (лучше по УИД или предопределенному)
НужнаяГруппа = Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films");
Если НужнаяГруппа <> Неопределено Тогда
// Устанавливаем значение параметра
ПараметрГруппа.Значение = НужнаяГруппа;
// Включаем использование параметра (если он был отключен)
ПараметрГруппа.Использование = Истина;
Иначе
// Обработка ситуации, если группа не найдена
Сообщить("Группа номенклатуры 'Net sales Films' не найдена.", СтатусСообщения.Внимание);
КонецЕсли;
КонецЕсли;
// Если отбор был создан как элемент отбора, а не как параметр, то работаем с коллекцией Отбор:
// ЭлементОтбора = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.Ссылка");
// ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
// ЭлементОтбора.ПравоеЗначение = Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films");
// ЭлементОтбора.Использование = Истина;
Такой подход позволяет создавать очень гибкие и динамические отчеты, где условия отбора могут меняться в зависимости от различных факторов, например, от прав пользователя или выбранных им дополнительных настроек.
При настройке отборов в СКД, особенно для работы с иерархией, мы рекомендуем учитывать следующие моменты:
Следуя этим рекомендациям, вы сможете эффективно настроить отбор по номенклатурным группам в ваших отчетах на СКД, сделав их более мощными, гибкими и удобными для использования.
Таким образом, проблема добавления номенклатурной группы для отбора в СКД легко решается с помощью вида сравнения "В ИЕРАРХИИ" и правильной настройки параметра, что обеспечивает удобство и гибкость для пользователей и разработчиков.