Суммы и итоги в 1С 8.3: от выделения ячеек до запросов и СКД
Содержание
Чтобы посчитать итоги в 1С без программирования, сформируйте отчёт или выведите список в табличный документ (Ещё → Вывести список) и выделите ячейки мышью: сумма выделенного появится в поле над отчётом. Программисту нужны другие инструменты: СУММА() и ИТОГИ ПО в запросе, виртуальные таблицы регистров, ресурсы в СКД и метод Итог() у коллекций.
Частое заблуждение — считать итоги вручную на калькуляторе или в Excel, выгружая данные строка за строкой. В 1С почти любой итог уже хранится в регистрах или считается одной строкой запроса. Ниже способы идут от простых к сложным: выбирайте первый, который решает задачу.
Итоги без программирования: отчёты и сумма выделенных ячеек
Бухгалтеру чаще всего хватает стандартных отчётов. Строки «Итого» в них формируются сами.
📊 Где искать готовые итоги в 1С:Бухгалтерии 3.0:
Отчеты → Оборотно-сальдовая ведомость— остатки и обороты по всем счетам, итог по каждому счёту и общий.Отчеты → Оборотно-сальдовая ведомость по счету— тот же расклад с разворотом по субконто: контрагентам, номенклатуре, договорам.Отчеты → Анализ субконто— итоги по одному разрезу через все счета.Отчеты → Универсальный отчет— итоги по любому регистру или документу с вашими группировками.
Как быстро сложить произвольные строки
- Сформируйте отчёт.
- Выделите мышью нужные ячейки. Для несмежных ячеек держите
Ctrl. - Посмотрите в правую часть командной панели отчёта: там появится сумма выделенного.
- Щёлкните по этому полю, чтобы переключить показатель: сумма, количество, среднее, минимум, максимум.
Итог по списку документов или справочника
В динамическом списке (журнале документов, списке номенклатуры) строки «Итого» нет. Обходной путь:
- Откройте список, при необходимости установите отбор.
- Выберите
Ещё → Вывести список. - Оставьте только нужные колонки и нажмите «ОК».
- В открывшемся табличном документе выделите колонку — сумма покажется так же, как в отчёте.
Выведенный список можно сохранить в xlsx через кнопку сохранения табличного документа. Это быстрее, чем копировать строки из формы.
Итоги в документах и справочниках: подвал табличной части
В формах документов итоги обычно уже есть: под табличной частью «Товары» выводятся «Всего», «НДС» и количество строк. Это подвал таблицы формы.
Если в своей обработке или доработанном документе итога нет, его добавляют в Конфигураторе:
- Откройте форму и выделите элемент таблицы в дереве элементов.
- В палитре свойств включите свойство
Подвал. - У колонки суммы заполните
ПутьКДаннымПодвала: в окне выбора данных будет итог по этой колонке табличной части. - Для текстовых колонок задайте
ТекстПодвала, например «Итого:».
Тот же итог в коде получают методом Итог():
// На сервере: итог по колонке табличной части документа
ВсегоПоДокументу = ДокументОбъект.Товары.Итог("Сумма");
// Количество строк табличной части
ЧислоСтрок = ДокументОбъект.Товары.Количество();
Итог() складывает только числовые значения колонки. Если в колонке нет типа «Число», метод вернёт неверный результат или ноль.
Итоги через запрос: СУММА, СГРУППИРОВАТЬ ПО и ИТОГИ ПО
Когда нужен свой расчёт, итоги считает язык запросов. Различайте два уровня.
| Конструкция | Что даёт | Когда брать |
|---|---|---|
СУММА() + СГРУППИРОВАТЬ ПО | По одной строке на группу | Нужна только итоговая таблица |
ИТОГИ ... ПО | Детальные строки плюс строки-итоги групп | Нужен отчёт «группа → детали» |
ИТОГИ ... ПО ОБЩИЕ | Дополнительно общий итог по всей выборке | Нужна строка «Всего» |
Агрегатные функции
Кроме СУММА есть КОЛИЧЕСТВО, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...), СРЕДНЕЕ, МАКСИМУМ, МИНИМУМ. Пример с условным регистром «Продажи»:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.Номенклатура КАК Номенклатура,
СУММА(Продажи.Сумма) КАК Сумма,
СУММА(Продажи.Количество) КАК Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Продажи.Контрагент,
Продажи.Номенклатура
ИТОГИ
СУММА(Сумма),
СУММА(Количество)
ПО
Контрагент
В ИТОГИ агрегатные функции пишут по псевдонимам полей выборки: СУММА(Сумма), а не СУММА(Продажи.Сумма).
Итоги по иерархии справочника
Номенклатура и контрагенты обычно разложены по группам. Чтобы получить итог не только по каждому товару, но и по каждой папке справочника, добавьте ключевое слово ИЕРАРХИЯ:
ИТОГИ
СУММА(Сумма)
ПО
ОБЩИЕ,
Номенклатура ИЕРАРХИЯ
Результат вернёт строки-итоги для каждой группы номенклатуры на всех уровнях вложенности, затем сами товары. Это удобно для отчёта «продажи по товарным группам» без ручного сложения.
📌 Что учесть при работе с ИТОГИ:
- поле, по которому строятся итоги, должно быть в списке выборки;
- порядок полей после
ПОзадаёт вложенность групп: первое — верхний уровень; - сортировку детальных строк внутри групп задавайте через
УПОРЯДОЧИТЬ ПО, иначе порядок не гарантирован.
Как обойти результат с итогами
Строки-итоги и детальные записи разбирают вложенными выборками:
Результат = Запрос.Выполнить();
ВыборкаГруппы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаГруппы.Следующий() Цикл
// Строка итога по контрагенту
Сообщить(СтрШаблон("%1: %2", ВыборкаГруппы.Контрагент, Формат(ВыборкаГруппы.Сумма, "ЧДЦ=2")));
ВыборкаДетали = ВыборкаГруппы.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
// Детальные строки: номенклатура и её сумма
Сообщить(СтрШаблон(" %1: %2", ВыборкаДетали.Номенклатура, ВыборкаДетали.Сумма));
КонецЦикла;
КонецЦикла;
Если выгрузить такой результат в таблицу значений через Выгрузить(), строки итогов перемешаются с детальными. Для таблицы лучше запрос без ИТОГИ, а итог считать через Итог().
Виртуальные таблицы регистров: готовые итоги без перебора движений
Самый быстрый способ получить остаток или оборот — виртуальная таблица регистра. Платформа берёт данные из таблиц итогов, которые хранит сама, и не перебирает все движения за годы.
🗂 Какие виртуальные таблицы есть:
Остатки(Период, Условие)— остатки на дату у регистра накопления остатков.Обороты(НачалоПериода, КонецПериода, Периодичность, Условие)— приход, расход, оборот за период.ОстаткиИОбороты(...)— начальный остаток, обороты и конечный остаток в одной строке.- У регистра бухгалтерии ещё
ОборотыДтКт— обороты в корреспонденции счетов.
Остатки на счёте 41 по данным 1С:Бухгалтерии:
ВЫБРАТЬ
Остатки.Субконто1 КАК Номенклатура,
Остатки.КоличествоОстатокДт КАК Количество,
Остатки.СуммаОстатокДт КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&Дата,
Счет В ИЕРАРХИИ (&Счет41),
,
) КАК Остатки
Параметр &Дата в Остатки не включает движения этого момента. Чтобы получить остаток с учётом документов дня, передайте конец дня или Новый Граница(Дата, ВидГраницы.Включая).
Условие в параметрах, а не в ГДЕ
Отбор по измерениям ставьте в параметр «Условие» виртуальной таблицы:
РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, Склад = &Склад) КАК Остатки
Если написать ГДЕ Остатки.Склад = &Склад после таблицы, платформа сначала посчитает остатки по всем складам и только потом отфильтрует. На большой базе разница во времени заметна.
Итоги в коде: таблица значений, Свернуть и накопление в цикле
Иногда данные уже лежат в памяти: таблица из файла, результат нескольких запросов. Тогда итоги считают методами коллекций.
// Общий итог по колонке
ВсегоСумма = ТаблицаТоваров.Итог("Сумма");
// Итоги по группам: одна строка на номенклатуру
ИтогиПоТоварам = ТаблицаТоваров.Скопировать();
ИтогиПоТоварам.Свернуть("Номенклатура", "Количество, Сумма");
Свернуть() меняет таблицу на месте, поэтому сворачивайте копию, если исходные строки ещё нужны. Первый параметр — колонки группировки, второй — колонки суммирования. Колонки, не попавшие ни в один параметр, удаляются.
Итог с условием проще посчитать в цикле:
СуммаБольшихЗаказов = 0;
Для Каждого Строка Из ТаблицаТоваров Цикл
Если Строка.Сумма >= 100000 Тогда
СуммаБольшихЗаказов = СуммаБольшихЗаказов + Строка.Сумма;
КонецЕсли;
КонецЦикла;
Не перебирайте в цикле движения регистра, чтобы получить остаток. Это то, что виртуальная таблица Остатки делает в разы быстрее.
Итоги в отчётах на СКД: ресурсы, группировки и общие итоги
В системе компоновки данных итог по полю появляется только тогда, когда поле объявлено ресурсом. Пока поле не ресурс, в строках группировок оно будет пустым.
Настройка в схеме компоновки
- Откройте схему отчёта и перейдите на закладку «Ресурсы».
- Перенесите числовые поля вправо. Для каждого задайте выражение:
Сумма(Сумма),Среднее(Цена),Количество(Различные Номенклатура). - В колонке «Рассчитывать по» оставьте пусто, чтобы ресурс считался на всех уровнях, или укажите группировку.
- На закладке «Настройки» добавьте группировки в структуру отчёта: например, «Контрагент», внутри него «Номенклатура».
- В «Других настройках» найдите расположение общих итогов: в начале, в конце или без них.
Главное отличие СКД от ИТОГИ ПО в запросе: ресурс пересчитывается на каждом уровне группировки по своему выражению. Количество(Различные ...) в СКД даёт правильное число уникальных значений и по группе, и в общем итоге. Сложение итогов подгрупп такого результата не даёт.
Пользователю без Конфигуратора
В типовых отчётах 1С:Бухгалтерии группировки меняют через Настройки или Ещё → Изменить вариант отчета. Там же включается или отключается строка общего итога. Универсальный отчёт позволяет собрать итоги по любому регистру без доработки конфигурации.
Когда итоги не сходятся: ошибки и пересчёт итогов
Неверный итог почти всегда объясняется одной из причин ниже.
❌ Частые ошибки и как их исправить:
- 🔁 Задвоение при соединении. Левое соединение с таблицей, где на одну строку приходится несколько, умножает суммы. Сначала сгруппируйте вторую таблицу во вложенном запросе или временной таблице, потом соединяйте.
- 🕳 NULL в сумме. После левого соединения пустые поля дают
NULL, и выражениеСумма + НаценкастановитсяNULL. Оборачивайте поля вЕСТЬNULL(Поле, 0). - 🚫 Ошибка
Поле не входит в группу. В выборке осталось поле, которого нет ни в агрегатной функции, ни вСГРУППИРОВАТЬ ПО. Добавьте его в группировку или уберите. - 🧮 Округление. Сумма округлённых строк отличается от округлённой суммы на копейки. Решите заранее, где округлять: в строках или в итоге.
- 📅 Граница периода. Остаток «на 31 число» без учёта движений этого дня — частая причина расхождения с ОСВ.
Пересчёт итогов регистров
Если отчёт по регистру показывает одно, а сумма движений — другое, таблицы итогов могли разойтись с движениями: после аварийного завершения, сбоя диска или загрузки данных с ошибками.
- Сделайте резервную копию базы.
- В режиме 1С:Предприятие откройте
Главное меню → Функции для технического специалиста → Стандартные → Управление итогами. Если пункта нет, включите его вСервис и настройки → Параметры. - Выберите регистры и выполните пересчёт итогов.
- Альтернатива — Конфигуратор:
Администрирование → Тестирование и исправление, флаг «Пересчет итогов».
Тестирование и исправление требует монопольного доступа: всех пользователей нужно вывести из базы. Пересчёт итогов на большой базе идёт долго и нагружает сервер. Запускайте его в нерабочее время.
В «Управлении итогами» есть и настройка периода рассчитанных итогов. Платформа хранит итоги помесячно, а период рассчитанных итогов ограничивает их пересчёт при проведении документов задним числом. Сдвигать его вперёд имеет смысл на больших базах с закрытыми периодами.