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

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

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

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

Автоматический расчет суммы — одна из базовых задач в 1С: пользователь вводит количество и цену, а программа сама считает сумму по строке, итог по документу, НДС и скидки. В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ERP) этот механизм уже встроен, и чаще всего задача сводится к его правильному включению или восстановлению после доработок. Если же вы разрабатываете собственный документ, расчет нужно запрограммировать в модуле формы.

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

Как работает автоматический расчет в типовых документах

В типовых решениях 1С табличная часть документа (например, «Товары» в реализации или поступлении) содержит колонки «Количество», «Цена» и «Сумма». Как только пользователь заполняет количество и цену, срабатывает обработчик события «ПриИзменении», который перемножает значения и записывает результат в колонку «Сумма». Одновременно пересчитываются НДС, итоговая сумма документа и, при необходимости, скидки.

Проверить работу механизма просто: создайте тестовый документ, добавьте строку, укажите номенклатуру, количество 2 и цену 500. Если в колонке «Сумма» появилось 1000 — автоматический расчет работает. Если поле осталось пустым, причина обычно в доработках конфигурации, отключенных обработчиках или в том, что цена не подставилась из-за пустого регистра цен.

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

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

Ввод количества и цены в строке
Норма

Сумма по строке пересчитывается сразу после ухода из поля

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

Поле «Сумма» остается пустым или нулевым

Итог по документу
Норма

Итоговая сумма в подвале равна сумме всех строк

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

Итог не совпадает с ручным сложением строк

Пересчет при изменении строки
Норма

При изменении количества сумма и НДС обновляются

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

Старые значения сохраняются до перепроведения

Настройка автоматического расчета без программирования

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

Полезные шаги в пользовательском режиме:

  • Откройте карточку номенклатуры и проверьте наличие действующей цены на дату документа.
  • В шапке документа укажите тип цен, валюту и признак «Сумма включает НДС» — от этого зависит результат расчета.
  • Проверьте, не стоит ли у пользователя ограничение прав на редактирование цен и сумм — тогда поля могут быть заблокированы.
  • Если используется ручная скидка, убедитесь, что она применяется до расчета итога, а не после.

Программный расчет суммы в модуле формы документа

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

Типовой код процедуры выглядит так:

&НаКлиенте

Процедура ТоварыКоличествоПриИзменении(Элемент)

РассчитатьСуммуСтроки();

КонецПроцедуры

&НаКлиенте

Процедура ТоварыЦенаПриИзменении(Элемент)

РассчитатьСуммуСтроки();

КонецПроцедуры

&НаКлиенте

Процедура РассчитатьСуммуСтроки()

Строка = Элементы.Товары.ТекущиеДанные;

Если Строка = Неопределено Тогда

Возврат;

КонецЕсли;

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

КонецПроцедуры

Обратите внимание на директиву &НаКлиенте: пересчет строки должен выполняться на клиенте, чтобы пользователь видел результат мгновенно, без обращения к серверу. Вызов сервера на каждое изменение поля заметно замедлит ввод данных при десятках строк.

Порядок действий в конфигураторе
  1. 1
    Откройте форму документа и найдите табличную часть
  2. 2
    Для полей «Количество» и «Цена» создайте обработчик ПриИзменении
  3. 3
    Добавьте клиентскую процедуру РассчитатьСуммуСтроки с формулой Количество * Цена
  4. 4
    Добавьте пересчет НДС и итогов, если они используются
  5. 5
    Обновите конфигурацию базы данных и протестируйте на копии
  6. 6
    Проверьте расчет при разных комбинациях: нулевое количество, нулевая цена, дробные значения

Пересчет итогов, НДС и скидок

Расчет суммы строки — только первый уровень. В реальных документах нужны итоги: общая сумма, сумма НДС, сумма со скидкой. Итог по табличной части обычно выводится автоматически, если у колонки «Сумма» в конфигураторе установлено свойство «ПутьКДаннымПодвала» (итог по колонке). Если итог не отображается, проверьте это свойство в палитре свойств поля.

НДС считается от суммы строки по ставке, указанной в строке или в шапке документа. Формула при ставке 20% и выключенном «Сумма включает НДС»: СуммаНДС = Сумма 20 / 100. При включенном флаге НДС выделяется: СуммаНДС = Сумма 20 / 120. Округление выполняйте до двух знаков после запятой с помощью функции Окр(), иначе на большом числе строк накопятся копеечные расхождения с первичными документами контрагентов.

Скидки и наценки

Если требуется автоматическая скидка, добавьте в строку поле «ПроцентСкидки» и считайте сумму как Количество Цена (1 - ПроцентСкидки / 100). Важно определить порядок: скидка применяется до расчета НДС, иначе налог будет посчитан от завышенной базы.

Типичные ошибки и как их исправить

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

Еще одна группа ошибок связана с типами данных. Если реквизит «Цена» имеет тип «Число» с нулевой точностью, копейки будут отбрасываться. Убедитесь, что у денежных реквизитов разрядность дробной части не меньше 2. Также проверьте, что пользователь не вводит сумму вручную поверх автоматики: в некоторых конфигурациях ручное редактирование суммы отключает автопересчет строки до конца сеанса редактирования.

Типичные ошибки
01
Обработчик повешен только на «Количество», а на «Цена» забыли — сумма не обновляется при смене цены
02
Расчет написан на сервере — интерфейс тормозит на каждой строке
03
Нет проверки Строка = Неопределено — ошибка при изменении поля в пустой таблице
04
Не используется Окр() — копеечные расхождения с документами поставщиков
05
Доработка выполнена в рабочей базе без копии — риск испортить проведенные документы

Альтернативы: расчет при проведении и запросами

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

Для отчетов сумму часто вообще не хранят, а вычисляют в запросе выражением Количество * Цена или берут из виртуальных таблиц регистров накопления, куда документ записал уже посчитанные ресурсы. Выбор зависит от задачи: для интерактивного ввода нужен расчет на форме, для аналитики — данные регистров.

Сравнение вариантов

Расчет на форме (ПриИзменении)

Мгновенный результат для пользователя; обязателен для интерактивного ввода, но не гарантирует корректность при загрузке данных минуя форму

Расчет при проведении

Надежная фиксация суммы в движениях; пользователь не видит результат до записи документа

Вычисление в запросе/отчете

Не требует хранения суммы; подходит для аналитики, но не для печатных форм документа

Итог

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

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

FAQ: частые вопросы по автоматическому расчету суммы

Почему сумма в строке не считается, хотя цена и количество заполнены?

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

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

Добавьте обработчик «ПриИзменении» на поле курса в шапке документа и в нем пройдите циклом по всем строкам табличной части, вызывая для каждой процедуру пересчета. Перед массовым пересчетом стоит задать пользователю вопрос-подтверждение, чтобы не перезаписать вручную скорректированные суммы.

Можно ли настроить расчет без доступа к конфигуратору?

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

Сумма в документе расходится на копейки с счетом поставщика. Что делать?

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

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

Напишите сервисную обработку: запросом выберите документы за период, в цикле откройте каждый объект, пересчитайте строки той же формулой и запишите. Выполняйте обработку на копии базы и только для непроведенных документов либо с полным контролем последствий перепроведения.