Сегодня разберём функцию, с помощью которой из обычной таблицы значений 1С можно получить результат запроса с итогами и построить дерево значений.
Это может быть полезно в некоторых практических задачах, таких как:
- Построение отчёта
- Иерархический просмотр данных, в том числе консолидированных значений
- Обход элементов таблицы в заданном порядке.
Чтобы наглядно показать работу функции ПолучитьЗапросСИтогами была создана внешняя обработка 1С «Запрос с итогами». Скачать её можно по ссылке ниже.
При открытии обработки формируется таблица из следующих колонок:
- НоменклатурнаяГруппа (группировочное поле)
- Номенклатура
- Количество (функция расчёта — количество)
- Цена (функция расчёта — максимум)
- Сумма (функция расчёта — сумма).
Колонки «Количество», «Цена», «Сумма» — используются для исчисления итогов. Группировать значения будем по номенклатурным группам. В обработке можно добавлять свои строки в таблицу «Товары», чтобы проверить как строится дерево значений. Построение дерева на вкладке «Дерево товаров» происходит при нажатии кнопки «Выполнить».
В функции ПолучитьЗапросСИтогами доступны следующие операции для расчёта итоговых значений:
- СУММА – сложение значений
- МИНИМУМ – минимум из представленных значений в группе
- МАКСИМУМ – максимум из представленных значений в группе
- КОЛИЧЕСТВО – количество позиций в группе
- СРЕДНЕЕ – среднее из представленных значений.
Теперь рассмотрим код обработки 1С. Текст обработки приведён под управляемые формы. Для формирования запроса с итогами воспользуемся следующим кодом 1С:
1 2 3 | ТЗТовары = Объект.Товары.Выгрузить(); ОбъектФормы = РеквизитФормыВЗначение("Объект"); РезультатЗапроса = ОбъектФормы.ПолучитьЗапросСИтогами(ТЗТовары, "НоменклатурнаяГруппа", "Количество, Цена, Сумма", "КОЛИЧЕСТВО, МАКСИМУМ, СУММА"); |
Выведем получившееся дерево значений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ТоварыДерево = РеквизитФормыВЗначение("РеквизитДерево"); ТоварыДерево.Строки.Очистить(); ВыборкаНГ = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "НоменклатурнаяГруппа"); Пока ВыборкаНГ.Следующий() Цикл ВыборкаДЗ = ВыборкаНГ.Выбрать(); ЗаписьДереваНГ = ТоварыДерево.Строки.Добавить(); ЗаполнитьЗначенияСвойств(ЗаписьДереваНГ, ВыборкаНГ); Пока ВыборкаДЗ.Следующий() Цикл ЗаписьДереваДЗ = ЗаписьДереваНГ.Строки.Добавить(); ЗаполнитьЗначенияСвойств(ЗаписьДереваДЗ, ВыборкаДЗ); КонецЦикла; КонецЦикла; ЗначениеВРеквизитФормы(ТоварыДерево, "РеквизитДерево"); |
Основная функция ПолучитьЗапросСИтогами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | // Получает результат запроса с итогами по данной таблице. // // Параметры: // Таблица - <ТаблицаЗначений> - Таблица значений; // СтрокаГруппировки - <Строка> - Строка с именами полей, разделённых запятыми, группировок итогов; // СтрокаИтогов - <Строка> - Строка с именами, разделённых запятыми, вычисляемых полей итогов; // СпособВычисления - <Строка> - Способы вычисления полей итогов: СУММА, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, СРЕДНЕЕ. // Если этот параметр не указан, то по умолчанию будет использоваться функция СУММА; // // Возвращаемое значение: // <РезультатЗапроса> - Результат запроса с обходом элементов по заданным группировкам итогов. // Функция ПолучитьЗапросСИтогами(Таблица, СтрокаГруппировки, СтрокаИтогов, СпособВычисления = Неопределено) Экспорт МассивГруппировки = РазобратьСтрокуВМассивПоРазделителю(СтрокаГруппировки, , Истина); МассивИтогов = РазобратьСтрокуВМассивПоРазделителю(СтрокаИтогов, , Истина); МассивСпособовВычисления = ?(СпособВычисления = Неопределено, Неопределено, РазобратьСтрокуВМассивПоРазделителю(СпособВычисления, , Истина)); ТекстВыборка = ""; Для Каждого ЭлементКолонка Из Таблица.Колонки Цикл ТекстВыборка = ТекстВыборка + ", | Таблица." + ЭлементКолонка.Имя + " КАК " + ЭлементКолонка.Имя; КонецЦикла; ТекстВыборка = Сред(ТекстВыборка, 4); ТекстГруппировка = ""; ТекстПорядок = ""; Для Каждого ЭлементГруппировки Из МассивГруппировки Цикл ТекстГруппировка = ТекстГруппировка + ", | " + ЭлементГруппировки; ТекстПорядок = ТекстПорядок + ", | " + ЭлементГруппировки; КонецЦикла; ТекстГруппировка = Сред(ТекстГруппировка, 4); ТекстГруппировка = ?(ПустаяСтрока(ТекстГруппировка), "", "ПО | " + ТекстГруппировка); ТекстПорядок = Сред(ТекстПорядок, 4); ТекстПорядок = ?(ПустаяСтрока(ТекстПорядок), "", "УПОРЯДОЧИТЬ ПО | " + ТекстПорядок); ТекстИтоги = ""; Индекс = 0; Для Каждого ЭлементИтоги Из МассивИтогов Цикл Способ = ?(МассивСпособовВычисления = Неопределено, "СУММА", МассивСпособовВычисления[Индекс]); ТекстИтоги = ТекстИтоги + ", | " + Способ + "(" + ЭлементИтоги + ")"; Индекс = Индекс + 1; КонецЦикла; ТекстИтоги = Сред(ТекстИтоги, 4); ТекстИтоги = ?(ПустаяСтрока(ТекстИтоги), "ИТОГИ |", "ИТОГИ | " + ТекстИтоги); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | " + ТекстВыборка + " |ПОМЕСТИТЬ Таблица |ИЗ | &Таблица КАК Таблица |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | " + ТекстВыборка + " |ИЗ | Таблица КАК Таблица | |" + ТекстПорядок + " |" + ТекстИтоги + " |" + ТекстГруппировка; Запрос.УстановитьПараметр("Таблица", Таблица); РезультатЗапроса = Запрос.Выполнить(); Возврат РезультатЗапроса; КонецФункции; |
Смело используйте этот код 1С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.
Свежие комментарии