Суммирование в 1С 8.3: от выделения ячеек до функции СУММА в запросе

· 9 мин

Содержание

Чтобы быстро сложить суммы в 1С, откройте отчёт или выведите список в табличный документ и выделите мышью нужные ячейки: платформа сама покажет их сумму в поле над отчётом. Калькулятор для этого не нужен, а программист в такой ситуации обходится без кода.

Частое заблуждение — что 1С «не умеет считать итог по колонке» и данные надо выгружать в Excel. Умеет, причём на четырёх уровнях: в интерфейсе пользователя, в отчётах, в запросах и во встроенном языке. Какой способ выбрать, зависит от задачи: разово проверить сумму, построить отчёт или посчитать итог в обработке.

Быстрое сложение в интерфейсе: выделение, вывод списка, калькулятор

Пользователю в большинстве случаев хватает трёх приёмов. Они работают в любой конфигурации на платформе 8.3 с интерфейсом «Такси»: в Бухгалтерии 3.0, ЗУП 3.1, УТ 11.

Выделение ячеек в отчёте

Любой отчёт в 1С строится в табличном документе. Выделите в нём несколько ячеек с числами — протяните мышью или щёлкайте с зажатым Ctrl. В правом верхнем углу формы отчёта появится сумма выделенного.

  • ✅ Можно выделять несмежные ячейки через Ctrl.
  • ✅ Можно выделить целую колонку щелчком по её заголовку.
  • ✅ Если щёлкнуть по полю с суммой, в современных релизах платформы можно переключить показатель: количество ячеек, среднее, минимум, максимум.
  • ⛔ Текстовые ячейки и пустые клетки в сумму не попадают — это удобно, когда в колонку случайно попала шапка.

Сложение в списке документов

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

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

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

Калькулятор

Встроенный калькулятор открывается сочетанием Ctrl+F2. Им удобно сложить два-три числа из разных мест. Результат можно скопировать и вставить в числовое поле документа.

В самом числовом поле формы тоже есть кнопка калькулятора — значок справа от поля. Набрали выражение, нажали Enter, и результат записался в поле.

Итоги в отчётах: ОСВ, универсальный отчёт и СКД

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

Стандартные отчёты бухгалтерии

В Бухгалтерии 3.0 итоги уже заложены в стандартные отчёты из раздела Отчеты:

ЗадачаОтчётЧто он суммирует
Обороты и сальдо по всем счетамОборотно-сальдовая ведомостьДебет и кредит за период, итог по каждому счёту и по плану счетов
Обороты одного счёта в разрезе корреспонденцииАнализ счетаСуммы оборотов по корреспондирующим счетам
Суммы по контрагенту, договору, номенклатуреОборотно-сальдовая ведомость по счетуОбороты по субконто с итогами по группам
Произвольная выборка по регистру или документамУниверсальный отчетЧисловые поля выбранного источника

Чтобы сложить суммы, например, по всем покупателям одной группы, в ОСВ по счету 62 включите группировку по контрагентам и раскройте нужную папку. Итог по группе появится в её строке.

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

Он полезен, когда стандартного отчёта под задачу нет. Выберите тип источника (документ, регистр, справочник), конкретный объект и период. В настройках отчёта задайте группировки — по ним и будут считаться промежуточные итоги.

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

Своя схема компоновки данных

Разработчик в СКД управляет суммированием на вкладке «Ресурсы». Поле, добавленное туда, считается в каждой группировке и в общем итоге.

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

Числовое поле, которое не добавлено в ресурсы, в группировках не складывается. Это самая частая причина вопроса «почему в отчёте нет итогов по колонке».

Цена за единицу — пример поля, которое складывать нельзя: сумма цен по группе бессмысленна. Для неё в ресурсе ставят Среднее или считают выражением Сумма(Сумма) / Сумма(Количество).

Сложение сумм в запросе: СУММА, СГРУППИРОВАТЬ ПО, ИТОГИ

Если данные берутся запросом, складывать их нужно там же, на стороне СУБД. Это быстрее, чем перебирать строки в цикле, особенно на тысячах документов.

Агрегатная функция СУММА

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

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

Что здесь происходит:

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

NULL и пустые значения

СУММА() пропускает NULL. Но если в группе все значения NULL, результатом тоже будет NULL, а не ноль. Такое бывает при левом соединении, когда у справочника нет ни одной строки в регистре.

Поэтому при соединениях оборачивайте результат:

ЕСТЬNULL(СУММА(Продажи.Сумма), 0) КАК Сумма

Без этого NULL уйдёт в код, и следующее сложение с числом вызовет ошибку.

Виртуальные таблицы уже сложены

Для регистров накопления и бухгалтерии не нужно суммировать движения вручную. Виртуальные таблицы Остатки, Обороты и ОстаткиИОбороты возвращают готовые суммы за период. Запрос к ним с правильными параметрами быстрее и проще, чем СУММА по основной таблице регистра.

