Как настроить автоматический расчет суммы в табличной части документа 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Анализ задачи и выбор инструментов

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

  1. Событие ПриИзменении: Это основной триггер, который мы будем использовать для полей ввода.
  2. ТекущиеДанные: Свойство таблицы формы, которое позволяет получить доступ к строке, в которой сейчас находится курсор пользователя.
  3. Клиентский контекст: Расчеты должны происходить максимально быстро, поэтому основной код мы будем писать в процедурах &НаКлиенте.

Рассмотрим подробнее реализацию этого алгоритма на примере типовой табличной части под названием Товары.

Шаг 1. Создание обработчиков событий на форме

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

Выясним причину, почему это важно сделать для обоих полей: если пользователь сначала введет количество, а затем цену (или наоборот), сумма должна быть актуальной в любом случае. Перейдем к коду обработчиков.


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

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

Обратите внимание: мы не дублируем код расчета в каждой процедуре, а вызываем одну общую вспомогательную процедуру РассчитатьСуммуСтрокиТабличнойЧасти. Это соответствует принципам правильной архитектуры кода и упрощает дальнейшее обслуживание системы.

Шаг 2. Реализация алгоритма расчета

Теперь проанализируем код самой процедуры расчета. Нам нужно получить данные текущей строки, проверить их наличие и выполнить арифметическую операцию. Посмотрим на пример реализации:


&НаКлиенте
Процедура РассчитатьСуммуСтрокиТабличнойЧасти()
    
    // Получаем текущую строку таблицы
    СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
    
    // Проверяем, что строка действительно выбрана (не неопределено)
    Если СтрокаТаблицы <> Неопределено Тогда
        
        // Выполняем расчет суммы
        // Используем стандартную формулу: Сумма = Количество * Цена
        СтрокаТаблицы.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
        
        // Если в вашей конфигурации предусмотрен расчет НДС,
        // здесь можно вызвать дополнительный метод расчета налога
        РассчитатьНДССтроки(СтрокаТаблицы);
        
    КонецЕсли;

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

В данном примере объект ТекущиеДанные возвращает нам структуру, поля которой соответствуют реквизитам табличной части. Это позволяет нам напрямую обращаться к Количество, Цена и записывать результат в Сумма.

Шаг 3. Усложнение логики: учет скидок и НДС

Зачастую простой формулы "Цена умножить на Количество" недостаточно. В реальных бизнес-задачах мы сталкиваемся с необходимостью учета скидок (процентных или суммовых) и расчетом налога на добавленную стоимость. Разберем, как расширить наш алгоритм.

Проанализируем ситуацию, когда у нас есть колонка ПроцентСкидки. В этом случае расчет будет выглядеть следующим образом:


&НаКлиенте
Процедура РассчитатьСуммуСоСкидкой(СтрокаТаблицы)
    
    ЧистаяСумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
    СуммаСкидки = ЧистаяСумма * (СтрокаТаблицы.ПроцентСкидки / 100);
    
    СтрокаТаблицы.Сумма = ЧистаяСумма - СуммаСкидки;
    
КонецПроцедуры

Важно помнить, что при работе с валютами и суммами необходимо следить за округлением. Платформа 1С автоматически округляет значения согласно точности, заданной в метаданных реквизита (обычно это 2 знака после запятой), но в сложных расчетах может потребоваться явное использование функции Окр().

Шаг 4. Работа с общими модулями (профессиональный подход)

Если вы разрабатываете решение в рамках крупной конфигурации (например, на базе 1С:ERP или 1С:Бухгалтерия), то писать расчеты прямо в форме — не самый лучший вариант. В типовых решениях используются специализированные общие модули, такие как ОбработкаТабличныхЧастейКлиент.

Рассмотрим, как это выглядит в типовых сценариях. Вместо написания своих формул, мы вызываем экспортную процедуру модуля, которая учитывает все нюансы (налоги, валюты, склады, типы цен):


&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // Структура параметров для передачи в типовой механизм
    ПараметрыПересчета = Новый Структура;
    ПараметрыПересчета.Вставить("ИмяКолонки", "Цена");
    
    // Вызов типового пересчета (пример для БП 3.0)
    ОбработкаТабличныхЧастейКлиент.РассчитатьСуммуТабЧасти(ТекущаяСтрока, ПараметрыПересчета);
    
КонецПроцедуры

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

Шаг 5. Итоги и проверка работоспособности

Подведем итоги нашего исследования. Для реализации качественного авторасчета необходимо:

Проверим, как это работает на практике. После написания кода запустите систему в режиме "1С:Предприятие", откройте документ и попробуйте изменить цену. Если поле Сумма обновилось сразу после потери фокуса ячейкой цены — задача выполнена верно. Мы обеспечили корректность данных и удобство работы пользователя, минимизировав вероятность ошибки при вводе первичной документации.

← На главную