Как в 1С СКД сделать отбор по всем документам определенного вида вместо конкретного документа?

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

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

Рассмотрим причину этого ограничения платформы и разберем основные способы решения данной задачи.

Причина ограничения платформы 1С

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

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

Способ 1. Добавление поля с функцией ТИПЗНАЧЕНИЯ в запрос

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

  1. В тексте запроса создаем дополнительное поле с функцией ТИПЗНАЧЕНИЯ:
    
    ВЫБРАТЬ
        Таблица.Ссылка КАК Документ,
        ТИПЗНАЧЕНИЯ(Таблица.Ссылка) КАК ТипДокумента,
        Таблица.Сумма КАК Сумма
    ИЗ
        Документ.РеализацияТоваровУслуг КАК Таблица
    
  2. В настройках СКД на закладке Отбор выводим созданное поле ТипДокумента в пользовательские настройки.
  3. В режиме «1С:Предприятие» при выборе значения для поля ТипДокумента откроется стандартное окно выбора типа. Пользователь выбирает сам тип (например, Документ ссылка: Реализация товаров и услуг), и отчет автоматически формируется по всем документам этого вида.

Способ 2. Использование параметров отчета и оператора ССЫЛКА

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

  1. На закладке Параметры схемы компоновки данных добавляем параметр ВидДокумента (тип Строка) и прописываем доступные значения: «Реализация», «Поступление», «Все».
  2. В тексте запроса набора данных накладываем условие через оператор ССЫЛКА:
    
    ВЫБРАТЬ
        Продажи.Ссылка КАК Документ,
        Продажи.Сумма КАК Сумма
    ИЗ
        СоставнаяТаблица КАК Продажи
    ГДЕ
        (&ВидДокумента = "Реализация" И Продажи.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг)
        ИЛИ (&ВидДокумента = "Поступление" И Продажи.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг)
        ИЛИ &ВидДокумента = "Все" ИЛИ &ВидДокумента = ""
    
  3. Выводим параметр ВидДокумента в пользовательские настройки отчета.

Способ 3. Расширение языка запросов СКД и оператор ВЫРАЗИТЬ

Посмотрим, как применить механизмы языка компоновки данных для разделения составного поля на отдельные типизированные поля.

  1. В тексте запроса в блоке необязательных условий {ГДЕ ...} явным образом приводим ссылки к конкретным типам:
    
    ВЫБРАТЬ
        Таблица.Ссылка КАК Документ,
        Таблица.Сумма КАК Сумма
    ИЗ
        ДокументыТаблица КАК Таблица
    {ГДЕ
        (ВЫРАЗИТЬ(Таблица.Ссылка КАК Документ.РеализацияТоваровУслуг)).* КАК Реализация,
        (ВЫРАЗИТЬ(Таблица.Ссылка КАК Документ.ПоступлениеТоваровУслуг)).* КАК Поступление}
    
  2. В списке доступных полей отбора появятся отдельные реквизиты под каждый вид документа, что позволит накладывать отборы без выбора конкретных ссылок.

Способ 4. Программная обработка в модуле объекта отчета

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

  1. В модуле объекта отчета используем обработчик события ПриКомпоновкеРезультата.
  2. Перед формированием макета перехватываем пользовательские настройки и добавляем необходимые условия в отбор:
    
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ИмеющиесяДанные, СтандартнаяОбработка)
        
        СтандартнаяОбработка = Ложь;
        
        Настройки = КомпоновщикНастроек.ПолучитьНастройки();
        
        // Формирование макета и вывод результатов
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
        
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
        
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВБумажныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновки);
        
    КонецПроцедуры
    

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

← На главную