Сумма по колонке, группе и регистру: все способы получить итог в 1С 8.3

· 10 мин

Содержание

Быстрее всего сумму в 1С получают без кода: сформируйте отчёт, выделите мышью числовые ячейки, и программа покажет их сумму над табличной частью отчёта. Для постоянной задачи суммирование настраивают в отчёте (ресурс СКД), в запросе (СУММА() с СГРУППИРОВАТЬ ПО или ИТОГИ) или в модуле — методами Итог() и Свернуть() таблицы значений.

Какой путь выбрать, зависит от того, кто суммирует и как часто. Бухгалтеру хватит отчёта и выделения ячеек. Разработчику нужны запрос и код. Ниже — каждый способ с примерами, плюс валюты, округление и типичные причины «неправильной» суммы.

Как посчитать сумму в 1С без программирования

Выделение ячеек в сформированном отчёте

В типовых конфигурациях на платформе 8.3 (БП 3.0, ЗУП 3.1, УТ 11) отчёты построены на общей форме. Выделите диапазон ячеек мышью или с зажатым Shift, и в шапке формы появится сумма выделенного. Несмежные ячейки добавляют с зажатым Ctrl.

Приём работает в любом отчёте: оборотно-сальдовой ведомости, анализе счёта, ведомости по складу. Это самый быстрый ответ на вопрос «сколько здесь всего».

Список документов или справочника

У обычного списка (например, журнала платёжных поручений) строки итогов нет. Чтобы сложить суммы:

  1. Отберите нужные строки фильтром или поиском.
  2. Откройте меню Ещё → Вывести список….
  3. Отметьте нужные колонки и нажмите ОК — список откроется как табличный документ.
  4. Выделите колонку сумм — итог появится в шапке, как в отчёте.

Получившийся документ можно сохранить в Excel через Файл → Сохранить как (или кнопку сохранения в форме).

Калькулятор платформы

Для пары чисел есть встроенный калькулятор: Ctrl+F2. Результат копируется в поле формы через буфер обмена.

Универсальный отчёт и группировки

Если нужен итог по группам (по контрагентам, по месяцам), подойдёт «Универсальный отчёт» или любой отчёт с настройкой структуры. В настройках варианта добавьте группировку — программа сама выведет промежуточные итоги и общий итог внизу.

Числа в отчёте складываются только в колонках-ресурсах. Если колонка — это реквизит (например, «Сумма документа» как обычное поле), итога под ней не будет. В «Универсальном отчёте» такие поля обычно выводятся с итогами, а в собственных отчётах это настраивается в СКД.

Суммирование в отчёте на СКД: ресурсы и вычисляемые поля

Система компоновки данных (СКД) — основной механизм отчётов 8.3. Суммирование в ней задаётся на вкладке «Ресурсы» схемы.

Как настроить ресурс

  1. Откройте схему компоновки данных отчёта в конфигураторе или в расширении.
  2. Перейдите на вкладку «Ресурсы».
  3. Перенесите числовое поле, например Сумма, в список ресурсов.
  4. В колонке «Выражение» оставьте Сумма(Сумма) или выберите другую агрегатную функцию.

Агрегатные функции СКД:

ФункцияЧто считаетПример применения
Сумма()сумму значенийобороты, выручка
Количество()число значенийсколько документов
Количество(Различные …)число уникальных значенийсколько контрагентов
Среднее()среднее арифметическоесредний чек
Минимум() / Максимум()крайние значениянаименьшая цена

Вычисляемое поле с суммированием

Когда итог надо получить по формуле, сначала создайте вычисляемое поле (вкладка «Вычисляемые поля»), затем сделайте его ресурсом. Пример — наценка:

Выражение вычисляемого поля:  СуммаПродажи - Себестоимость
Выражение ресурса:            Сумма(Наценка)

Процент наценки суммировать нельзя — его пересчитывают от сумм. Для ресурса ПроцентНаценки пишут выражение:

ВЫБОР КОГДА Сумма(Себестоимость) = 0 ТОГДА 0
ИНАЧЕ Сумма(Наценка) / Сумма(Себестоимость) * 100 КОНЕЦ

Так в группе «Итого» процент будет правильным, а не суммой процентов строк.

Общие итоги и итоги по группировкам

Где выводить итоги, задают в настройках варианта отчёта. В свойствах группировки и всего отчёта есть параметр расположения общих итогов: вверху, внизу или не выводить. Если итог пропал, первым делом проверьте его.

Суммирование данных в запросе 1С

