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