Как в СКД добавить отбор по номенклатурной группе, включая подчиненные элементы?

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

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

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

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

Анализируем исходную проблему

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

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

  1. Обеспечить удобство для конечных пользователей: они смогут самостоятельно выбирать нужную группу при формировании отчета, не прибегая к помощи программиста.
  2. Сократить затраты на поддержку: не нужно будет каждый раз настраивать отчет для новых пользователей или при изменении структуры групп.
  3. Повысить универсальность отчета: один и тот же отчет можно будет использовать для анализа данных по различным номенклатурным группам.

Рассмотрим, как это реализовать.

Ключевое решение: вид сравнения "В ИЕРАРХИИ"

Основным инструментом для решения нашей задачи является использование специального вида сравнения в СКД – "В ИЕРАРХИИ". Этот вид сравнения предназначен именно для работы с иерархическими справочниками, такими как "Номенклатура", "Контрагенты" или "Подразделения". Он позволяет нам указать родительскую группу, и система автоматически включит в отбор все элементы и подгруппы, входящие в эту родительскую группу на любом уровне вложенности.

Применение вида сравнения "В ИЕРАРХИИ" (на встроенном языке 1С он соответствует оператору "ВИерархии") значительно упрощает задачу, так как избавляет от необходимости вручную перечислять все подчиненные элементы или писать сложный код для их сбора. Он идеально подходит, когда требуется получить данные по определенной категории товаров или услуг, заданной через их группировку в справочнике.

Именно этот подход является наиболее изящным и правильным с точки зрения архитектуры СКД для решения нашей задачи.

Пошаговая настройка отбора в СКД

Мы разберем процесс настройки отбора по номенклатурной группе по шагам. Эта настройка выполняется в режиме конфигуратора для схемы компоновки данных.

  1. Открываем схему компоновки данных и переходим к настройкам отчета.

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

  2. Добавляем новый элемент отбора.

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

  3. Указываем левое значение отбора.

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

  4. Выбираем вид сравнения "В ИЕРАРХИИ".

    Это критически важный шаг. После того как вы указали левое значение, в колонке "Вид сравнения" откройте список доступных вариантов и выберите "В ИЕРАРХИИ". Если этого варианта нет, убедитесь, что тип данных левого значения является ссылкой на иерархический справочник.

  5. Настраиваем правое значение как параметр.

    В качестве правого значения отбора мы установим параметр. Это обеспечит гибкость, позволяя пользователю выбирать нужную группу при формировании отчета. Присвойте параметру понятное имя, например, &ГруппаНоменклатуры. Вы можете ввести это имя вручную или выбрать существующий параметр, если он уже создан.

  6. Конфигурируем параметры редактирования на вкладке "Параметры".

    После того как отбор с параметром добавлен, перейдите на вкладку "Параметры" в схеме компоновки данных. Найдите там ваш новый параметр (например, ГруппаНоменклатуры) и выполните следующие настройки:

    1. Установите флаг "Включать в пользовательские настройки" (или "Доступен"): Это сделает параметр видимым и редактируемым для пользователя в форме отчета.
    2. Настройте "Параметры редактирования": В колонке "Параметры редактирования" для вашего параметра нажмите на кнопку открытия (обычно это кнопка с тремя точками). Откроется окно настройки поля ввода. Здесь нам нужно указать, что пользователь может выбирать не только элементы, но и группы. Выберите режим выбора, например, "Выбор групп и элементов" или "Выбор групп". Это позволит пользователю в форме отчета удобно выбрать номенклатурную группу из справочника.
    3. Добавьте в быстрый доступ (при необходимости): Если вы хотите, чтобы этот отбор всегда был доступен на основной панели настроек отчета, добавьте его в раздел "Быстрый доступ" на вкладке "Настройки".

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

Дополнительные подходы и нюансы

Хотя основной метод с видом сравнения "В ИЕРАРХИИ" является наиболее универсальным, рассмотрим и другие сценарии или дополнения к нему.

