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