Суммирование в 1С 8.3: от выделения ячеек до функции СУММА в запросе
Содержание
Чтобы быстро сложить суммы в 1С, откройте отчёт или выведите список в табличный документ и выделите мышью нужные ячейки: платформа сама покажет их сумму в поле над отчётом. Калькулятор для этого не нужен, а программист в такой ситуации обходится без кода.
Частое заблуждение — что 1С «не умеет считать итог по колонке» и данные надо выгружать в Excel. Умеет, причём на четырёх уровнях: в интерфейсе пользователя, в отчётах, в запросах и во встроенном языке. Какой способ выбрать, зависит от задачи: разово проверить сумму, построить отчёт или посчитать итог в обработке.
Быстрое сложение в интерфейсе: выделение, вывод списка, калькулятор
Пользователю в большинстве случаев хватает трёх приёмов. Они работают в любой конфигурации на платформе 8.3 с интерфейсом «Такси»: в Бухгалтерии 3.0, ЗУП 3.1, УТ 11.
Выделение ячеек в отчёте
Любой отчёт в 1С строится в табличном документе. Выделите в нём несколько ячеек с числами — протяните мышью или щёлкайте с зажатым Ctrl. В правом верхнем углу формы отчёта появится сумма выделенного.
- ✅ Можно выделять несмежные ячейки через
Ctrl. - ✅ Можно выделить целую колонку щелчком по её заголовку.
- ✅ Если щёлкнуть по полю с суммой, в современных релизах платформы можно переключить показатель: количество ячеек, среднее, минимум, максимум.
- ⛔ Текстовые ячейки и пустые клетки в сумму не попадают — это удобно, когда в колонку случайно попала шапка.
Сложение в списке документов
В журнале документов или в списке справочника суммы складывать напрямую неудобно: это динамический список, и выделенные строки в нём не суммируются. Обходной путь простой.
- Откройте нужный список, например список документов поступления.
- Отфильтруйте его: по контрагенту, по периоду, по организации.
- Нажмите
Ещё → Вывести список.... - Снимите флажки с лишних колонок и нажмите «ОК».
- В открывшемся табличном документе выделите колонку «Сумма» — итог появится в поле над таблицей.
Вывод списка берёт только те строки, что остались после отбора. Сначала настройте фильтр, потом выводите — иначе в сумму попадут документы всех организаций и всех периодов.
Калькулятор
Встроенный калькулятор открывается сочетанием Ctrl+F2. Им удобно сложить два-три числа из разных мест. Результат можно скопировать и вставить в числовое поле документа.
В самом числовом поле формы тоже есть кнопка калькулятора — значок справа от поля. Набрали выражение, нажали Enter, и результат записался в поле.
Итоги в отчётах: ОСВ, универсальный отчёт и СКД
Если суммировать нужно регулярно, разовое выделение ячеек не подходит. Здесь нужен отчёт, который сам считает итоги по группам.
Стандартные отчёты бухгалтерии
В Бухгалтерии 3.0 итоги уже заложены в стандартные отчёты из раздела Отчеты:
| Задача | Отчёт | Что он суммирует |
|---|---|---|
| Обороты и сальдо по всем счетам | Оборотно-сальдовая ведомость | Дебет и кредит за период, итог по каждому счёту и по плану счетов |
| Обороты одного счёта в разрезе корреспонденции | Анализ счета | Суммы оборотов по корреспондирующим счетам |
| Суммы по контрагенту, договору, номенклатуре | Оборотно-сальдовая ведомость по счету | Обороты по субконто с итогами по группам |
| Произвольная выборка по регистру или документам | Универсальный отчет | Числовые поля выбранного источника |
Чтобы сложить суммы, например, по всем покупателям одной группы, в ОСВ по счету 62 включите группировку по контрагентам и раскройте нужную папку. Итог по группе появится в её строке.
Универсальный отчёт
Он полезен, когда стандартного отчёта под задачу нет. Выберите тип источника (документ, регистр, справочник), конкретный объект и период. В настройках отчёта задайте группировки — по ним и будут считаться промежуточные итоги.
Отчёт складывает только поля, которые в источнике определены как числовые показатели. Если нужная колонка не суммируется, значит, в этом источнике она не является ресурсом — попробуйте другой источник: регистр накопления вместо документа.
Своя схема компоновки данных
Разработчик в СКД управляет суммированием на вкладке «Ресурсы». Поле, добавленное туда, считается в каждой группировке и в общем итоге.
- Откройте схему компоновки в конструкторе.
- Перейдите на вкладку «Ресурсы».
- Перенесите числовое поле из списка слева.
- В колонке «Выражение» оставьте
Сумма(Сумма)или поставьте другую агрегатную функцию:Количество,Среднее,Максимум,Минимум.
Числовое поле, которое не добавлено в ресурсы, в группировках не складывается. Это самая частая причина вопроса «почему в отчёте нет итогов по колонке».
Цена за единицу — пример поля, которое складывать нельзя: сумма цен по группе бессмысленна. Для неё в ресурсе ставят Среднее или считают выражением Сумма(Сумма) / Сумма(Количество).
Сложение сумм в запросе: СУММА, СГРУППИРОВАТЬ ПО, ИТОГИ
Если данные берутся запросом, складывать их нужно там же, на стороне СУБД. Это быстрее, чем перебирать строки в цикле, особенно на тысячах документов.
Агрегатная функция СУММА
Пример: сколько продано по каждой позиции номенклатуры за период. Имена объектов взяты из Бухгалтерии 3.0, в других конфигурациях табличная часть и реквизиты могут называться иначе.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(Товары.Количество) КАК Количество,
СУММА(Товары.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка.Проведен
И Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
ОБЩИЕ
Что здесь происходит:
- 🔹
СУММА()складывает значения внутри каждой группы. - 🔹
СГРУППИРОВАТЬ ПОзадаёт, по какому полю делить строки на группы. Каждое поле вВЫБРАТЬбез агрегатной функции должно быть в группировке. - 🔹
ИТОГИ ... ПО ОБЩИЕдобавляет строку общего итога. Её получают обходом результатаВыбрать(ОбходРезультатаЗапроса.ПоГруппировкам). - 🔹 В
ИТОГИпишут псевдонимы полей (Количество,Сумма), а не исходные пути.
NULL и пустые значения
СУММА() пропускает NULL. Но если в группе все значения NULL, результатом тоже будет NULL, а не ноль. Такое бывает при левом соединении, когда у справочника нет ни одной строки в регистре.
Поэтому при соединениях оборачивайте результат:
ЕСТЬNULL(СУММА(Продажи.Сумма), 0) КАК Сумма
Без этого NULL уйдёт в код, и следующее сложение с числом вызовет ошибку.
Виртуальные таблицы уже сложены
Для регистров накопления и бухгалтерии не нужно суммировать движения вручную. Виртуальные таблицы Остатки, Обороты и ОстаткиИОбороты возвращают готовые суммы за период. Запрос к ним с правильными параметрами быстрее и проще, чем СУММА по основной таблице регистра.
Программное сложение во встроенном языке
В коде сумму считают тремя способами. Выбор зависит от того, где лежат данные.
Метод Итог() у табличной части и таблицы значений
Самый короткий путь — метод Итог(). Он есть у табличной части объекта и у таблицы значений:
ИтогоПоДокументу = Объект.Товары.Итог("Сумма");
ИтогоКоличество = ТаблицаДанных.Итог("Количество");
Метод складывает всю колонку целиком. Колонка должна содержать числа: в таблице значений задайте ей тип Число при создании.
Цикл с условием
Когда складывать нужно не всё, а только часть строк, нужен цикл:
СуммаБезНДС = 0;
Для Каждого СтрокаТовара Из Объект.Товары Цикл
Если СтрокаТовара.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
СуммаБезНДС = СуммаБезНДС + СтрокаТовара.Сумма;
КонецЕсли;
КонецЦикла;
Переменную-накопитель обязательно инициализируйте нулём до цикла. Если забыть, в ней окажется Неопределено, и первое сложение упадёт с ошибкой.
Свёртка: сложить по группам в памяти
Метод Свернуть() таблицы значений делает то же, что СГРУППИРОВАТЬ ПО в запросе:
ТаблицаДанных.Свернуть("Номенклатура", "Количество, Сумма");
Первый параметр — колонки группировки, второй — колонки, которые складываются. Все остальные колонки после свёртки исчезнут.
Табличная часть сама по себе метода Свернуть() не имеет. Её выгружают в таблицу значений через Выгрузить(), сворачивают и загружают обратно через Загрузить().
Сумма из строки
Если число пришло строкой — из файла обмена или из буфера — сначала приведите его к числу:
Значение = Число(СтрЗаменить(ТекстСуммы, " ", ""));
Функция Число() вызовет исключение на нечисловой строке. При загрузке файлов оборачивайте её в Попытка ... Исключение, чтобы одна битая строка не останавливала всю обработку.
Итог в подвале табличной части формы
В типовых документах под колонками «Количество» и «Сумма» обычно уже стоит итоговая строка. Если в вашей форме её нет — например, в доработанном документе или своей обработке, — её включают без кода.
- Откройте форму в конфигураторе.
- Выделите элемент-таблицу и в палитре свойств включите флажок «Подвал».
- Выделите колонку, под которой нужен итог.
- В свойстве «Путь к данным подвала» укажите
Объект.Товары.ИтогСумма, гдеТовары— имя табличной части, аСумма— имя реквизита. - Для красоты задайте выравнивание в подвале по правому краю.
Платформа сама формирует свойство Итог<ИмяРеквизита> для каждого числового реквизита табличной части. Пересчёт идёт на лету, при каждом изменении строк.
В типовой конфигурации на поддержке форму лучше менять через расширение, а не снимать конфигурацию с поддержки. Тогда подвал переживёт обновление релиза.
Для таблицы значений на форме (реквизит формы, а не табличная часть объекта) такой автоматический итог не формируется. Там заводят отдельный числовой реквизит формы и пересчитывают его методом Итог() в обработчике ПриИзменении таблицы.
Округление и типы чисел при сложении
Числа в 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 рублей на три строки поровну.
| Строка | Расчёт | После округления |
|---|---|---|
| 1 | 100 / 3 = 33,3333… | 33,33 |
| 2 | 100 / 3 = 33,3333… | 33,33 |
| 3 | 100 / 3 = 33,3333… | 33,33 |
| Итого | 99,99 |
Потерялась одна копейка. Её добавляют в последнюю строку или в строку с наибольшей суммой, чтобы итог совпал со 100,00. Типовые конфигурации так и распределяют суммы по базе: остаток от округления уходит в одну строку.
То же происходит с НДС. Налог, посчитанный с каждой строки и сложенный, может на копейку отличаться от налога, посчитанного с итоговой суммы документа. В счёте-фактуре НДС считается построчно, так что сверяйте итог документа с суммой строк, а не пересчитывайте его от общей суммы.
Частые вопросы
Почему сумма выделенных ячеек не совпадает с итогом отчёта?
Можно ли сложить суммы из разных отчётов?
Файл → Новый или сложите итоги калькулятором Ctrl+F2.Почему в запросе СУММА возвращает пустое значение вместо нуля?
NULL. Так бывает при левом соединении. Оберните выражение в ЕСТЬNULL(..., 0).Чем ИТОГИ в запросе отличаются от СГРУППИРОВАТЬ ПО?
СГРУППИРОВАТЬ ПО схлопывает строки в одну на группу. ИТОГИ оставляет детальные строки и добавляет над ними строки итогов, которые читают обходом по группировкам.