Разработка и Конфигурация · 10 мин
Как рассчитать сумму документа в 1С
Как рассчитать сумму документа в 1С: автоматический пересчёт в табличной части, итоги по документу, примеры кода на встроенном языке и типичные ошибки.
Сумма документа в 1С — это, как правило, итог по колонке «Сумма» табличной части (товаров, услуг, оплат). В типовых конфигурациях пересчёт уже встроен: при изменении количества или цены строка пересчитывается автоматически, а итог выводится в подвале таблицы или в отдельном реквизите шапки. Проблемы возникают в двух случаях: когда итог не считается из-за настроек формы или когда сумму нужно получить программно — в обработке, отчёте или собственном документе.
Способ расчёта зависит от задачи. Пользователю достаточно понимать, откуда берётся итог на форме и почему он может не совпадать с ожиданиями. Разработчику нужно знать типовые процедуры пересчёта строки, методы свёртки табличной части и правильное место для вызова расчёта — на клиенте или на сервере.
Ниже разобраны оба сценария: работа в готовой конфигурации (1С:Бухгалтерия, Управление торговлей, ERP) и программный расчёт суммы документа на встроенном языке с примерами кода.
Откуда берётся сумма документа в типовых конфигурациях
В документах вроде «Реализация товаров и услуг» или «Поступление товаров» сумма складывается из трёх уровней. Первый — сумма строки: количество, умноженное на цену, с учётом скидки. Второй — итог по табличной части: сумма всех строк. Третий — итог с НДС: к сумме добавляется налог, если документ его учитывает.
Итоговое значение обычно выводится прямо на форме: под таблицей товаров или в полях «Всего», «Сумма», «Сумма НДС» внизу документа. Если итогов на форме не видно, проверьте, не свёрнута ли область итогов и не изменена ли форма настройками «Ещё — Изменить форму».
Важно различать сумму документа и сумму по кнопке «Итого» в списке документов: журнал показывает суммы проведённых документов по данным реквизита, а не пересчитывает табличные части на лету.
Как пересчитывается сумма строки
Стандартная логика строки: Сумма = Количество × Цена − Скидка. Если в строке есть ставка НДС, отдельно считается СуммаНДС, а поле «Всего» формируется как Сумма плюс НДС (или сумма уже включает налог — зависит от флага «Сумма включает НДС» в документе).
Автоматический пересчёт срабатывает на события «ПриИзменении» полей количества, цены, процента скидки и ставки НДС. Если вы меняете цену, а сумма строки не обновляется, чаще всего форма документа была доработана и обработчик события отключён либо заменён собственным кодом.
Ручное редактирование суммы тоже возможно: в типовых документах при вводе суммы вручную обратно пересчитывается цена. Это удобно при согласовании круглых итогов с контрагентом, но приводит к «некрасивым» ценам с копейками.
Как посмотреть и проверить итог документа без программирования
Для проверки итога откройте документ и сравните сумму в подвале таблицы с расчётом «на калькуляторе» по нескольким строкам. Если итог отличается, проверьте: не скрыты ли строки отбором на форме, нет ли в табличной части строк с нулевым количеством, одинаковая ли валюта и ставка НДС во всех строках.
Ещё один способ — отчёт «Печать» или стандартная печатная форма (ТОРГ-12, счёт-фактура): итоги там выводятся из тех же данных, и расхождение печатной формы с формой документа указывает на доработку одного из механизмов.
Как проверить результат
Равен сумме всех строк с учётом скидок
Отличается — есть скрытые строки или доработанный пересчёт
Соответствует ставкам НДС по строкам
НДС не совпадает — проверьте флаг «Сумма включает НДС»
Итоги совпадают с формой документа
Расхождение — форма или печать доработаны
Программный расчёт суммы: метод Итог()
Самый короткий способ получить сумму документа в коде — метод Итог() табличной части. Он суммирует значения указанной колонки по всем строкам и работает как у объекта документа, так и у данных формы.
СуммаДокумента = ДокументОбъект.Товары.Итог("Сумма");
СуммаНДС = ДокументОбъект.Товары.Итог("СуммаНДС");
ИтогоСНДС = СуммаДокумента + СуммаНДС;
Если сумма хранится в реквизите шапки (например, «СуммаДокумента»), типовые конфигурации заполняют его при записи именно таким итогом. При самостоятельной разработке не храните итог в шапке без необходимости: это дублирование данных, которое легко рассинхронизировать. Реквизит оправдан, только если по нему строятся отборы в списках и отчётах.
СуммаДокумента = ДокументОбъект.Товары.Итог("Сумма");Пересчёт строки в коде: типовой подход
Когда табличная часть заполняется программно, сумму каждой строки нужно считать явно. В типовых конфигурациях для этого есть общие модули, например процедуры вида РассчитатьСуммуСтроки или обработчики из модуля формы. В собственной конфигурации расчёт выглядит так:
Строка.Сумма = Строка.Количество * Строка.Цена;
Если Строка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
Строка.СуммаНДС = Строка.Сумма * 20 / 120;
Иначе
Строка.СуммаНДС = 0;
КонецЕсли;
Формула НДС зависит от того, включён налог в цену или начисляется сверху. При ставке «сверху» налог считается как Сумма × 20 / 100, при включённом — как Сумма × 20 / 120. Путаница между этими вариантами — самая частая причина копеечных расхождений с контрагентами.
Если расчёт выполняется на форме, вызывайте его в обработчиках ПриИзменении количества, цены и ставки НДС. Если данные меняются на сервере (заполнение по кнопке, обмен), пересчёт делается в серверной процедуре сразу после заполнения строк.
- 1Заполните или измените строки табличной части
- 2Для каждой строки рассчитайте Сумму по формуле Количество × Цена с учётом скидки
- 3Рассчитайте СуммаНДС по ставке строки с учётом признака «сумма включает НДС»
- 4Получите итоги через Итог("Сумма") и Итог("СуммаНДС")
- 5При необходимости запишите итог в реквизит шапки и проверьте печатную форму
Расчёт суммы по выборке документов
В отчётах и обработках сумму обычно нужно получить сразу по множеству документов. Перебирать документы в цикле и вызывать Итог() для каждого — медленно: правильнее использовать запрос с группировкой.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваров.Ссылка КАК Документ,
| СУММА(РеализацияТоваров.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
| РеализацияТоваров.Ссылка";
Запрос к табличной части (через точку после имени документа) — ключевой приём: он позволяет суммировать строки по любым условиям, не открывая сами документы. Для итогов по проведённым документам добавьте условие на реквизит «Проведен».
Способы получить сумму документа
Быстро и просто для одного открытого объекта; не подходит для пакетной обработки множества документов
Нужен, когда сумма считается по сложной формуле с условиями; медленнее и многословнее
Оптимален для отчётов и выборок по многим документам; требует аккуратности с соединениями и отборами
Типичные ошибки и ограничения
Частая ошибка — расчёт суммы в событии «ПередЗаписью» без учёта того, что табличная часть могла быть изменена после пересчёта. Пересчитывайте итоги непосредственно после изменения строк, а не «на всякий случай» в нескольких местах: дублирующиеся вызовы затрудняют отладку.
Вторая группа ошибок связана с округлением. Суммы строк округляйте до копеек сразу после расчёта, иначе итог по документу разойдётся с суммой округлённых строк на копейки. Используйте форматную строку или функцию Окр() с явным указанием разрядности.
Третья ловушка — мультивалютные документы: итог по колонке «Сумма» даст значение в валюте документа, а для учёта в валюте регламентированного учёта нужен пересчёт по курсу на дату документа. Смешивать эти суммы в одном реквизите нельзя.
Частые вопросы
Почему итог документа не совпадает с суммой строк?
Чаще всего на форме применён отбор строк (видна только часть табличной части), либо итог в подвале выводится с НДС, а колонка «Сумма» — без него. Сравните итог с печатной формой: если печать совпадает со строками, проблема только в отображении на форме.
Как получить сумму документа из списка, не открывая его?
Если в документе есть реквизит шапки «СуммаДокумента», добавьте его в настройку списка через «Ещё — Изменить форму». Если реквизита нет, сумму можно получить только запросом к табличной части — в динамическом списке это делается изменением текста запроса списка.
Сумма строки не пересчитывается при изменении цены. Что делать?
Проверьте, назначен ли обработчик событию «ПриИзменении» поля «Цена» в свойствах формы. В доработанных конфигурациях обработчик мог быть заменён — тогда пересчёт нужно добавить в него вручную или вернуть типовой вызов.
Как посчитать сумму только по выделенным строкам?
Интерактивно — выделите строки и посмотрите итог в строке состояния, если конфигурация это поддерживает. Программно — пройдите циклом по выделенным строкам таблицы формы и сложите значения колонки «Сумма» в переменную.
Можно ли считать итог на клиенте без вызова сервера?
Да, метод Итог() у табличной части данных формы работает на клиенте, и простой пересчёт строки (количество × цена) тоже. Вызов сервера нужен только если расчёт требует данных, которых нет на форме, — курсов валют, остатков, цен из регистров.
Почему после обмена суммы в документах нулевые?
При загрузке через обмен строки табличной части часто заполняются напрямую, без вызова процедур пересчёта. Если в правилах обмена не переносятся сами суммы, их нужно рассчитать после загрузки — в обработчике «ПослеЗаписи» документа или отдельной обработкой пересчёта.
Что важно запомнить
Сумма документа в 1С — это итог по колонке «Сумма» табличной части. В типовых конфигурациях пересчёт автоматический, программно используйте Итог("Сумма") для одного документа и запрос с СУММА() для выборок. Следите за формулой НДС, округлением строк и не дорабатывайте типовые модули напрямую.