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