Как отобразить значение только в строках итогов и скрыть в детальных записях запроса 1С?

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

При построении отчетов и аналитических выборок в платформе 1С:Предприятие часто возникает задача: вывести определенный признак (например, булево значение ИСТИНА или специальный текст) исключительно в строке итогов или группировки, оставив детальные строки пустыми. Разберем особенности работы секции ИТОГИ в языке запросов и рассмотрим практические способы реализации такого вывода.

Особенности работы секции ИТОГИ в языке запросов

Проанализируем базовый запрос, с которым столкнулся автор:


ВЫБРАТЬ
    "Документы" КАК поле1,
    "ЗаказПокупателя" КАК поле2,
    "Товары" КАК поле3,
    ИСТИНА КАК Поле4
ПОМЕСТИТЬ ВТ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.поле1 КАК поле1,
    ВТ.поле2 КАК поле2,
    ВТ.поле3 КАК поле3,
    ВТ.Поле4 КАК Поле4
ИЗ
    ВТ КАК ВТ
ИТОГИ
    Поле4 КАК Поле4
ПО
    поле1,
    поле2,
    поле3,
    Поле4

В языке запросов 1С механизм итогов агрегирует данные, которые уже присутствуют в детальной выборке. Если поле заполнено в детальных строках, оно по умолчанию попадает и в детальные записи, и в расчет итогов. Напрямую в одном запросе с секцией ИТОГИ нельзя указать, чтобы детальная запись была пустой, а в итоговой строке появилось вычисленное значение. Для решения этой задачи используются три основных подхода.

Вариант 1. Использование Системы компоновки данных (СКД)

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

  1. Настройка выражения ресурса по группировкам:

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

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

    Выбор Когда Поле4 = Истина Тогда Истина Иначе Неопределено Конец
  2. Условное оформление:

    Если необходимо полностью скрыть значение в детальных записях, на вкладке Настройки перейдем в Условное оформление. Добавим элемент оформления:

    • Оформляемые поля: Поле4
    • Условие: Системные поля.УровеньВГруппировке = 3 (или проверка на детальную запись)
    • Оформление: Текст = "" (пустая строка)
  3. Форматирование булевых полей:

    Если необходимо скрыть стандартный вывод "Да" / "Нет", в свойствах поля на вкладке Наборы данных настроим строку формата:

    БЛ=; БИ=Истина (где БЛ= скрывает значение Ложь).

Вариант 2. Программный обход выборки запроса

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

При использовании метода Выбрать() с параметром ОбходРезультатаЗапроса.ПоГруппировкам платформа возвращает свойство ТипЗаписи(), которое позволяет точно определить, какая строка обрабатывается в текущий момент.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ""Документы"" КАК Поле1,
    |   ""ЗаказПокупателя"" КАК Поле2,
    |   ""Товары"" КАК Поле3,
    |   ИСТИНА КАК Поле4
    |ПОМЕСТИТЬ ВТ
    |;
    |ВЫБРАТЬ
    |   ВТ.Поле1 КАК Поле1,
    |   ВТ.Поле2 КАК Поле2,
    |   ВТ.Поле3 КАК Поле3,
    |   ВТ.Поле4 КАК Поле4
    |ИЗ
    |   ВТ КАК ВТ
    |ИТОГИ
    |   МАКСИМУМ(Поле4) КАК Поле4
    |ПО
    |   Поле1,
    |   Поле2";

РезультатЗапроса = Запрос.Выполнить();

// Обход по группировкам первого уровня
ВыборкаПоле1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоле1.Следующий() Цикл
    
    // Проверяем тип записи: для итогов выводим значение, для остальных скрываем
    Если ВыборкаПоле1.ТипЗаписи() = ТипЗаписиВыборки.ИтогПоГруппировке Тогда
        ЗначениеДляВывода = ВыборкаПоле1.Поле4;
    Иначе
        ЗначениеДляВывода = "";
    КонецЕсли;
    
    ВыборкаДетали = ВыборкаПоле1.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
        // В детальных записях явно очищаем вывод
        ЗначениеДеталей = "";
    КонецЦикла;
    
КонецЦикла;

Вариант 3. Формирование плоской структуры через ОБЪЕДИНИТЬ ВСЕ

Если требуется получить готовый набор строк непосредственно из текста запроса без применения секции ИТОГИ, объединим строки группировок и детальные записи вручную:


ВЫБРАТЬ
    "Документы" КАК Поле1,
    "ЗаказПокупателя" КАК Поле2,
    "Товары" КАК Поле3,
    ИСТИНА КАК Поле4
ПОМЕСТИТЬ ВТ
;
////////////////////////////////////////////////////////////////////////////////
// Итоговые строки (значение выводится)
ВЫБРАТЬ
    ВТ.Поле1 КАК Поле1,
    "" КАК Поле2,
    "" КАК Поле3,
    ИСТИНА КАК Поле4,
    1 КАК ПорядокСтрок
ИЗ
    ВТ КАК ВТ
СГРУППИРОВАТЬ ПО
    ВТ.Поле1

ОБЪЕДИНИТЬ ВСЕ

// Детальные строки (значение скрыто)
ВЫБРАТЬ
    ВТ.Поле1,
    ВТ.Поле2,
    ВТ.Поле3,
    ЛОЖЬ КАК Поле4,
    2 КАК ПорядокСтрок
ИЗ
    ВТ КАК ВТ

УПОРЯДОЧИТЬ ПО
    Поле1,
    ПорядокСтрок

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

← На главную