Запрос считает суммы на сервере СУБД. Это быстрее, чем перебирать строки в цикле, и это главный инструмент разработчика.

СУММА с группировкой

Сумма продаж по номенклатуре за период:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Продажи.Номенклатура КАК Номенклатура,
|	СУММА(Продажи.Количество) КАК Количество,
|	СУММА(Продажи.Сумма) КАК Сумма
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
|	Продажи.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();

Имя регистра и измерений зависит от конфигурации — подставьте свои. Правило простое: каждое поле, которое не обёрнуто в агрегатную функцию, должно стоять в СГРУППИРОВАТЬ ПО.

У виртуальной таблицы Обороты поля уже называются с суффиксом: СуммаОборот, КоличествоОборот. У таблицы Остатки — СуммаОстаток. Проверьте имена в конструкторе запроса.

Одна общая сумма

Если нужна одна цифра, группировка не нужна:

"ВЫБРАТЬ
|	ЕСТЬNULL(СУММА(Док.СуммаДокумента), 0) КАК Итого
|ИЗ
|	Документ.СписаниеСРасчетногоСчета КАК Док
|ГДЕ
|	Док.Проведен
|	И Док.Дата МЕЖДУ &Начало И &Конец"

ЕСТЬNULL нужен потому, что при пустой выборке СУММА вернёт NULL, а не ноль.

Итоги в запросе

Конструкция ИТОГИ добавляет к выборке строки промежуточных и общих сумм:

"ВЫБРАТЬ
|	Продажи.Контрагент,
|	Продажи.Номенклатура,
|	Продажи.СуммаОборот КАК Сумма
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК Продажи
|ИТОГИ
|	СУММА(Сумма)
|ПО
|	ОБЩИЕ,
|	Продажи.Контрагент"

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

Условная сумма

Сложить только часть строк, не теряя остальных:

