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