Фиксированный отбор

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

  1. Фиксированный отбор в СКД: В схеме компоновки данных, на вкладке "Настройки" в элементе отбора, вместо параметра &ГруппаНоменклатуры, вы можете прямо указать ссылку на нужную номенклатурную группу (например, "Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films")" или выбрать ее из списка, если это возможно в вашем интерфейсе). Важно также снять флаг "Включать в пользовательские настройки" для этого элемента отбора, чтобы пользователь не мог его изменить.
  2. Фиксированный отбор в тексте запроса: Если отбор является абсолютно жестким и никогда не должен меняться, его можно заложить непосредственно в текст запроса, который используется в СКД. Например:
    
    ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.Ссылка В ИЕРАРХИИ (&МояФиксированнаяГруппа)
    

    И затем для параметра &МояФиксированнаяГруппа задать значение по умолчанию или устанавливать его программно, но без возможности изменения пользователем.

Отбор по нескольким группам

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

Программное управление отбором

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

Для программного управления отбором используются следующие объекты:

  1. КомпоновщикНастроек: Объект, который содержит текущие настройки отчета. Через него мы получаем доступ к коллекции отборов.
  2. НастройкиКомпоновкиДанных: Свойство КомпоновщикНастроек.Настройки, представляющее собой текущие настройки компоновки данных.
  3. ОтборКомпоновкиДанных: Коллекция всех элементов отбора.
  4. ЭлементОтбораКомпоновкиДанных: Отдельный элемент отбора (например, "Номенклатура.Ссылка В ИЕРАРХИИ").
  5. ГруппаЭлементовОтбораКомпоновкиДанных: Используется для группировки нескольких элементов отбора (например, "И" или "ИЛИ").

Вот пример того, как можно программно установить значение параметра группы в отчете:


// Предполагается, что "КомпоновщикНастроек" уже инициализирован,
// например, в модуле объекта отчета
// или в обработчике события формы отчета.

// Получаем текущие настройки отчета
НастройкиОтчета = КомпоновщикНастроек.Настройки;

// Ищем параметр по имени
// Убедитесь, что имя параметра совпадает с тем, что задано в СКД
ПараметрГруппа = НастройкиОтчета.ПараметрыДанных.Найти("ГруппаНоменклатуры");

Если ПараметрГруппа <> Неопределено Тогда
    // Находим нужный элемент справочника "Номенклатура"
    // Например, по наименованию (лучше по УИД или предопределенному)
    НужнаяГруппа = Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films");

    Если НужнаяГруппа <> Неопределено Тогда
        // Устанавливаем значение параметра
        ПараметрГруппа.Значение = НужнаяГруппа;
        // Включаем использование параметра (если он был отключен)
        ПараметрГруппа.Использование = Истина;
    Иначе
        // Обработка ситуации, если группа не найдена
        Сообщить("Группа номенклатуры 'Net sales Films' не найдена.", СтатусСообщения.Внимание);
    КонецЕсли;
КонецЕсли;

// Если отбор был создан как элемент отбора, а не как параметр, то работаем с коллекцией Отбор:
// ЭлементОтбора = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.Ссылка");
// ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
// ЭлементОтбора.ПравоеЗначение = Справочники.Номенклатура.НайтиПоНаименованию("Net sales Films");
// ЭлементОтбора.Использование = Истина;

Такой подход позволяет создавать очень гибкие и динамические отчеты, где условия отбора могут меняться в зависимости от различных факторов, например, от прав пользователя или выбранных им дополнительных настроек.

Практические советы

При настройке отборов в СКД, особенно для работы с иерархией, мы рекомендуем учитывать следующие моменты:

  1. Понятные наименования: Всегда давайте параметрам и элементам отбора понятные и однозначные наименования. Это облегчит работу как разработчику, так и конечному пользователю. Например, вместо "Параметр1", используйте "ГруппаНоменклатурыОтбора".
  2. Тестирование: После любых изменений в схеме компоновки данных, всегда тщательно тестируйте отчет с различными вариантами выбора группы, включая группы без элементов, с элементами на разных уровнях вложенности, а также ситуации, когда группа не выбрана.
  3. Документирование: Если отчет является сложным, документируйте принятые решения по отборам и параметрам. Это поможет при дальнейшей поддержке и развитии.
  4. Быстрый доступ: Для часто используемых отборов по группам, всегда добавляйте их в "Быстрый доступ". Это значительно улучшит юзабилити отчета для конечных пользователей.

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

Таким образом, проблема добавления номенклатурной группы для отбора в СКД легко решается с помощью вида сравнения "В ИЕРАРХИИ" и правильной настройки параметра, что обеспечивает удобство и гибкость для пользователей и разработчиков.

← На главную