Найти в Дзене
Не программист

Как быстро посчитать сумму документа в «1С»?

Заполнение реквизита 1С с помощью кода — очень важный навык программиста, разберем самый базовый пример в этой статье.


Бывают случаи, когда необходимо автоматически заполнить сумму документа каким-либо реквизитом. Сумма, как правило, складывается из сумм строк табличной части документа. В этой статье мы разберем, как заполнить такой реквизит автоматически в документе с одной и двумя табличными частями.

Пример 1

В компании есть документ «Приходная накладная», в которой сотрудник указывает товары, которые компания заказала у поставщиков. В табличной части сотрудник указывает данные по товару, который компания закупила, а также их цену и сумму, которую компания должна заплатить за каждый товар. Также при заполнении табличной части сотрудник руками вносит сумму документа. Сумма документа считается по следующей формуле:
Сумма документа = Сумма номенклатуры 1+ Сумма номенклатуры 2+ Сумма номенклатуры n ......
Задача заключается в том, чтобы автоматизировать процесс указания суммы документа и избавить сотрудника от лишней работы, так как он может допускать ошибки при суммировании большого объема данных.
Пример документа "Приходная накладная" в заполненном виде
Пример документа "Приходная накладная" в заполненном виде

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

Как открыть модуль объекта в конфигураторе
Как открыть модуль объекта в конфигураторе

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

Список обработчиков событий в объекте "Приходная Накладная"
Список обработчиков событий в объекте "Приходная Накладная"

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

Процедура "ПередЗаписью"
Процедура "ПередЗаписью"

Ну а программный код достаточно простой. Так как мы находимся в объекте «Документ «ПриходнаяНакладная» и нужный реквизит находится в шапке документа, то можем обратиться к нему по наименованию — «СуммаПоДокументу», но какое значение ему задать? Суммировать каждую сумму строки из табличной части номенклатуры в ручном режиме — не вариант. Но в «1С» есть специальный метод, который подойдет для этого. Метод Итог(<Колонка>), он возвращает сумму значений всех строк в указанной колонке. Тогда код для подсчета суммы будет выглядеть следующим образом:

СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма")

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

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

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

Пример 2.

В компании есть документ «Расходная накладная», в котором сотрудник указывает товары, которые компания продает по собственной цене. В одной табличной части сотрудник указывает данные по товару, а в другой — список услуг, которые компания оказывает к этому товару. Например, доставка, упаковка, сборка и т. д. Сумму документа сотрудник указывает в шапке. Сумма документа считается по следующей формуле:
Сумма документа = Сумма номенклатуры 1+ Сумма номенклатуры 2+ Сумма номенклатуры n ...... + Сумма услуги 1+ Сумма услуги 2+ Сумма услуги n ......
Сложного в вычислении такой суммы ничего нет, мы просто воспользуемся тем же кодом, что и был в прошлом примере, только перенесем его в модуль документа «Расходная накладная».

Но в нашем исходном коде нужно добавить табличную часть «Список услуг», чтобы вычисления соответствовали нашему примеру. Тогда получим следующий код.

СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма") + СписокУслуг.Итог("Сумма")

Код для документа "Расходная накладная"
Код для документа "Расходная накладная"

Вот и всё, данная конструкция очень полезна и экономит много времени для пользователей.

Напоминаю, что я только начинаю свой путь в программировании и делаю свои заметки, которые могут быть полезны для всех. Я могу ошибаться, как и все люди. Буду очень рад, если читатели этой статьи предложат другие решения или найдут ошибку в предложенном мною варианте. Мы все здесь, чтобы учиться друг у друга.