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

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

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

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

Автоподсчет суммы в 1С встречается в трех основных ситуациях: при заполнении табличной части документа (цена × количество), при выводе итогов в отчете и при работе пользователя в режиме ввода данных. Способ решения зависит от того, где именно должна считаться сумма и кто выполняет настройку — пользователь в типовой конфигурации или разработчик в конфигураторе.

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

Ниже разобраны оба сценария: пользовательский (без изменения конфигурации) и разработческий (с кодом на встроенном языке). Перед любыми изменениями в конфигураторе сделайте резервную копию информационной базы — ошибка в коде формы может нарушить проведение документов.

Где в 1С вообще считается сумма

Прежде чем настраивать, определите, о каком уровне расчета идет речь. Их три, и механизмы различаются принципиально.

Сумма по строке документа. Например, в документе «Реализация товаров и услуг» сумма строки = цена × количество с учетом скидки. Это расчет внутри табличной части, он выполняется в момент редактирования строки.

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

Итоги в отчетах. Группировки и общие итоги в СКД (системе компоновки данных) или сводных таблицах. Здесь сумма считается при формировании отчета и не хранится в базе.

Автоподсчет в типовой конфигурации без программирования

Если вы работаете в типовой 1С:Бухгалтерии или УТ и сумма по строке не считается, проверьте базовые условия, прежде чем лезть в конфигуратор.

Порядок проверки в типовой конфигурации
  1. 1
    Откройте документ и убедитесь, что в строке заполнены количество и цена — при нулевой цене сумма останется нулевой.
  2. 2
    Проверьте, что цена подставляется из справочника: при ручном стирании цены сумма не пересчитается до изменения количества.
  3. 3
    Измените количество или цену и уйдите из ячейки (Enter или Tab) — пересчет срабатывает при завершении редактирования ячейки, а не в процессе ввода.
  4. 4
    Проверьте итог в подвале документа: он обновляется после записи или проведения документа, а не мгновенно.
  5. 5
    Если конфигурация дорабатывалась, уточните у разработчика, не отключен ли штатный обработчик пересчета.

Важный нюанс: пересчет суммы в табличной части срабатывает по событию изменения поля. Если вы вставили данные копированием из Excel целиком, события изменения могут не отработать для каждой строки — тогда суммы останутся пустыми. Лечение: пройтись по строкам и переввести количество, либо перепровести документ, если в конфигурации пересчет выполняется и при проведении.

Итог по документу в типовых формах часто вычисляется функцией вида Товары.Итог("Сумма") и выводится в поле на форме. Если поле итога не видно, проверьте настройки формы: кнопка «Еще» → «Изменить форму» — возможно, поле просто скрыто.

Автоподсчет суммы в табличной части: код для разработчика

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

Откройте конфигуратор, найдите документ, откройте модуль его основной формы и добавьте процедуру пересчета и два обработчика:

bsl
&НаКлиенте
Процедура РассчитатьСуммуСтроки()
    Строка = Элементы.Товары.ТекущиеДанные;
    Если Строка = Неопределено Тогда
        Возврат;
    КонецЕсли;
    Строка.Сумма = Строка.Цена * Строка.Количество;
КонецПроцедуры

&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    РассчитатьСуммуСтроки();
КонецПроцедуры

&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    РассчитатьСуммуСтроки();
КонецПроцедуры

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

Если в строке есть НДС и скидка, расчет расширяется: сначала сумма без скидки, затем сумма скидки, затем итог и сумма НДС по ставке. Логику удобно вынести в общий модуль с признаком «Клиент», чтобы не дублировать код в каждом документе.

Пересчет итога документа

Итог в шапке обычно пересчитывают в обработчике «ПередЗаписью» формы или в процедуре «ОбработкаЗаполнения»/«ПередЗаписью» модуля объекта:

bsl
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    СуммаДокумента = Товары.Итог("Сумма");
КонецПроцедуры

Размещение пересчета итога в модуле объекта надежнее, чем в форме: он сработает при любом способе записи — интерактивном, программном, при обмене данными или загрузке из файла.

Автоподсчет итогов в отчетах

Если задача — видеть сумму в отчете, программировать ничего не нужно: итоги настраиваются в схеме компоновки данных.

Для отчета на СКД откройте закладку «Ресурсы» и добавьте поле «Сумма» с агрегатной функцией «Сумма». Затем на закладке «Настройки» в пользовательском режиме включите вывод общих итогов: «Настройки» → «Общие итоги». В типовых отчетах (например, «Продажи» в УТ) итоги включаются прямо в форме отчета через настройки группировок.

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

Где размещать расчет суммы

Модуль формы (ПриИзменении)

Подходит для интерактивного пересчета при вводе. Ограничение: не сработает при программной записи или обмене.

Модуль объекта (ПередЗаписью)

Гарантирует корректный итог при любом способе записи. Не дает мгновенного пересчета на экране в момент ввода.

СКД (ресурсы отчета)

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

Расширение конфигурации

Для доработки типовой без снятия с поддержки. Ограничение: не все обработчики формы удобно переопределить в расширении.

Типичные ошибки и их последствия

Типичные ошибки
01
Обработчик написан, но не привязан к событию поля в свойствах формы — пересчет просто не вызывается.
02
Пересчет размещен только в форме: при загрузке документов обменом суммы остаются нулевыми, отчеты расходятся с документами.
03
Использование Итог() по колонке, где часть строк не заполнена — итог занижен без сообщений об ошибке.
04
Пересчет суммы без учета скидки и НДС: сумма строки не сходится с печатной формой и данными по НДС.
05
Изменение типовой формы напрямую вместо расширения — конфигурация снимается с поддержки, обновления становятся ручными.
06
Округление промежуточных значений в каждой строке: копеечные расхождения итога документа с суммой по строкам.

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

Проверка результата после настройки

После внедрения пересчета проверьте его на контрольных примерах, а не только «на глаз».

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

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

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

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

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

Сумма пустая или обновляется только после записи документа

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

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

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

Итог отличается от суммы строк или не обновляется после записи

Загрузка данных обменом или из файла
Норма

Суммы пересчитаны корректно при программной записи

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

Суммы нулевые — пересчет есть только в форме

Строка со скидкой и НДС
Норма

Сумма с учетом скидки и НДС сходится с расчетом вручную до копейки

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

Расхождения в копейках или НДС посчитан от неверной базы

Дополнительно полезно сформировать отчет по документам за тестовый период и сверить итоговые суммы с данными до доработки. Если итоги изменились — найдите документы, где суммы были заполнены вручную с отклонением от формулы, и решите, какое значение считать правильным.

Итог

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

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

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

Почему сумма не пересчитывается, пока я не нажму Enter?

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

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

Да, но только программно: в обработчике нужно перебрать Элементы.Товары.ВыделенныеСтроки, получить данные каждой строки и просуммировать нужную колонку, результат вывести в поле на форме. Штатного «быстрого» итога по выделенным строкам в документах нет.

Как включить итог по колонке в динамическом списке?

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

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

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

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

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

Что делать, если после обновления типовой конфигурации пересчет сломался?

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