К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как рассчитать сумму документа в 1С

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

Сумма документа в 1С — это, как правило, итог по колонке «Сумма» табличной части (товаров, услуг, оплат). В типовых конфигурациях пересчёт уже встроен: при изменении количества или цены строка пересчитывается автоматически, а итог выводится в подвале таблицы или в отдельном реквизите шапки. Проблемы возникают в двух случаях: когда итог не считается из-за настроек формы или когда сумму нужно получить программно — в обработке, отчёте или собственном документе.

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

Ниже разобраны оба сценария: работа в готовой конфигурации (1С:Бухгалтерия, Управление торговлей, ERP) и программный расчёт суммы документа на встроенном языке с примерами кода.

Откуда берётся сумма документа в типовых конфигурациях

В документах вроде «Реализация товаров и услуг» или «Поступление товаров» сумма складывается из трёх уровней. Первый — сумма строки: количество, умноженное на цену, с учётом скидки. Второй — итог по табличной части: сумма всех строк. Третий — итог с НДС: к сумме добавляется налог, если документ его учитывает.

Итоговое значение обычно выводится прямо на форме: под таблицей товаров или в полях «Всего», «Сумма», «Сумма НДС» внизу документа. Если итогов на форме не видно, проверьте, не свёрнута ли область итогов и не изменена ли форма настройками «Ещё — Изменить форму».

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

Как пересчитывается сумма строки

Стандартная логика строки: Сумма = Количество × Цена − Скидка. Если в строке есть ставка НДС, отдельно считается СуммаНДС, а поле «Всего» формируется как Сумма плюс НДС (или сумма уже включает налог — зависит от флага «Сумма включает НДС» в документе).

Автоматический пересчёт срабатывает на события «ПриИзменении» полей количества, цены, процента скидки и ставки НДС. Если вы меняете цену, а сумма строки не обновляется, чаще всего форма документа была доработана и обработчик события отключён либо заменён собственным кодом.

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

Как посмотреть и проверить итог документа без программирования

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

Ещё один способ — отчёт «Печать» или стандартная печатная форма (ТОРГ-12, счёт-фактура): итоги там выводятся из тех же данных, и расхождение печатной формы с формой документа указывает на доработку одного из механизмов.

Контрольные точки

Как проверить результат

Итог под таблицей товаров
Норма

Равен сумме всех строк с учётом скидок

Тревожный признак

Отличается — есть скрытые строки или доработанный пересчёт

Сумма НДС
Норма

Соответствует ставкам НДС по строкам

Тревожный признак

НДС не совпадает — проверьте флаг «Сумма включает НДС»

Печатная форма
Норма

Итоги совпадают с формой документа

Тревожный признак

Расхождение — форма или печать доработаны

Программный расчёт суммы: метод Итог()

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

СуммаДокумента = ДокументОбъект.Товары.Итог("Сумма");

СуммаНДС = ДокументОбъект.Товары.Итог("СуммаНДС");

ИтогоСНДС = СуммаДокумента + СуммаНДС;

Если сумма хранится в реквизите шапки (например, «СуммаДокумента»), типовые конфигурации заполняют его при записи именно таким итогом. При самостоятельной разработке не храните итог в шапке без необходимости: это дублирование данных, которое легко рассинхронизировать. Реквизит оправдан, только если по нему строятся отборы в списках и отчётах.

bsl
СуммаДокумента = ДокументОбъект.Товары.Итог("Сумма");

Пересчёт строки в коде: типовой подход

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

Строка.Сумма = Строка.Количество * Строка.Цена;

Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда

Строка.СуммаНДС = Строка.Сумма * 20 / 120;

Иначе

Строка.СуммаНДС = 0;

КонецЕсли;

Формула НДС зависит от того, включён налог в цену или начисляется сверху. При ставке «сверху» налог считается как Сумма × 20 / 100, при включённом — как Сумма × 20 / 120. Путаница между этими вариантами — самая частая причина копеечных расхождений с контрагентами.

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