Программное сложение во встроенном языке

В коде сумму считают тремя способами. Выбор зависит от того, где лежат данные.

Метод Итог() у табличной части и таблицы значений

Самый короткий путь — метод Итог(). Он есть у табличной части объекта и у таблицы значений:

ИтогоПоДокументу = Объект.Товары.Итог("Сумма");
ИтогоКоличество = ТаблицаДанных.Итог("Количество");

Метод складывает всю колонку целиком. Колонка должна содержать числа: в таблице значений задайте ей тип Число при создании.

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

Когда складывать нужно не всё, а только часть строк, нужен цикл:

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

Переменную-накопитель обязательно инициализируйте нулём до цикла. Если забыть, в ней окажется Неопределено, и первое сложение упадёт с ошибкой.

Свёртка: сложить по группам в памяти

Метод Свернуть() таблицы значений делает то же, что СГРУППИРОВАТЬ ПО в запросе:

ТаблицаДанных.Свернуть("Номенклатура", "Количество, Сумма");

Первый параметр — колонки группировки, второй — колонки, которые складываются. Все остальные колонки после свёртки исчезнут.

Табличная часть сама по себе метода Свернуть() не имеет. Её выгружают в таблицу значений через Выгрузить(), сворачивают и загружают обратно через Загрузить().

Сумма из строки

Если число пришло строкой — из файла обмена или из буфера — сначала приведите его к числу:

Значение = Число(СтрЗаменить(ТекстСуммы, " ", ""));

Функция Число() вызовет исключение на нечисловой строке. При загрузке файлов оборачивайте её в Попытка ... Исключение, чтобы одна битая строка не останавливала всю обработку.

Итог в подвале табличной части формы

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

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

Платформа сама формирует свойство Итог<ИмяРеквизита> для каждого числового реквизита табличной части. Пересчёт идёт на лету, при каждом изменении строк.

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

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

Округление и типы чисел при сложении

Числа в 1С десятичные. Поэтому классическая проблема языков программирования, когда 0.1 + 0.2 не равно 0.3, здесь не возникает. Но копеечные расхождения всё равно бывают — из-за точности реквизитов и порядка округления.

Точность реквизита

У реквизита «Сумма» в документах обычно тип Число(15, 2): 15 цифр, из них 2 после запятой. Промежуточный результат в коде может иметь сколько угодно знаков, а при записи в реквизит он приводится к двум.

Отсюда правило: округляйте явно и в одном месте, а не надейтесь на приведение типа при записи.

Функция Окр() и режим округления

Окр(2.345, 2);                                  // 2.35
Окр(2.345, 2, РежимОкругления.Окр15как10);      // 2.34

По умолчанию работает режим Окр15как20 — пятёрка округляется вверх, как привыкли бухгалтеры.

Сумма округлённых ≠ округлённая сумма

Классический пример — распределить 100 рублей на три строки поровну.

СтрокаРасчётПосле округления
1100 / 3 = 33,3333…33,33
2100 / 3 = 33,3333…33,33
3100 / 3 = 33,3333…33,33
Итого99,99

Потерялась одна копейка. Её добавляют в последнюю строку или в строку с наибольшей суммой, чтобы итог совпал со 100,00. Типовые конфигурации так и распределяют суммы по базе: остаток от округления уходит в одну строку.

То же происходит с НДС. Налог, посчитанный с каждой строки и сложенный, может на копейку отличаться от налога, посчитанного с итоговой суммы документа. В счёте-фактуре НДС считается построчно, так что сверяйте итог документа с суммой строк, а не пересчитывайте его от общей суммы.

Где вам нужно сложить суммы?

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

Почему сумма выделенных ячеек не совпадает с итогом отчёта?
Скорее всего, в выделение попала строка промежуточного итога группы. Тогда сумма группы учитывается дважды: в строке группы и в её детальных записях. Выделяйте только детальные строки или только итоги групп.
Можно ли сложить суммы из разных отчётов?
Напрямую нет: выделение работает в пределах одного табличного документа. Скопируйте ячейки из обоих отчётов в новый табличный документ через Файл → Новый или сложите итоги калькулятором Ctrl+F2.
Почему в запросе СУММА возвращает пустое значение вместо нуля?
В группе не оказалось ни одной строки со значением — все поля NULL. Так бывает при левом соединении. Оберните выражение в ЕСТЬNULL(..., 0).
Чем ИТОГИ в запросе отличаются от СГРУППИРОВАТЬ ПО?
СГРУППИРОВАТЬ ПО схлопывает строки в одну на группу. ИТОГИ оставляет детальные строки и добавляет над ними строки итогов, которые читают обходом по группировкам.
Как сложить время или даты?
Даты не складываются, но их можно вычитать: разность двух дат в 1С — число секунд. Складывайте эти секунды как обычные числа, а в часы переводите делением на 3600.