Суммирует значения всех строк в указанной колонке. Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число. Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться. Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться. Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Синтаксис
Итог(<Колонка>, <ВключатьПодчиненные>)Примеры платформы
СтоимостьПродукции = СтрокиСостава.Итог("Сумма");Полное описание, параметры и ограничения
КоллекцияСтрокДереваЗначений.Итог (ValueTreeRowCollection.Total)
КоллекцияСтрокДереваЗначений (ValueTreeRowCollection)
Итог (Total)
Доступен, начиная с версии 8.0.
Синтаксис:
Итог(<Колонка>, <ВключатьПодчиненные>)
Параметры:
<Колонка> (обязательный)
Тип: Число, Строка, КолонкаДереваЗначений.
Колонка, по которой подсчитывается итог.
В качестве значения параметра может быть передан индекс колонки, имя колонки, либо колонка дерева значений.
<ВключатьПодчиненные> (необязательный)
Тип: Булево.
Определяет, будут ли включены в сумму итоги по подчиненным строкам (если таковые имеются). Истина - итоги будут включены.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: Число, Неопределено.
Описание:
Суммирует значения всех строк в указанной колонке.
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
СтоимостьПродукции = СтрокиСостава.Итог("Сумма");
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Преобразовать дерево формы на сервере и вернуть обработанную копию
ДанныеФормыДерево и ДеревоЗначений — разные типы. Сервер получает значение, копирует его, меняет количество и возвращает копию в реквизит формы.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
В учебной базе создайте новую внешнюю обработку УчебноеДерево с пустой управляемой основной формой. Каждую задачу размещайте в отдельной копии формы.
Не создавайте вручную реквизит Категории и элементы ДеревоКатегорий: код создаёт их программно.
В свойствах формы → События назначьте ПриСозданииНаСервере одноимённой процедуре из кода. Остальные процедуры вставьте полностью на уровне модуля.
Сохраните собственную EPF и откройте в 1С через Файл → Открыть. Данные Книга/Ручка создаются только в памяти формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
Новые.Добавить(Новый РеквизитФормы("Категории", Новый ОписаниеТипов("ДеревоЗначений")));
Новые.Добавить(Новый РеквизитФормы("Название", Новый ОписаниеТипов("Строка"), "Категории"));
Новые.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "Категории"));
ЭтаФорма.ИзменитьРеквизиты(Новые);
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
Дерево.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Группа = Дерево.Строки.Добавить();
Группа.Название = "Канцелярия";
Книга = Группа.Строки.Добавить();
Книга.Название = "Книга";
Книга.Количество = 3;
Ручка = Группа.Строки.Добавить();
Ручка.Название = "Ручка";
Ручка.Количество = 1;
Резерв = Дерево.Строки.Добавить();
Резерв.Название = "Резерв";
ЭтаФорма.ЗначениеВРеквизитФормы(Дерево, "Категории");
Таблица = Элементы.Добавить("ДеревоКатегорий", Тип("ТаблицаФормы"));
Таблица.ПутьКДанным = "Категории";
Таблица.Отображение = ОтображениеТаблицы.Дерево;
Таблица.Заголовок = "Учебные категории — данные только в памяти";
Таблица.АвтоВводНовойСтроки = Ложь;
Таблица.АвтоВводНезаполненного = Ложь;
Для Каждого ИмяКолонки Из СтрРазделить("Название,Количество", ",") Цикл
Поле = Элементы.Добавить("Категории" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "Категории." + ИмяКолонки;
Поле.Заголовок = ИмяКолонки;
КонецЦикла;
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Серверная обработка дерева";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Процедура УчебноеДействие(Команда)
ОбработатьДеревоНаСервере();
Корни = Категории.ПолучитьЭлементы();
Дети = Корни.Получить(0).ПолучитьЭлементы();
Сообщить(Дети.Количество() = 3);
Сообщить(Дети.Получить(0).Количество = 7);
Итого = 0;
Для Каждого Товар Из Дети Цикл
Итого = Итого + Товар.Количество;
КонецЦикла;
Сообщить(Итого = 10);
КонецПроцедуры
&НаСервере
Процедура ОбработатьДеревоНаСервере()
Исходное = ЭтаФорма.РеквизитФормыВЗначение("Категории", Тип("ДеревоЗначений"));
Если Исходное.Строки.Количество() <> 2 Тогда
ВызватьИсключение "Урок рассчитан на две собственные категории";
КонецЕсли;
Копия = Исходное.Скопировать();
Группа = Копия.Строки.Получить(0);
Группа.Строки.Получить(0).Количество = 7;
Найденные = Группа.Строки.НайтиСтроки(Новый Структура("Название", "Скрепки"));
Если Найденные.Количество() = 0 Тогда
Скрепки = Группа.Строки.Добавить();
Скрепки.Название = "Скрепки";
Скрепки.Количество = 2;
КонецЕсли;
Сообщить("Количество Книги до обработки: " + Строка(Исходное.Строки.Получить(0).Строки.Получить(0).Количество));
Сообщить(Копия.Строки.Итог("Количество", Истина) = 10);
ЭтаФорма.ЗначениеВРеквизитФормы(Копия, "Категории");
КонецПроцедуры
Разбор по шагам
Клиентская команда вызывает серверную процедуру формы с контекстом формы.
РеквизитФормыВЗначение восстанавливает ДеревоЗначений. Обычные методы дерева теперь доступны на сервере.
Скопировать отделяет изменения: исходное дерево текущего вызова не меняется, работа идёт с Копией.
Книга получает количество 7; Скрепки 2 добавляются только при отсутствии, поэтому повторная команда не создаёт дубликаты.
Итог с ВключатьПодчиненные Истина суммирует значения детей. У групп количество ноль, их повторное суммирование не завышает результат.
ЗначениеВРеквизитФормы возвращает копию. Клиент заново получает строки, не использует старые идентификаторы до замены дерева.
Как проверить результат
Первое нажатие: количество исходной Книги 3, в форме после обработки 7.
Книга 7, Ручка 1, Скрепки 2; общий итог 10.
Повторная команда сохраняет три товара и итог 10, без второй строки Скрепки.
Ожидаемый результат
Полный цикл дерево формы → серверное значение → копия → дерево формы показан на изменяемых учебных данных.
На что обратить внимание
После замены дерева старые ссылки на строки и их идентификаторы не следует считать действительными.
Дерево не записывается в информационную базу: нет объекта документа и команды Записать.
При вычислении итогов не храните одинаковую сумму и в группе, и в её детях без отдельного правила суммирования.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Найти товар внутри категории и посчитать вложенное количество
Явно включаем вложенные строки при поиске и суммировании. Значения категорий равны нулю, поэтому количество не задваивается.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Выполняйте на сервере. Не записывайте итог 5 в количество самой группы перед суммированием.
Два вложенных товара имеют один код A-01 и количества 2 и 3.
Числовая колонка имеет явные квалификаторы: 1 разряд, 0 дробных, неотрицательный знак, диапазон 0–9. Нулевое количество группы и количества 2 и 3 входят в него; сумма потомков равна 5.
Категории = Новый ДеревоЗначений;
Категории.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Категории.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)));
Группа = Категории.Строки.Добавить();
Группа.Код = "Группа";
Для Номер = 1 По 2 Цикл
Товар = Группа.Строки.Добавить();
Товар.Код = "A-01";
Товар.Количество = Номер + 1;
КонецЦикла;
БезВложенных = Категории.Строки.Найти("A-01", "Код", Ложь);
Сообщить(БезВложенных = Неопределено);
ПервыйТовар = Категории.Строки.Найти("A-01", "Код", Истина);
Если ПервыйТовар <> Неопределено Тогда
Сообщить(ПервыйТовар.Количество);
КонецЕсли;
ВсеТовары = Категории.Строки.НайтиСтроки(Новый Структура("Код", "A-01"), Истина);
Сообщить(ВсеТовары.Количество());
Сообщить(Категории.Строки.Итог("Количество", Ложь));
Сообщить(Категории.Строки.Итог("Количество", Истина));
Категории.Строки.Сортировать("Количество Убыв", Истина);
Сообщить(Группа.Строки.Получить(0).Количество);Разбор по шагам
Создаём одну корневую группу и двух вложенных товаров.
Найти с Ложь проверяет только текущий уровень; с Истина ищет и во вложенных коллекциях.
НайтиСтроки возвращает массив всех совпадений; Итог с Истина суммирует также потомков.
Сортировать с Истина сортирует каждую вложенную коллекцию; строки не выравниваются в общий список.
Как проверить результат
Без вложенных строк товар не найден; первый найденный товар имеет количество 2, все совпадения — 2 строки.
Итог только корня равен 0, с потомками — 5; после сортировки первым внутри группы идёт количество 3.
Ожидаемый результат
Правильно найдены и отсортированы вложенные товары, их общий объём — 5.
На что обратить внимание
Если родитель уже содержит сумму потомков, рекурсивный Итог задвоит её.
Поиск первой строки не заменяет поиск всех совпадений; массив НайтиСтроки хранит ссылки на существующие строки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.