Почему не срабатывает обработчик ПриИзменении в форме документа 1С

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

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

Причина 1. Отсутствие явной привязки процедуры к событию элемента

Самая распространенная ошибка заключается в том, что процедура физически существует в модуле формы, но платформой она не вызвана, так как не назначена в свойствах конкретного элемента управления.

Наличие в модуле формы строки &НаКлиенте Процедура МатериалыКоличествоПриИзменении(Элемент) само по себе не связывает эту процедуру с полем формы. Назначение обработчиков выполняется явно.

Разберем по шагам, как проверить и привязать событие в конфигураторе:

  1. Откроем управляемую форму документа в конфигураторе.
  2. В дереве элементов формы найдем нужный элемент (например, поле ввода МатериалыКоличество в табличной части).
  3. Нажмем F4 или вызовем контекстное меню и откроем Палитру свойств элемента.
  4. Перейдем в самую нижнюю группу свойств — События.
  5. Найдем событие ПриИзменении. Если поле напротив события пустое, значит, обработчик не привязан.
  6. Выберем из выпадающего списка имя созданной процедуры или нажмем кнопку с лупой для автопривязки.

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

Причина 2. Ошибки в логике порядка ввода и расчета значений

Рассмотрим код обработчика расчета суммы в строке табличной части:


&НаКлиенте
Процедура МатериалыКоличествоПриИзменении(Элемент)
    СтрТабЧасти = Элементы.Материалы.ТекущиеДанные;
    СтрТабЧасти.Сумма = СтрТабЧасти.Цена * СтрТабЧасти.Количество;
КонецПроцедуры

Проанализируем ситуацию: если пользователь сначала указывает количество товара, когда колонка Цена еще равна 0, то в результате умножения получается 0 * Количество = 0. Пользователь видит нулевую сумму и считает, что обработчик не сработал.

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


&НаКлиенте
Процедура РассчитатьСуммуСтроки(ТекущаяСтрока)
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.Количество;
    КонецЕсли;
КонецПроцедуры

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

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

Причина 3. Безопасная работа с текущей строкой и особенностями события

Посмотрим на технические нюансы работы с событиями элементов управляемой формы:

  1. Проверка на Неопределено: Свойство ТекущиеДанные возвращает Неопределено, если в табличной части нет выбранной строки. Всегда проверяйте заполненность строки перед обращением к ее реквизитам.
  2. Момент возникновения события: Интерактивное событие ПриИзменении у поля ввода срабатывает только при потере фокуса (при нажатии Enter, Tab или клике мыши по другой ячейке), а не в процессе набора цифр с клавиатуры.
  3. Программное изменение: Изменение значений реквизитов из кода модуля не вызовет событие ПриИзменении автоматически. Если данные заполняются программно, вызов процедуры расчета необходимо производить явно.
← На главную