Суммирование в 1С 8.3: от выделения ячеек до итогов в запросе
Содержание
Быстрее всего посчитать сумму в 1С так: откройте отчёт или выведите список в табличный документ, выделите мышью ячейки с числами — сумма выделенного появится в правой части командной панели отчёта. В документах итог по колонке уже стоит в подвале табличной части, а для своих отчётов и обработок сумму считают функцией СУММА() в запросе или методом Итог() в коде.
Какой способ выбрать, зависит от задачи: разово сверить цифру, собрать сводку за период или встроить расчёт в обработку. Для разовой сверки хватает мыши, для регулярных сводок нужен запрос или отчёт на СКД.
Где 1С уже показывает итоги: документы и подвал таблицы
В большинстве документов типовых конфигураций итог по табличной части считается сам. Ничего настраивать не нужно.
📌 Где искать готовую сумму:
- 🧾 Подвал табличной части. Под колонками «Количество», «Сумма», «НДС» в документах «Реализация», «Поступление», «Счёт покупателю» стоит строка с итогом по колонке.
- 💰 Поля «Всего» и «НДС» внизу формы. Это сумма документа с учётом налога. Её же видно в колонке «Сумма» журнала документов.
- 📄 Печатная форма. В накладной и счёте итоговые строки «Итого», «В том числе НДС», «Всего к оплате» собираются из тех же строк табличной части.
Если подвал не виден, растяните форму вниз или проверьте, не скрыта ли строка итогов в настройке формы. Настройка открывается через Ещё → Изменить форму.
Как добавить итог в свою форму
Если вы дорабатываете форму или пишете обработку, подвал включается в свойствах элемента-таблицы:
- Откройте форму в конфигураторе или расширении.
- У элемента «Таблица» включите свойство
ОтображатьПодвал. - У нужной колонки в свойстве
ПутьКДаннымПодвалаукажитеОбъект.Товары.ИтогСумма(гдеТовары— имя табличной части,Сумма— имя реквизита).
Платформа сама пересчитывает итог при изменении строк. Код для этого писать не нужно.
Сумма выделенных ячеек в отчёте и списке
Это самый частый ручной сценарий: бухгалтер смотрит оборотно-сальдовую ведомость или анализ счёта и хочет сложить несколько строк.
В отчёте
- Сформируйте отчёт, например
Отчеты → Оборотно-сальдовая ведомость. - Выделите мышью диапазон ячеек с числами.
- Чтобы добавить несмежные ячейки, удерживайте
Ctrlи щёлкайте по ним. - Смотрите сумму в правой части командной панели над отчётом.
В свежих релизах рядом с суммой есть выпадающий список: можно переключиться на количество, среднее, минимум или максимум по выделению.
В любом списке: справочнике, журнале документов
Динамический список сам ничего не суммирует. Нужно сначала перевести его в табличный документ:
- Откройте список, например журнал «Поступление (акты, накладные, УПД)».
- Установите отбор и период, чтобы в списке остались только нужные строки.
- Нажмите
Ещё → Вывести список.... - В окне вывода оставьте только нужные колонки и нажмите «ОК».
- В открывшемся табличном документе выделите колонку с суммами.
Если сумма выделения в этом окне не отображается, есть два запасных хода:
- 📋 скопируйте выделенные ячейки (
Ctrl+C) и вставьте в Excel — сумма появится в строке состояния; - 💾 сохраните табличный документ в формате
.xlsxчерез меню сохранения и считайте уже там.
При выводе списка 1С берёт только то, что сейчас попадает в отбор. Если отбор по периоду не задан, в сумму войдут документы за все годы.
Встроенный калькулятор
Для быстрой проверки двух-трёх чисел есть калькулятор платформы. Он вызывается сочетанием Ctrl+F2. Результат можно скопировать и вставить в числовое поле документа.
Итоги в запросе: функция СУММА и конструктор
Когда сумма нужна регулярно — по контрагентам, номенклатуре, месяцам, — её считают запросом. Это работает в консоли запросов, в отчётах на СКД и в любой обработке.
Через конструктор запроса
- Откройте конструктор (в модуле — правой кнопкой по тексту запроса или из консоли запросов).
- На вкладке «Таблицы и поля» выберите таблицу, например табличную часть
Товарыдокумента реализации, и нужные поля. - Перейдите на вкладку «Группировка».
- Поле, по которому собираете сводку (номенклатура, контрагент), перетащите в «Групповые поля».
- Поле суммы перетащите в «Суммируемые поля» и выберите функцию
Сумма. - Если нужна строка общего итога, на вкладке «Итоги» добавьте суммируемое поле и включите «Общие итоги».
Готовый текст запроса
Так выглядит результат конструктора для выручки по номенклатуре за период:
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(Товары.Количество) КАК Количество,
СУММА(Товары.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка.Проведен
И Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
ОБЩИЕ
📌 Что здесь важно:
- 🔹
СУММА()безСГРУППИРОВАТЬ ПОвернёт одну строку — общую сумму по всей выборке. - 🔹
ИТОГИ ... ПО ОБЩИЕдобавляет строку итога сверху, не схлопывая детальные строки. - 🔹 Отбор по
Ссылка.Проведенотсекает черновики. Без него в сумму попадут непроведённые документы.
Условная сумма
Сумму только части строк считают через ВЫБОР внутри агрегатной функции. Например, отдельно выручка без НДС и с НДС 20%:
СУММА(ВЫБОР
КОГДА Товары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
ТОГДА Товары.Сумма
ИНАЧЕ 0
КОНЕЦ) КАК СуммаНДС20
Имя перечисления ставок может отличаться в разных конфигурациях. Проверьте его в дереве метаданных, прежде чем вставлять.
Если поле суммы может быть пустым (NULL) после левого соединения, оберните его в ЕСТЬNULL(Поле, 0). СУММА() пропускает NULL, но в арифметике Поле1 + Поле2 один NULL обнулит всё выражение.
Сумма в коде: табличная часть, таблица значений, выборка
В обработках и модулях форм итог считают тремя способами. Выбор зависит от того, где лежат данные.
| Где данные | Как посчитать | Когда удобно |
|---|---|---|
| Табличная часть объекта | Объект.Товары.Итог("Сумма") | Итог по всей колонке |
| Таблица значений | ТЗ.Итог("Сумма") или ТЗ.Свернуть() | Сводка по группам в памяти |
| Выборка запроса | СУММА() в тексте запроса | Большие объёмы данных |
| Любая коллекция | Цикл со сложением | Нужно условие по строкам |
Итог по колонке одной строкой
ИтогоПоДокументу = Объект.Товары.Итог("Сумма");
Сообщить("Итого: " + Формат(ИтогоПоДокументу, "ЧДЦ=2"));
Сумма с условием в цикле
Например, сложить только строки, где количество больше 10:
ИтогоКрупные = 0;
Для Каждого Строка Из Объект.Товары Цикл
Если Строка.Количество > 10 Тогда
ИтогоКрупные = ИтогоКрупные + Строка.Сумма;
КонецЕсли;
КонецЦикла;
Сообщить("Сумма по крупным строкам: " + Формат(ИтогоКрупные, "ЧДЦ=2; ЧН=0"));
Свернуть таблицу значений по группам
ТЗ = Объект.Товары.Выгрузить(, "Номенклатура, Количество, Сумма");
ТЗ.Свернуть("Номенклатура", "Количество, Сумма");
Для Каждого Строка Из ТЗ Цикл
Сообщить(Строка(Строка.Номенклатура) + ": " + Формат(Строка.Сумма, "ЧДЦ=2"));
КонецЦикла;
Свернуть склеивает строки с одинаковой номенклатурой и складывает числовые колонки из второго параметра. Колонки, не указанные ни в одном параметре, удаляются.
Не тяните в код тысячи строк ради одной суммы. Если данные лежат в базе, пусть сумму посчитает запрос: это быстрее и не нагружает память клиента.
Сводная таблица: суммы по строкам и колонкам сразу
Когда нужна матрица «контрагент × месяц» или «склад × номенклатура», обычной колонки итогов мало. Тут помогает отчёт с группировками по строкам и колонкам.
Без программирования
В Бухгалтерии 3.0 в разделе Отчеты есть «Универсальный отчет
». Порядок такой:
- Выберите тип данных (например, регистр накопления или документ) и сам объект.
- Откройте настройки отчёта и перейдите в расширенный вид.
- В структуре добавьте группировку строк (контрагент) и группировку колонок (период по месяцам).
- Сформируйте отчёт: на пересечениях будут суммы, справа и внизу — итоги.
На СКД в своём отчёте
- В схеме компоновки на вкладке «Ресурсы» добавьте поле суммы с выражением
Сумма(Сумма). Без ресурса итогов по группировкам не будет. - В настройках создайте элемент «Таблица».
- В таблицу добавьте группировку строк и группировку колонок.
- Общие итоги по вертикали и горизонтали включаются в параметрах вывода.
Через Excel
Если отчёт нужен один раз, проще сохранить его в .xlsx и построить сводную таблицу в Excel. Перед этим уберите из отчёта шапку и итоговые строки, иначе Excel посчитает их дважды.
Копейки и округление: откуда берутся расхождения
Тип Число в 1С десятичный. Поэтому классической ошибки двоичной арифметики здесь нет: 0.1 + 0.2 даёт ровно 0.3. Расхождения в копейках появляются по другим причинам.
📌 Откуда берётся «лишняя» копейка:
- ➗ Распределение суммы. 1 000 руб. на три строки — это 333,33 × 3 = 999,99. Одна копейка пропала.
- 🧮 НДС по строкам и от итога. НДС, посчитанный в каждой строке и округлённый, в сумме может отличаться от НДС с общей суммы документа на 1-2 копейки.
- 📏 Точность реквизита. Если реквизит описан как
Число(15, 2), третий знак после запятой отбрасывается при записи. Промежуточный результат в коде мог быть точнее. - 🔢 Деление в запросе. Результат деления в запросе приходит с большим числом знаков. Приводите его явно:
ВЫРАЗИТЬ(Поле1 / Поле2 КАК ЧИСЛО(15, 2)).
Как округлять в коде
Функция Окр(Число, Разрядность, РежимОкругления) округляет до нужного знака. Режим РежимОкругления.Окр15как20 — привычное арифметическое округление: 0,005 превращается в 0,01. Режим Окр15как10 округляет половину вниз.
Цена = Окр(1000 / 3, 2, РежимОкругления.Окр15как20); // 333.33
Как распределить сумму без потери копеек
Приём простой: округляйте каждую долю, а остаток от округления добавьте в последнюю строку.
Всего = 1000;
КоличествоСтрок = 3;
Распределено = 0;
Доли = Новый Массив;
Для Сч = 1 По КоличествоСтрок Цикл
Если Сч = КоличествоСтрок Тогда
Доля = Всего - Распределено;
Иначе
Доля = Окр(Всего / КоличествоСтрок, 2, РежимОкругления.Окр15как20);
КонецЕсли;
Доли.Добавить(Доля);
Распределено = Распределено + Доля;
КонецЦикла;
// Доли: 333.33, 333.33, 333.34 — в сумме ровно 1000
Часто остаток кладут не в последнюю, а в самую крупную строку: так относительная погрешность меньше. При распределении пропорционально весам (например, доставки по стоимости товаров) логика та же.
Не правьте суммы в проведённых документах вручную ради копейки. Это меняет проводки и может разойтись с уже отправленными контрагенту документами. Сначала найдите, на каком шаге возникло расхождение.
Частые ошибки при подсчёте суммы
- ❌ Сумма в отчёте не сходится с ОСВ. Чаще всего отчёт построен по документам, а ОСВ — по проводкам. Непроведённые документы и ручные операции дают разницу. Сверяйте с одного источника.
- ❌ Итоги задвоились. При выделении в отчёте захватили строку группировки вместе с детальными строками. Выделяйте только детальные строки или только итоги групп.
- ❌ В запросе сумма завышена в разы. Соединили документ с табличной частью и суммируете реквизит шапки: он повторяется в каждой строке товаров. Суммируйте поле табличной части или группируйте до соединения.
- ❌ Сумма с минусом там, где его не ждали. В регистрах накопления расход хранится отдельным видом движения. Если суммировать поле без учёта вида движения, приход и расход сложатся. Используйте виртуальную таблицу остатков или оборотов.
- ❌ В обработке сумма считается с ошибкой «Преобразование значения к типу Число не может быть выполнено». В колонке оказалась строка или пустое значение другого типа. Проверьте тип колонки таблицы значений и задайте ему
Число.
Частые вопросы
Почему при выделении ячеек в отчёте сумма не показывается?
Можно ли посчитать среднее или количество, а не сумму?
СРЕДНЕЕ(), КОЛИЧЕСТВО(), МИНИМУМ(), МАКСИМУМ(). В отчётах новых релизов показатель выделения переключается рядом с суммой.Как посчитать сумму с нарастающим итогом по месяцам?
ВычислитьВыражение("Сумма(Сумма)", , , "Первая", "Текущая"). В запросе то же делают соединением таблицы с самой собой по условию «дата меньше или равна».