"СУММА(ВЫБОР КОГДА Т.Сумма > 0 ТОГДА Т.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Приход,
|СУММА(ВЫБОР КОГДА Т.Сумма < 0 ТОГДА -Т.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Расход"

Программное суммирование в модулях 1С

Итог по колонке таблицы значений

ВсегоСумма = ТаблицаТоваров.Итог("Сумма");

Метод Итог() есть у таблицы значений и у табличной части документа. Колонка должна содержать числа: строковые значения в итог не попадут.

Сворачивание по ключу

Свернуть() группирует строки и складывает указанные колонки — аналог СГРУППИРОВАТЬ ПО в памяти:

Таблица = Объект.Товары.Выгрузить();
Таблица.Свернуть("Номенклатура, Склад", "Количество, Сумма");

Первый параметр — колонки группировки, второй — колонки суммирования. Колонки, которых нет ни в одном списке, будут удалены.

Цикл с условием

Когда нужна сумма по условию, а запрос делать неудобно:

СуммаСНДС20 = 0;
Для Каждого Строка Из Объект.Товары Цикл
	Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
		СуммаСНДС20 = СуммаСНДС20 + Строка.Сумма;
	КонецЕсли;
КонецЦикла;

Значение ставки возьмите из своей конфигурации — набор значений перечисления менялся с релизами.

Сумма в табличной части формы

Чтобы сумма показывалась под колонкой документа, в форме у таблицы включают свойство «Подвал», а у колонки задают «Путь к данным подвала», например Объект.Товары.ИтогСумма. Платформа пересчитывает итог при каждом изменении строк.

Сумма в разных валютах и ошибки округления

Валюты: сначала привести, потом сложить

Складывать 1 000 USD и 50 000 руб. бессмысленно. В отчётах суммируйте либо регламентированную сумму (в рублях), либо группируйте по валюте.

В коде сумму пересчитывают по курсу с учётом кратности:

СуммаРуб = Окр(СуммаВал * Курс / Кратность, 2);

Курс и кратность в типовых конфигурациях берут из регистра сведений «Курсы валют» на дату операции (через СрезПоследних). Кратность важна: для некоторых валют курс задаётся за 10 или 100 единиц.

Округление: строка или итог

Классическая ситуация: три строки по 33,333 руб. После округления каждой получим 33,33 × 3 = 99,99, а итог должен быть 100,00.

ПодходРезультатКогда применять
Округлять каждую строку и складывать99,99когда строки — отдельные суммы документа
Складывать точные значения и округлять итог100,00когда важна верная общая сумма
Распределить итог, копейку остатка — в самую крупную строку33,34 + 33,33 + 33,33 = 100,00распределение затрат, оплаты, НДС по строкам

Функция Окр(Число, Разрядность, РежимОкругления) по умолчанию округляет 0,5 вверх. Режим РежимОкругления.Окр15как10 округляет пятёрку вниз.

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

Итого = 100;
Доли = Новый Массив;
Распределено = 0;
Для Сч = 1 По 3 Цикл
	Доля = Окр(Итого / 3, 2);
	Доли.Добавить(Доля);
	Распределено = Распределено + Доля;
КонецЦикла;
Доли[0] = Доли[0] + (Итого - Распределено); // 33,34 + 33,33 + 33,33

Проверка: 33,33 × 3 = 99,99; остаток 0,01 уходит в первую строку.

Почему сумма в 1С «не сходится»: частые ошибки

Диагностика: выберите симптом

Опасная ловушка — СУММА(РАЗЛИЧНЫЕ …). Она складывает только уникальные значения: две оплаты по 5 000 руб. дадут 5 000, а не 10 000. Используйте её только сознательно.

Как ускорить подсчёт сумм в большой базе

Суммирование миллионов строк тормозит не из-за СУММА, а из-за того, откуда берутся данные.

  • 📦 Берите данные из регистров накопления, а не из табличных частей документов. Регистры хранят итоги, и виртуальная таблица Остатки читает их, а не перебирает движения.
  • 🎯 Отбор — в параметрах виртуальной таблицы. Условие на период, организацию, склад задавайте в скобках Обороты(&Начало, &Конец, , Организация = &Организация), а не в ГДЕ. Так СУБД отсекает лишнее до агрегации.
  • 🔁 Никаких запросов в цикле. Один запрос с группировкой вместо тысячи запросов «по одному товару». Разница — минуты против секунд.
  • 🧮 Не тяните ссылочные поля без нужды. Обращение через точку (Номенклатура.Родитель.Наименование) добавляет соединения. Для суммирования хватает ссылки.
  • 🗂 Временные таблицы с индексом. Если выборку используют несколько раз, поместите её во временную таблицу и проиндексируйте по полю соединения.

Если суммы по регистру стали считаться медленно или с ошибками после сбоя, помогает пересчёт итогов. Его делают через стандартную обработку «Управление итогами» (Все функции → Стандартные) или при тестировании и исправлении базы в конфигураторе.

Тестирование и исправление требует монопольного доступа: все пользователи должны выйти из базы. Запускайте его вне рабочего времени и только после резервной копии.

Автоматизация подсчёта итогов: отчёты, обработки, рассылки

Если одну и ту же сумму считают каждый день, ручную работу стоит убрать.

  1. Сохраните вариант отчёта. Настройте отборы и группировки, затем сохраните вариант под понятным именем — например, «Выручка по менеджерам за месяц». Период можно оставить переменным.
  2. Внешний отчёт. Нестандартный подсчёт (скажем, сумма оплат с учётом сторнирования) оформляют внешним отчётом на СКД. Его подключают через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки без изменения конфигурации.
  3. Рассылка отчётов. В том же разделе есть «Рассылки отчетов»: отчёт формируется по расписанию и уходит на почту в Excel или PDF.
  4. Регламентное задание. Если сумма нужна для контроля (например, лимит дебиторки), разработчик пишет регламентное задание, которое считает её запросом и уведомляет ответственного.
  5. Расширение конфигурации. Итог в подвал типовой формы или новый ресурс в типовом отчёте добавляют расширением — так доработка переживёт обновление.
Перед тем как доверять сумме
Выполнено: 0 / 6

Частые вопросы

Как сложить значения из нескольких отчётов 1С?
Сохраните каждый отчёт в Excel и сложите там, или соберите один отчёт на СКД с несколькими наборами данных и общим ресурсом.
Почему в оборотно-сальдовой ведомости итог по счёту не равен сумме субсчетов?
Чаще всего в настройках отключена детализация части субконто или стоит отбор. Проверьте отборы и показатели в настройках отчёта.
Можно ли получить сумму выделенных ячеек в обычной форме документа?
Нет, в табличной части формы выделение ячеек не суммируется. Выведите список в табличный документ или используйте подвал колонки.
Чем ИТОГИ в запросе отличаются от СГРУППИРОВАТЬ ПО?
СГРУППИРОВАТЬ ПО заменяет детальные строки сгруппированными. ИТОГИ оставляет детальные строки и добавляет к ним строки сумм по группировкам.
Как посчитать нарастающий итог в 1С?
В СКД — ресурс с функцией ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая") (параметры группировки и типа расчёта пропущены). В коде — переменная-накопитель, которая растёт при обходе строк по порядку.