Разберем типичную ситуацию, с которой сталкиваются разработчики при расширении функционала типовых конфигураций 1С. Вы создали новую колонку в табличной части с помощью расширения и пытаетесь привязать к ней логику через событие ОбработкаВыбора. Однако, несмотря на все усилия, код внутри процедуры не выполняется. Давайте проанализируем, почему это происходит и как правильно организовать обработку данных.
Главная ошибка, которую совершают многие разработчики — это попытка использовать ОбработкаВыбора для отслеживания любого изменения значения в ячейке. Важно уяснить: событие ОбработкаВыбора предназначено исключительно для получения результата из другой формы (например, после открытия окна выбора номенклатуры, контрагента или справочника).
Если пользователь просто вводит число, строку или дату непосредственно в поле табличной части с клавиатуры, система не считает это «выбором» из стороннего объекта. Следовательно, событие ОбработкаВыбора не генерируется платформой. Для фиксации любых ручных изменений значений необходимо использовать событие ПриИзменении.
Если ваша задача — отреагировать на ввод данных пользователем, переходите к использованию события ПриИзменении. Давайте рассмотрим по шагам, как это сделать правильно:
ПриИзменении.Внутри этой процедуры у вас будет полный доступ к текущему значению элемента. Пример реализации логики:
&НаКлиенте
Процедура ИмяВашейКолонкиПриИзменении(Элемент)
// Получаем текущие данные строки
ТекущаяСтрока = Элементы.ИмяТабличнойЧасти.ТекущиеДанные;
// Выполняем проверку или расчет
Если ТекущаяСтрока.КоличествоТалонов < 0 Тогда
Сообщить("Значение не может быть отрицательным!");
ТекущаяСтрока.КоличествоТалонов = 0;
КонецЕсли;
КонецПроцедуры
Иногда возникают специфические задачи, например, необходимость сравнить «старое» значение с «новым» или отловить момент входа в ячейку. Рассмотрим следующие приемы:
Если вам критически важно знать значение, которое было в ячейке до того, как пользователь начал его редактировать, вы можете использовать событие ПриАктивизацииЯчейки. Этот обработчик позволяет сохранить «старое» значение в переменной модуля формы или в специальном реквизите формы.
Будьте осторожны: событие активизации срабатывает при каждом перемещении курсора по табличной части. Чрезмерная нагрузка на этот обработчик может привести к заметному «торможению» интерфейса, поэтому используйте его только при крайней необходимости.
Если вы создали элемент формы целиком в расширении, иногда возникают сложности с «привязкой» стандартных событий через конфигуратор. В таких случаях мы рекомендуем использовать программный метод УстановитьДействие в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элементы.ИмяВашейКолонки.УстановитьДействие("ПриИзменении", "ИмяВашейПроцедурыВМодулеФормы");
КонецПроцедуры
Этот подход обеспечивает гарантированное срабатывание кода, так как вы напрямую сообщаете платформе, какой обработчик должен отвечать за событие элемента. Для реализации подобного механизма подойдёт пример программного создания колонок в табличной части и сохранения значений.
Если вы все же хотите использовать ОбработкаВыбора (например, у вас есть своя форма выбора, которую вы открываете вручную), помните, что само по себе наличие «кнопки выбора» в поле ввода не гарантирует вызов этого события. Чтобы ОбработкаВыбора сработало, необходимо реализовать открытие формы через метод ОткрытьФорму() или ОткрытьВыбор() с использованием оповещения (ОповещениеОЗакрытии).
Без явного вызова окна выбора и передачи результата в ОповеститьОВыборе(), событие ОбработкаВыбора останется «немым». В большинстве же задач, связанных с вводом чисел или простых данных, ПриИзменении является единственно верным и надежным инструментом.
ПриИзменении.ОбработкаВыбора там, где выбора из формы не происходит.ПриАктивизацииЯчейки с переменными модуля.УстановитьДействие в ПриСозданииНаСервере для надежности.