Сумма по колонке, группе и регистру: все способы получить итог в 1С 8.3
Содержание
Быстрее всего сумму в 1С получают без кода: сформируйте отчёт, выделите мышью числовые ячейки, и программа покажет их сумму над табличной частью отчёта. Для постоянной задачи суммирование настраивают в отчёте (ресурс СКД), в запросе (СУММА() с СГРУППИРОВАТЬ ПО или ИТОГИ) или в модуле — методами Итог() и Свернуть() таблицы значений.
Какой путь выбрать, зависит от того, кто суммирует и как часто. Бухгалтеру хватит отчёта и выделения ячеек. Разработчику нужны запрос и код. Ниже — каждый способ с примерами, плюс валюты, округление и типичные причины «неправильной» суммы.
Как посчитать сумму в 1С без программирования
Выделение ячеек в сформированном отчёте
В типовых конфигурациях на платформе 8.3 (БП 3.0, ЗУП 3.1, УТ 11) отчёты построены на общей форме. Выделите диапазон ячеек мышью или с зажатым Shift, и в шапке формы появится сумма выделенного. Несмежные ячейки добавляют с зажатым Ctrl.
Приём работает в любом отчёте: оборотно-сальдовой ведомости, анализе счёта, ведомости по складу. Это самый быстрый ответ на вопрос «сколько здесь всего».
Список документов или справочника
У обычного списка (например, журнала платёжных поручений) строки итогов нет. Чтобы сложить суммы:
- Отберите нужные строки фильтром или поиском.
- Откройте меню
Ещё → Вывести список…. - Отметьте нужные колонки и нажмите
ОК— список откроется как табличный документ. - Выделите колонку сумм — итог появится в шапке, как в отчёте.
Получившийся документ можно сохранить в Excel через Файл → Сохранить как (или кнопку сохранения в форме).
Калькулятор платформы
Для пары чисел есть встроенный калькулятор: Ctrl+F2. Результат копируется в поле формы через буфер обмена.
Универсальный отчёт и группировки
Если нужен итог по группам (по контрагентам, по месяцам), подойдёт «Универсальный отчёт» или любой отчёт с настройкой структуры. В настройках варианта добавьте группировку — программа сама выведет промежуточные итоги и общий итог внизу.
Числа в отчёте складываются только в колонках-ресурсах. Если колонка — это реквизит (например, «Сумма документа» как обычное поле), итога под ней не будет. В «Универсальном отчёте» такие поля обычно выводятся с итогами, а в собственных отчётах это настраивается в СКД.
Суммирование в отчёте на СКД: ресурсы и вычисляемые поля
Система компоновки данных (СКД) — основной механизм отчётов 8.3. Суммирование в ней задаётся на вкладке «Ресурсы» схемы.
Как настроить ресурс
- Откройте схему компоновки данных отчёта в конфигураторе или в расширении.
- Перейдите на вкладку «Ресурсы».
- Перенесите числовое поле, например
Сумма, в список ресурсов. - В колонке «Выражение» оставьте
Сумма(Сумма)или выберите другую агрегатную функцию.
Агрегатные функции СКД:
| Функция | Что считает | Пример применения |
|---|---|---|
Сумма() | сумму значений | обороты, выручка |
Количество() | число значений | сколько документов |
Количество(Различные …) | число уникальных значений | сколько контрагентов |
Среднее() | среднее арифметическое | средний чек |
Минимум() / Максимум() | крайние значения | наименьшая цена |
Вычисляемое поле с суммированием
Когда итог надо получить по формуле, сначала создайте вычисляемое поле (вкладка «Вычисляемые поля»), затем сделайте его ресурсом. Пример — наценка:
Выражение вычисляемого поля: СуммаПродажи - Себестоимость
Выражение ресурса: Сумма(Наценка)
Процент наценки суммировать нельзя — его пересчитывают от сумм. Для ресурса ПроцентНаценки пишут выражение:
ВЫБОР КОГДА Сумма(Себестоимость) = 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. Используйте её только сознательно.
Как ускорить подсчёт сумм в большой базе
Суммирование миллионов строк тормозит не из-за СУММА, а из-за того, откуда берутся данные.
- 📦 Берите данные из регистров накопления, а не из табличных частей документов. Регистры хранят итоги, и виртуальная таблица
Остаткичитает их, а не перебирает движения. - 🎯 Отбор — в параметрах виртуальной таблицы. Условие на период, организацию, склад задавайте в скобках
Обороты(&Начало, &Конец, , Организация = &Организация), а не вГДЕ. Так СУБД отсекает лишнее до агрегации. - 🔁 Никаких запросов в цикле. Один запрос с группировкой вместо тысячи запросов «по одному товару». Разница — минуты против секунд.
- 🧮 Не тяните ссылочные поля без нужды. Обращение через точку (
Номенклатура.Родитель.Наименование) добавляет соединения. Для суммирования хватает ссылки. - 🗂 Временные таблицы с индексом. Если выборку используют несколько раз, поместите её во временную таблицу и проиндексируйте по полю соединения.
Если суммы по регистру стали считаться медленно или с ошибками после сбоя, помогает пересчёт итогов. Его делают через стандартную обработку «Управление итогами» (Все функции → Стандартные) или при тестировании и исправлении базы в конфигураторе.
Тестирование и исправление требует монопольного доступа: все пользователи должны выйти из базы. Запускайте его вне рабочего времени и только после резервной копии.
Автоматизация подсчёта итогов: отчёты, обработки, рассылки
Если одну и ту же сумму считают каждый день, ручную работу стоит убрать.
- Сохраните вариант отчёта. Настройте отборы и группировки, затем сохраните вариант под понятным именем — например, «Выручка по менеджерам за месяц». Период можно оставить переменным.
- Внешний отчёт. Нестандартный подсчёт (скажем, сумма оплат с учётом сторнирования) оформляют внешним отчётом на СКД. Его подключают через
Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработкибез изменения конфигурации. - Рассылка отчётов. В том же разделе есть «Рассылки отчетов»: отчёт формируется по расписанию и уходит на почту в Excel или PDF.
- Регламентное задание. Если сумма нужна для контроля (например, лимит дебиторки), разработчик пишет регламентное задание, которое считает её запросом и уведомляет ответственного.
- Расширение конфигурации. Итог в подвал типовой формы или новый ресурс в типовом отчёте добавляют расширением — так доработка переживёт обновление.
Частые вопросы
Как сложить значения из нескольких отчётов 1С?
Почему в оборотно-сальдовой ведомости итог по счёту не равен сумме субсчетов?
Можно ли получить сумму выделенных ячеек в обычной форме документа?
Чем ИТОГИ в запросе отличаются от СГРУППИРОВАТЬ ПО?
Как посчитать нарастающий итог в 1С?
ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая") (параметры группировки и типа расчёта пропущены). В коде — переменная-накопитель, которая растёт при обходе строк по порядку.