Суммы и итоги в 1С 8.3: от выделения ячеек до запросов и СКД

· 9 мин

Содержание

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

Частое заблуждение — считать итоги вручную на калькуляторе или в Excel, выгружая данные строка за строкой. В 1С почти любой итог уже хранится в регистрах или считается одной строкой запроса. Ниже способы идут от простых к сложным: выбирайте первый, который решает задачу.

Итоги без программирования: отчёты и сумма выделенных ячеек

Бухгалтеру чаще всего хватает стандартных отчётов. Строки «Итого» в них формируются сами.

📊 Где искать готовые итоги в 1С:Бухгалтерии 3.0:

  • Отчеты → Оборотно-сальдовая ведомость — остатки и обороты по всем счетам, итог по каждому счёту и общий.
  • Отчеты → Оборотно-сальдовая ведомость по счету — тот же расклад с разворотом по субконто: контрагентам, номенклатуре, договорам.
  • Отчеты → Анализ субконто — итоги по одному разрезу через все счета.
  • Отчеты → Универсальный отчет — итоги по любому регистру или документу с вашими группировками.

Как быстро сложить произвольные строки

  1. Сформируйте отчёт.
  2. Выделите мышью нужные ячейки. Для несмежных ячеек держите Ctrl.
  3. Посмотрите в правую часть командной панели отчёта: там появится сумма выделенного.
  4. Щёлкните по этому полю, чтобы переключить показатель: сумма, количество, среднее, минимум, максимум.

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

В динамическом списке (журнале документов, списке номенклатуры) строки «Итого» нет. Обходной путь:

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

Выведенный список можно сохранить в xlsx через кнопку сохранения табличного документа. Это быстрее, чем копировать строки из формы.

Итоги в документах и справочниках: подвал табличной части

В формах документов итоги обычно уже есть: под табличной частью «Товары» выводятся «Всего», «НДС» и количество строк. Это подвал таблицы формы.

Если в своей обработке или доработанном документе итога нет, его добавляют в Конфигураторе:

  1. Откройте форму и выделите элемент таблицы в дереве элементов.
  2. В палитре свойств включите свойство Подвал.
  3. У колонки суммы заполните ПутьКДаннымПодвала: в окне выбора данных будет итог по этой колонке табличной части.
  4. Для текстовых колонок задайте ТекстПодвала, например «Итого:».

Тот же итог в коде получают методом Итог():

// На сервере: итог по колонке табличной части документа
ВсегоПоДокументу = ДокументОбъект.Товары.Итог("Сумма");

// Количество строк табличной части
ЧислоСтрок = ДокументОбъект.Товары.Количество();

Итог() складывает только числовые значения колонки. Если в колонке нет типа «Число», метод вернёт неверный результат или ноль.

Итоги через запрос: СУММА, СГРУППИРОВАТЬ ПО и ИТОГИ ПО

Когда нужен свой расчёт, итоги считает язык запросов. Различайте два уровня.

КонструкцияЧто даётКогда брать
СУММА() + СГРУППИРОВАТЬ ПОПо одной строке на группуНужна только итоговая таблица
ИТОГИ ... ПОДетальные строки плюс строки-итоги группНужен отчёт «группа → детали»
ИТОГИ ... ПО ОБЩИЕДополнительно общий итог по всей выборкеНужна строка «Всего»

Агрегатные функции

Кроме СУММА есть КОЛИЧЕСТВО, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...), СРЕДНЕЕ, МАКСИМУМ, МИНИМУМ. Пример с условным регистром «Продажи»:

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

В ИТОГИ агрегатные функции пишут по псевдонимам полей выборки: СУММА(Сумма), а не СУММА(Продажи.Сумма).

Итоги по иерархии справочника

Номенклатура и контрагенты обычно разложены по группам. Чтобы получить итог не только по каждому товару, но и по каждой папке справочника, добавьте ключевое слово ИЕРАРХИЯ:

ИТОГИ
    СУММА(Сумма)
ПО
    ОБЩИЕ,
    Номенклатура ИЕРАРХИЯ

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

