ДанныеФормыСтруктураСКоллекцией.Итог

Методы · Total

Возвращает сумму значений всех строк в указанной колонке. Итог подсчитывается только для колонок, у которых указан тип Число.

Синтаксис

Итог(<Колонка>)
Полное описание, параметры и ограничения

ДанныеФормыСтруктураСКоллекцией.Итог (FormDataStructureAndCollection.Total)

ДанныеФормыСтруктураСКоллекцией (FormDataStructureAndCollection)

Итог (Total)

Доступен, начиная с версии 8.2.

Синтаксис:
Итог(<Колонка>)
Параметры:

<Колонка> (необязательный)
Тип: Строка.
Имя колонки, по которой возвращается итог.
Возвращаемое значение:
Тип: Число.

Описание:

Возвращает сумму значений всех строк в указанной колонке.
Итог подсчитывается только для колонок, у которых указан тип Число.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Найти Книгу и выгрузить независимый снимок её полей

НайтиСтроки выдаёт ссылки на строки модели, а Выгрузить — самостоятельную серверную ТаблицуЗначений. Показываем оба варианта выгрузки.

Где и как запускать

Полный модуль управляемой формы своей внешней обработки, ПриСозданииНаСервере.

Подготовка

  1. Используйте отдельную свою конфигурацию УчебнаяКонфигурацияСинтаксиса. В Конфигураторе создайте независимый непериодический регистр сведений УчебныеСтроки. Не используйте существующий рабочий регистр.

  2. Добавьте измерения Номер типа Число (10, 0) и Товар типа Строка (64). Добавьте ресурсы Количество типа Число (10, 0), Сумма типа Число (12, 2). Обновите только свою учебную конфигурацию базы.

  3. Создайте собственную внешнюю обработку с пустой управляемой основной формой. Реквизит УчебныеЗаписи и таблицу вручную не добавляйте: их создаёт код.

  4. Вставьте весь модуль выбранного урока. В свойствах формы назначьте событию ПриСозданииНаСервере одноимённую процедуру. Сохраните EPF и откройте её в своей учебной базе.

  5. Набор создаётся пустым и заполняется только в памяти. В коде нет Прочитать, Записать, транзакций, привилегированного режима, запросов, файлов или сети. Таблица на форме только для просмотра.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("УчебныеЗаписи",
        Новый ОписаниеТипов("РегистрСведенийНаборЗаписей.УчебныеСтроки")));
    ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
    Набор = РегистрыСведений.УчебныеСтроки.СоздатьНаборЗаписей();
    Для Каждого ИсходнаяСтрока Из СтрРазделить("1|Книга|3|750;2|Ручка|1|50;3|Коробка|2|60", ";") Цикл
        Поля = СтрРазделить(ИсходнаяСтрока, "|");
        Запись = Набор.Добавить();
        Запись.Номер = Число(Поля[0]);
        Запись.Товар = Поля[1];
        Запись.Количество = Число(Поля[2]);
        Запись.Сумма = Число(Поля[3]);
    КонецЦикла;
    ЭтаФорма.ЗначениеВРеквизитФормы(Набор, "УчебныеЗаписи");
    Записи = ЭтаФорма.УчебныеЗаписи;
    Если ТипЗнч(Записи) <> Тип("ДанныеФормыСтруктураСКоллекцией") Тогда
        ВызватьИсключение "Ожидалась модель набора записей, а не обычная таблица формы";
    КонецЕсли;
    Сообщить(Записи.Количество() = 3);
    Сообщить(Записи.Итог("Сумма") = 860);
    Отбор = Новый Структура("Товар", "Книга");
    Найденные = Записи.НайтиСтроки(Отбор);
    Если Найденные.Количество() <> 1 Тогда
        ВызватьИсключение "В собственных исходных строках должна быть одна Книга";
    КонецЕсли;
    Книга = Найденные[0];
    ПоМассиву = Записи.Выгрузить(Найденные, "Товар,Количество,Сумма");
    ПоСтруктуре = Записи.Выгрузить(Отбор, "Товар,Количество,Сумма");
    Сообщить(ПоМассиву.Количество() = 1);
    Сообщить(ПоСтруктуре.Количество() = 1);
    Сообщить(ПоМассиву.Получить(0).Сумма = 750);
    Сообщить(ПоСтруктуре.Колонки.Количество() = 3);
    Книга.Количество = 4;
    Книга.Сумма = 1000;
    Сообщить(Найденные[0].Количество = 4);
    Сообщить(Найденные[0].Сумма = 1000);
    Сообщить(ПоМассиву.Получить(0).Количество = 3);
    Сообщить(ПоСтруктуре.Получить(0).Сумма = 750);
    Сообщить(Записи.Количество() = 3);
    Сообщить(Записи.Итог("Сумма") = 1110);
    Сообщить(ПоМассиву.Итог("Сумма") = 750);
    Сообщить(ПоСтруктуре.Итог("Сумма") = 750);
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаУчебныхЗаписей", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "УчебныеЗаписи";
    Таблица.Заголовок = "Только собственные строки в памяти — регистр не записывается";
    Таблица.ТолькоПросмотр = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Номер,Товар,Количество,Сумма", ",") Цикл
        Поле = ЭтаФорма.Элементы.Добавить("УчебноеПоле" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Поле.Вид = ВидПоляФормы.ПолеВвода;
        Поле.ПутьКДанным = "УчебныеЗаписи." + ИмяКолонки;
        Поле.Заголовок = ИмяКолонки;
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. Найти одну Книгу по структуре Товар=Книга, проверить количество до обращения к индексу 0.

  2. Выгрузить выбранные строки двумя способами: массивом строк и структурой отбора. Во втором аргументе указать одинаковые три колонки.

  3. Изменить только собственную Книгу в модели на количество 4 и сумму 1000. Найденные содержит живую ссылку и видит новые значения.

  4. Обе выгруженные таблицы остаются снимками с количеством 3 и суммой 750. Остальные две строки остаются в модели; отбор не удаляет их.

  5. Итог модели теперь 1000+50+60=1110. Никакой автоматической формулы суммы нет — оба значения изменяются явно.

Как проверить результат

  1. Все булевы сообщения Истина. На форме Книга 4/1000, Ручка 1/50 и Коробка 2/60.

  2. Снимки содержат только одну Книгу 3/750 и три колонки. Их итог 750, итог модели 1110.

Ожидаемый результат

Наглядно разобраны живые строки, независимые выгрузки и два родственных, но разных контракта.

На что обратить внимание

  1. Выгрузить доступен только на сервере; не переносите вызов в тонкий клиентский обработчик.

  2. НайтиСтроки возвращает ссылки, а не резервную копию. Для независимого снимка нужна выгрузка.

  3. Структура отбора этой операции не равна отбору записи регистра и не меняет SQL-запросы.

  4. Отбор не сортирует результат, а набор имён колонок не является произвольным выражением запроса.

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

Сохранить идентификатор Книги при сортировке набора

Идентификатор строки модели не равен её позиции. Проверяем собственную Книгу после сортировки и отсутствие заранее несуществующего свойства.

Где и как запускать

Полный модуль управляемой формы своей внешней обработки, ПриСозданииНаСервере.

Подготовка

  1. Используйте отдельную свою конфигурацию УчебнаяКонфигурацияСинтаксиса. В Конфигураторе создайте независимый непериодический регистр сведений УчебныеСтроки. Не используйте существующий рабочий регистр.

  2. Добавьте измерения Номер типа Число (10, 0) и Товар типа Строка (64). Добавьте ресурсы Количество типа Число (10, 0), Сумма типа Число (12, 2). Обновите только свою учебную конфигурацию базы.

  3. Создайте собственную внешнюю обработку с пустой управляемой основной формой. Реквизит УчебныеЗаписи и таблицу вручную не добавляйте: их создаёт код.

  4. Вставьте весь модуль выбранного урока. В свойствах формы назначьте событию ПриСозданииНаСервере одноимённую процедуру. Сохраните EPF и откройте её в своей учебной базе.

  5. Набор создаётся пустым и заполняется только в памяти. В коде нет Прочитать, Записать, транзакций, привилегированного режима, запросов, файлов или сети. Таблица на форме только для просмотра.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("УчебныеЗаписи",
        Новый ОписаниеТипов("РегистрСведенийНаборЗаписей.УчебныеСтроки")));
    ЭтаФорма.ИзменитьРеквизиты(Реквизиты);
    Набор = РегистрыСведений.УчебныеСтроки.СоздатьНаборЗаписей();
    Для Каждого ИсходнаяСтрока Из СтрРазделить("1|Книга|3|750;2|Ручка|1|50;3|Коробка|2|60", ";") Цикл
        Поля = СтрРазделить(ИсходнаяСтрока, "|");
        Запись = Набор.Добавить();
        Запись.Номер = Число(Поля[0]);
        Запись.Товар = Поля[1];
        Запись.Количество = Число(Поля[2]);
        Запись.Сумма = Число(Поля[3]);
    КонецЦикла;
    ЭтаФорма.ЗначениеВРеквизитФормы(Набор, "УчебныеЗаписи");
    Записи = ЭтаФорма.УчебныеЗаписи;
    Если ТипЗнч(Записи) <> Тип("ДанныеФормыСтруктураСКоллекцией") Тогда
        ВызватьИсключение "Ожидалась модель набора записей, а не обычная таблица формы";
    КонецЕсли;
    Сообщить(Записи.Количество() = 3);
    Сообщить(Записи.Итог("Сумма") = 860);
    Книга = Записи.Получить(0);
    Идентификатор = Книга.ПолучитьИдентификатор();
    Сообщить(Книга.Товар = "Книга");
    Сообщить(Записи.НайтиПоИдентификатору(Идентификатор) = Книга);
    Записи.Сортировать("Сумма Возр,Номер Возр");
    Сообщить(Записи.Индекс(Книга) = 2);
    ПослеСортировки = Записи.НайтиПоИдентификатору(Идентификатор);
    Сообщить(ПослеСортировки = Книга);
    Сообщить(ПослеСортировки.Сумма = 750);
    Сообщить(Записи.Получить(0).Товар = "Ручка");
    НайденноеЗначение = "Это значение должно быть заменено";
    ЕстьСвойство = Записи.Свойство("ЗаведомоОтсутствующееУчебноеСвойство", НайденноеЗначение);
    Сообщить(НЕ ЕстьСвойство);
    Сообщить(НайденноеЗначение = Неопределено);
    Записи.Удалить(Книга);
    Сообщить(Записи.НайтиПоИдентификатору(Идентификатор) = Неопределено);
    Сообщить(Записи.Количество() = 2);
    Сообщить(Записи.Итог("Сумма") = 110);
    Таблица = ЭтаФорма.Элементы.Добавить("ТаблицаУчебныхЗаписей", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "УчебныеЗаписи";
    Таблица.Заголовок = "Только собственные строки в памяти — регистр не записывается";
    Таблица.ТолькоПросмотр = Истина;
    Таблица.АвтоВводНезаполненного = Ложь;
    Таблица.АвтоВводНовойСтроки = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Номер,Товар,Количество,Сумма", ",") Цикл
        Поле = ЭтаФорма.Элементы.Добавить("УчебноеПоле" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Поле.Вид = ВидПоляФормы.ПолеВвода;
        Поле.ПутьКДанным = "УчебныеЗаписи." + ИмяКолонки;
        Поле.Заголовок = ИмяКолонки;
    КонецЦикла;
КонецПроцедуры

Разбор по шагам

  1. Получить именно первую Книгу собственного начального набора, сохранить её идентификатор через метод строки модели.

  2. Сортировать по сумме по возрастанию: Ручка 50, Коробка 60, Книга 750. Позиция Книги меняется с 0 на 2, идентификатор сохраняется.

  3. Свойство проверяет ключ структуры модели, а не ищет товар или колонку по значению. На заведомо отсутствующем ключе получаем Ложь и Неопределено.

  4. Удалить только строку Книги из собственной модели. НайтиПоИдентификатору теперь возвращает Неопределено; это не удаление справочника и не запись регистра.

Как проверить результат

  1. Все булевы сообщения Истина. После удаления видны Ручка 50 и Коробка 60, сумма 110.

  2. В реальном обработчике всегда проверяйте результат поиска до чтения его полей: удалённая строка не существует.

Ожидаемый результат

На понятном примере разделены индекс, идентификатор строки и ключ структуры.

На что обратить внимание

  1. НайтиПоИдентификатору не возвращает UUID товара, ключ записи регистра или номер строки базы.

  2. Идентификатор имеет смысл в текущей модели. Не обещается сохранение идентичности после её повторной загрузки.

  3. Сортировка меняет представляемую коллекцию в памяти; порядок хранения записей в регистре не проверяется.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.