Порядок программного пересчёта документа
  1. 1
    Заполните или измените строки табличной части
  2. 2
    Для каждой строки рассчитайте Сумму по формуле Количество × Цена с учётом скидки
  3. 3
    Рассчитайте СуммаНДС по ставке строки с учётом признака «сумма включает НДС»
  4. 4
    Получите итоги через Итог("Сумма") и Итог("СуммаНДС")
  5. 5
    При необходимости запишите итог в реквизит шапки и проверьте печатную форму

Расчёт суммы по выборке документов

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваров.Ссылка КАК Документ,

| СУММА(РеализацияТоваров.Сумма) КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваров

|ГДЕ

| РеализацияТоваров.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

|СГРУППИРОВАТЬ ПО

| РеализацияТоваров.Ссылка";

Запрос к табличной части (через точку после имени документа) — ключевой приём: он позволяет суммировать строки по любым условиям, не открывая сами документы. Для итогов по проведённым документам добавьте условие на реквизит «Проведен».

Способы получить сумму документа

Итог() табличной части

Быстро и просто для одного открытого объекта; не подходит для пакетной обработки множества документов

Перебор строк в цикле

Нужен, когда сумма считается по сложной формуле с условиями; медленнее и многословнее

Запрос с СУММА()

Оптимален для отчётов и выборок по многим документам; требует аккуратности с соединениями и отборами

Типичные ошибки и ограничения

Частая ошибка — расчёт суммы в событии «ПередЗаписью» без учёта того, что табличная часть могла быть изменена после пересчёта. Пересчитывайте итоги непосредственно после изменения строк, а не «на всякий случай» в нескольких местах: дублирующиеся вызовы затрудняют отладку.

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

Третья ловушка — мультивалютные документы: итог по колонке «Сумма» даст значение в валюте документа, а для учёта в валюте регламентированного учёта нужен пересчёт по курсу на дату документа. Смешивать эти суммы в одном реквизите нельзя.

Типичные ошибки
01
Считать НДС как 20/100, когда налог уже включён в цену — итог завышается, правильная база для включённого НДС — 20/120
02
Получать сумму перебором документов в цикле вместо запроса — отчёт по большому периоду работает минутами
03
Хранить итог в шапке и не обновлять его при программном изменении строк — список документов показывает устаревшие суммы
04
Не округлять суммы строк до копеек — итог расходится с печатной формой на копейки

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

Почему итог документа не совпадает с суммой строк?

Чаще всего на форме применён отбор строк (видна только часть табличной части), либо итог в подвале выводится с НДС, а колонка «Сумма» — без него. Сравните итог с печатной формой: если печать совпадает со строками, проблема только в отображении на форме.

Как получить сумму документа из списка, не открывая его?

Если в документе есть реквизит шапки «СуммаДокумента», добавьте его в настройку списка через «Ещё — Изменить форму». Если реквизита нет, сумму можно получить только запросом к табличной части — в динамическом списке это делается изменением текста запроса списка.

Сумма строки не пересчитывается при изменении цены. Что делать?

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

Как посчитать сумму только по выделенным строкам?

Интерактивно — выделите строки и посмотрите итог в строке состояния, если конфигурация это поддерживает. Программно — пройдите циклом по выделенным строкам таблицы формы и сложите значения колонки «Сумма» в переменную.

Можно ли считать итог на клиенте без вызова сервера?

Да, метод Итог() у табличной части данных формы работает на клиенте, и простой пересчёт строки (количество × цена) тоже. Вызов сервера нужен только если расчёт требует данных, которых нет на форме, — курсов валют, остатков, цен из регистров.

Почему после обмена суммы в документах нулевые?

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

Итог

Что важно запомнить

Сумма документа в 1С — это итог по колонке «Сумма» табличной части. В типовых конфигурациях пересчёт автоматический, программно используйте Итог("Сумма") для одного документа и запрос с СУММА() для выборок. Следите за формулой НДС, округлением строк и не дорабатывайте типовые модули напрямую.