📌 Что учесть при работе с ИТОГИ:

  • поле, по которому строятся итоги, должно быть в списке выборки;
  • порядок полей после ПО задаёт вложенность групп: первое — верхний уровень;
  • сортировку детальных строк внутри групп задавайте через УПОРЯДОЧИТЬ ПО, иначе порядок не гарантирован.

Как обойти результат с итогами

Строки-итоги и детальные записи разбирают вложенными выборками:

Результат = Запрос.Выполнить();
ВыборкаГруппы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппы.Следующий() Цикл
    // Строка итога по контрагенту
    Сообщить(СтрШаблон("%1: %2", ВыборкаГруппы.Контрагент, Формат(ВыборкаГруппы.Сумма, "ЧДЦ=2")));

    ВыборкаДетали = ВыборкаГруппы.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
        // Детальные строки: номенклатура и её сумма
        Сообщить(СтрШаблон("   %1: %2", ВыборкаДетали.Номенклатура, ВыборкаДетали.Сумма));
    КонецЦикла;
КонецЦикла;

Если выгрузить такой результат в таблицу значений через Выгрузить(), строки итогов перемешаются с детальными. Для таблицы лучше запрос без ИТОГИ, а итог считать через Итог().

Виртуальные таблицы регистров: готовые итоги без перебора движений

Самый быстрый способ получить остаток или оборот — виртуальная таблица регистра. Платформа берёт данные из таблиц итогов, которые хранит сама, и не перебирает все движения за годы.

🗂 Какие виртуальные таблицы есть:

  • Остатки(Период, Условие) — остатки на дату у регистра накопления остатков.
  • Обороты(НачалоПериода, КонецПериода, Периодичность, Условие) — приход, расход, оборот за период.
  • ОстаткиИОбороты(...) — начальный остаток, обороты и конечный остаток в одной строке.
  • У регистра бухгалтерии ещё ОборотыДтКт — обороты в корреспонденции счетов.

Остатки на счёте 41 по данным 1С:Бухгалтерии:

ВЫБРАТЬ
    Остатки.Субконто1 КАК Номенклатура,
    Остатки.КоличествоОстатокДт КАК Количество,
    Остатки.СуммаОстатокДт КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
        &Дата,
        Счет В ИЕРАРХИИ (&Счет41),
        ,
        ) КАК Остатки

Параметр &Дата в Остатки не включает движения этого момента. Чтобы получить остаток с учётом документов дня, передайте конец дня или Новый Граница(Дата, ВидГраницы.Включая).

Условие в параметрах, а не в ГДЕ

Отбор по измерениям ставьте в параметр «Условие» виртуальной таблицы:

РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, Склад = &Склад) КАК Остатки

Если написать ГДЕ Остатки.Склад = &Склад после таблицы, платформа сначала посчитает остатки по всем складам и только потом отфильтрует. На большой базе разница во времени заметна.

Итоги в коде: таблица значений, Свернуть и накопление в цикле

Иногда данные уже лежат в памяти: таблица из файла, результат нескольких запросов. Тогда итоги считают методами коллекций.

// Общий итог по колонке
ВсегоСумма = ТаблицаТоваров.Итог("Сумма");

// Итоги по группам: одна строка на номенклатуру
ИтогиПоТоварам = ТаблицаТоваров.Скопировать();
ИтогиПоТоварам.Свернуть("Номенклатура", "Количество, Сумма");

Свернуть() меняет таблицу на месте, поэтому сворачивайте копию, если исходные строки ещё нужны. Первый параметр — колонки группировки, второй — колонки суммирования. Колонки, не попавшие ни в один параметр, удаляются.

Итог с условием проще посчитать в цикле:

СуммаБольшихЗаказов = 0;
Для Каждого Строка Из ТаблицаТоваров Цикл
    Если Строка.Сумма >= 100000 Тогда
        СуммаБольшихЗаказов = СуммаБольшихЗаказов + Строка.Сумма;
    КонецЕсли;
КонецЦикла;

Не перебирайте в цикле движения регистра, чтобы получить остаток. Это то, что виртуальная таблица Остатки делает в разы быстрее.

Итоги в отчётах на СКД: ресурсы, группировки и общие итоги

