В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 одной из самых частых задач является автоматизация расчетов внутри табличных частей документов. Пользователь не должен вручную перемножать цену на количество — система обязана делать это самостоятельно. В рамках данной статьи мы детально разберем, как реализовать механизм, при котором колонка Сумма обновляется мгновенно при корректировке значений в колонках Цена или Количество.
Прежде всего, проанализируем механику работы управляемых форм. Нам необходимо, чтобы код срабатывал в тот момент, когда пользователь закончил ввод данных в ячейку. Для этого в платформе предусмотрены события элементов формы. Разберем по шагам, какие именно объекты и методы нам понадобятся:
&НаКлиенте.Рассмотрим подробнее реализацию этого алгоритма на примере типовой табличной части под названием Товары.
Для начала откроем управляемую форму нашего документа в конфигураторе. Найдем в дереве элементов формы нашу таблицу Товары, а внутри нее — колонки Количество и Цена. Для каждой из этих колонок необходимо создать обработчик события ПриИзменении.
Выясним причину, почему это важно сделать для обоих полей: если пользователь сначала введет количество, а затем цену (или наоборот), сумма должна быть актуальной в любом случае. Перейдем к коду обработчиков.
&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
РассчитатьСуммуСтрокиТабличнойЧасти();
КонецПроцедуры
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
РассчитатьСуммуСтрокиТабличнойЧасти();
КонецПроцедуры
Обратите внимание: мы не дублируем код расчета в каждой процедуре, а вызываем одну общую вспомогательную процедуру РассчитатьСуммуСтрокиТабличнойЧасти. Это соответствует принципам правильной архитектуры кода и упрощает дальнейшее обслуживание системы.
Теперь проанализируем код самой процедуры расчета. Нам нужно получить данные текущей строки, проверить их наличие и выполнить арифметическую операцию. Посмотрим на пример реализации:
&НаКлиенте
Процедура РассчитатьСуммуСтрокиТабличнойЧасти()
// Получаем текущую строку таблицы
СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
// Проверяем, что строка действительно выбрана (не неопределено)
Если СтрокаТаблицы <> Неопределено Тогда
// Выполняем расчет суммы
// Используем стандартную формулу: Сумма = Количество * Цена
СтрокаТаблицы.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
// Если в вашей конфигурации предусмотрен расчет НДС,
// здесь можно вызвать дополнительный метод расчета налога
РассчитатьНДССтроки(СтрокаТаблицы);
КонецЕсли;
КонецПроцедуры
В данном примере объект ТекущиеДанные возвращает нам структуру, поля которой соответствуют реквизитам табличной части. Это позволяет нам напрямую обращаться к Количество, Цена и записывать результат в Сумма.
Зачастую простой формулы "Цена умножить на Количество" недостаточно. В реальных бизнес-задачах мы сталкиваемся с необходимостью учета скидок (процентных или суммовых) и расчетом налога на добавленную стоимость. Разберем, как расширить наш алгоритм.
Проанализируем ситуацию, когда у нас есть колонка ПроцентСкидки. В этом случае расчет будет выглядеть следующим образом:
&НаКлиенте
Процедура РассчитатьСуммуСоСкидкой(СтрокаТаблицы)
ЧистаяСумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
СуммаСкидки = ЧистаяСумма * (СтрокаТаблицы.ПроцентСкидки / 100);
СтрокаТаблицы.Сумма = ЧистаяСумма - СуммаСкидки;
КонецПроцедуры
Важно помнить, что при работе с валютами и суммами необходимо следить за округлением. Платформа 1С автоматически округляет значения согласно точности, заданной в метаданных реквизита (обычно это 2 знака после запятой), но в сложных расчетах может потребоваться явное использование функции Окр().
Если вы разрабатываете решение в рамках крупной конфигурации (например, на базе 1С:ERP или 1С:Бухгалтерия), то писать расчеты прямо в форме — не самый лучший вариант. В типовых решениях используются специализированные общие модули, такие как ОбработкаТабличныхЧастейКлиент.
Рассмотрим, как это выглядит в типовых сценариях. Вместо написания своих формул, мы вызываем экспортную процедуру модуля, которая учитывает все нюансы (налоги, валюты, склады, типы цен):
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
// Структура параметров для передачи в типовой механизм
ПараметрыПересчета = Новый Структура;
ПараметрыПересчета.Вставить("ИмяКолонки", "Цена");
// Вызов типового пересчета (пример для БП 3.0)
ОбработкаТабличныхЧастейКлиент.РассчитатьСуммуТабЧасти(ТекущаяСтрока, ПараметрыПересчета);
КонецПроцедуры
Такой подход гарантирует, что поведение вашего нового документа будет идентично поведению стандартных документов системы, что крайне важно для единообразия пользовательского опыта.
Подведем итоги нашего исследования. Для реализации качественного авторасчета необходимо:
Количество, Цена, Скидка, СтавкаНДС).ТекущиеДанные для быстрого доступа к реквизитам строки без обращения к серверу.Проверим, как это работает на практике. После написания кода запустите систему в режиме "1С:Предприятие", откройте документ и попробуйте изменить цену. Если поле Сумма обновилось сразу после потери фокуса ячейкой цены — задача выполнена верно. Мы обеспечили корректность данных и удобство работы пользователя, минимизировав вероятность ошибки при вводе первичной документации.