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