В системе компоновки данных итог по полю появляется только тогда, когда поле объявлено ресурсом. Пока поле не ресурс, в строках группировок оно будет пустым.

Настройка в схеме компоновки

  1. Откройте схему отчёта и перейдите на закладку «Ресурсы».
  2. Перенесите числовые поля вправо. Для каждого задайте выражение: Сумма(Сумма), Среднее(Цена), Количество(Различные Номенклатура).
  3. В колонке «Рассчитывать по» оставьте пусто, чтобы ресурс считался на всех уровнях, или укажите группировку.
  4. На закладке «Настройки» добавьте группировки в структуру отчёта: например, «Контрагент», внутри него «Номенклатура».
  5. В «Других настройках» найдите расположение общих итогов: в начале, в конце или без них.

Главное отличие СКД от ИТОГИ ПО в запросе: ресурс пересчитывается на каждом уровне группировки по своему выражению. Количество(Различные ...) в СКД даёт правильное число уникальных значений и по группе, и в общем итоге. Сложение итогов подгрупп такого результата не даёт.

Пользователю без Конфигуратора

В типовых отчётах 1С:Бухгалтерии группировки меняют через Настройки или Ещё → Изменить вариант отчета. Там же включается или отключается строка общего итога. Универсальный отчёт позволяет собрать итоги по любому регистру без доработки конфигурации.

Где вам нужен итог?

Когда итоги не сходятся: ошибки и пересчёт итогов

Неверный итог почти всегда объясняется одной из причин ниже.

❌ Частые ошибки и как их исправить:

  • 🔁 Задвоение при соединении. Левое соединение с таблицей, где на одну строку приходится несколько, умножает суммы. Сначала сгруппируйте вторую таблицу во вложенном запросе или временной таблице, потом соединяйте.
  • 🕳 NULL в сумме. После левого соединения пустые поля дают NULL, и выражение Сумма + Наценка становится NULL. Оборачивайте поля в ЕСТЬNULL(Поле, 0).
  • 🚫 Ошибка Поле не входит в группу. В выборке осталось поле, которого нет ни в агрегатной функции, ни в СГРУППИРОВАТЬ ПО. Добавьте его в группировку или уберите.
  • 🧮 Округление. Сумма округлённых строк отличается от округлённой суммы на копейки. Решите заранее, где округлять: в строках или в итоге.
  • 📅 Граница периода. Остаток «на 31 число» без учёта движений этого дня — частая причина расхождения с ОСВ.

Пересчёт итогов регистров

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

  1. Сделайте резервную копию базы.
  2. В режиме 1С:Предприятие откройте Главное меню → Функции для технического специалиста → Стандартные → Управление итогами. Если пункта нет, включите его в Сервис и настройки → Параметры.
  3. Выберите регистры и выполните пересчёт итогов.
  4. Альтернатива — Конфигуратор: Администрирование → Тестирование и исправление, флаг «Пересчет итогов».

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

В «Управлении итогами» есть и настройка периода рассчитанных итогов. Платформа хранит итоги помесячно, а период рассчитанных итогов ограничивает их пересчёт при проведении документов задним числом. Сдвигать его вперёд имеет смысл на больших базах с закрытыми периодами.

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

Как посчитать количество строк, а не сумму?
В отчёте выделите ячейки и переключите показатель над отчётом на «Количество». В запросе используйте КОЛИЧЕСТВО(*), в коде — метод Количество() у коллекции.
Почему в СКД в строке группировки пусто, а в деталях цифры есть?
Поле не объявлено ресурсом. Добавьте его на закладку «Ресурсы» с выражением Сумма(Поле).
Можно ли посчитать среднее вместо суммы?
Да. В запросе — СРЕДНЕЕ(Поле), в СКД — ресурс с выражением Среднее(Поле). Учтите, что среднее по группе не равно среднему из средних подгрупп.
Влияет ли пересчёт итогов на проводки и документы?
Нет. Пересчёт заново собирает служебные таблицы итогов из уже записанных движений. Сами документы и движения не меняются.
Как получить общий итог в запросе без группировок?
Напишите ИТОГИ СУММА(Сумма) ПО ОБЩИЕ. Первой записью результата будет строка с итогом по всей выборке.