При построении отчетов и аналитических выборок в платформе 1С:Предприятие часто возникает задача: вывести определенный признак (например, булево значение ИСТИНА или специальный текст) исключительно в строке итогов или группировки, оставив детальные строки пустыми. Разберем особенности работы секции ИТОГИ в языке запросов и рассмотрим практические способы реализации такого вывода.
Проанализируем базовый запрос, с которым столкнулся автор:
ВЫБРАТЬ
"Документы" КАК поле1,
"ЗаказПокупателя" КАК поле2,
"Товары" КАК поле3,
ИСТИНА КАК Поле4
ПОМЕСТИТЬ ВТ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.поле1 КАК поле1,
ВТ.поле2 КАК поле2,
ВТ.поле3 КАК поле3,
ВТ.Поле4 КАК Поле4
ИЗ
ВТ КАК ВТ
ИТОГИ
Поле4 КАК Поле4
ПО
поле1,
поле2,
поле3,
Поле4
В языке запросов 1С механизм итогов агрегирует данные, которые уже присутствуют в детальной выборке. Если поле заполнено в детальных строках, оно по умолчанию попадает и в детальные записи, и в расчет итогов. Напрямую в одном запросе с секцией ИТОГИ нельзя указать, чтобы детальная запись была пустой, а в итоговой строке появилось вычисленное значение. Для решения этой задачи используются три основных подхода.
Наиболее правильным и гибким инструментом для управления выводом итоговых и детальных записей является Система компоновки данных. СКД позволяет настраивать расчет ресурсов отдельно для каждого уровня группировок.
Перейдем на вкладку Ресурсы. Добавим поле Поле4. В колонке Рассчитывать по... укажем только те группировки, в которых требуется выводить значение (например, поле1). Для детальных записей ресурс рассчитываться не будет, и колонка останется пустой.
В поле выражения можно задать логическое условие:
Выбор Когда Поле4 = Истина Тогда Истина Иначе Неопределено Конец
Если необходимо полностью скрыть значение в детальных записях, на вкладке Настройки перейдем в Условное оформление. Добавим элемент оформления:
Поле4Если необходимо скрыть стандартный вывод "Да" / "Нет", в свойствах поля на вкладке Наборы данных настроим строку формата:
БЛ=; БИ=Истина (где БЛ= скрывает значение Ложь).
Если вывод строится программно во встроенном языке с формированием объекта ТабличныйДокумент или дерева значений, разберем обход результата запроса с проверкой типа записи.
При использовании метода Выбрать() с параметром ОбходРезультатаЗапроса.ПоГруппировкам платформа возвращает свойство ТипЗаписи(), которое позволяет точно определить, какая строка обрабатывается в текущий момент.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ""Документы"" КАК Поле1,
| ""ЗаказПокупателя"" КАК Поле2,
| ""Товары"" КАК Поле3,
| ИСТИНА КАК Поле4
|ПОМЕСТИТЬ ВТ
|;
|ВЫБРАТЬ
| ВТ.Поле1 КАК Поле1,
| ВТ.Поле2 КАК Поле2,
| ВТ.Поле3 КАК Поле3,
| ВТ.Поле4 КАК Поле4
|ИЗ
| ВТ КАК ВТ
|ИТОГИ
| МАКСИМУМ(Поле4) КАК Поле4
|ПО
| Поле1,
| Поле2";
РезультатЗапроса = Запрос.Выполнить();
// Обход по группировкам первого уровня
ВыборкаПоле1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоле1.Следующий() Цикл
// Проверяем тип записи: для итогов выводим значение, для остальных скрываем
Если ВыборкаПоле1.ТипЗаписи() = ТипЗаписиВыборки.ИтогПоГруппировке Тогда
ЗначениеДляВывода = ВыборкаПоле1.Поле4;
Иначе
ЗначениеДляВывода = "";
КонецЕсли;
ВыборкаДетали = ВыборкаПоле1.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
// В детальных записях явно очищаем вывод
ЗначениеДеталей = "";
КонецЦикла;
КонецЦикла;
Если требуется получить готовый набор строк непосредственно из текста запроса без применения секции ИТОГИ, объединим строки группировок и детальные записи вручную:
ВЫБРАТЬ
"Документы" КАК Поле1,
"ЗаказПокупателя" КАК Поле2,
"Товары" КАК Поле3,
ИСТИНА КАК Поле4
ПОМЕСТИТЬ ВТ
;
////////////////////////////////////////////////////////////////////////////////
// Итоговые строки (значение выводится)
ВЫБРАТЬ
ВТ.Поле1 КАК Поле1,
"" КАК Поле2,
"" КАК Поле3,
ИСТИНА КАК Поле4,
1 КАК ПорядокСтрок
ИЗ
ВТ КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.Поле1
ОБЪЕДИНИТЬ ВСЕ
// Детальные строки (значение скрыто)
ВЫБРАТЬ
ВТ.Поле1,
ВТ.Поле2,
ВТ.Поле3,
ЛОЖЬ КАК Поле4,
2 КАК ПорядокСтрок
ИЗ
ВТ КАК ВТ
УПОРЯДОЧИТЬ ПО
Поле1,
ПорядокСтрок
Таким образом, для интерактивных отчетов оптимальным выбором является СКД с настройкой расчета ресурсов по конкретным группировкам, а для пакетной обработки данных или генерации печатных форм — программный обход выборки с анализом ТипЗаписиВыборки.