Почему не срабатывает событие ПриОкончанииРедактирования для новой строки Дерева Значений в обычных формах и как это исправить?

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

При работе с обычными формами (ОФ) в 1С разработчики часто сталкиваются с тем, что стандартные события табличного поля ведут себя не совсем очевидно. Одной из таких проблем является ситуация, когда событие ПриОкончанииРедактирования для ДереваЗначений корректно отрабатывает на существующих записях, но игнорирует момент создания новой строки. Давайте подробно проанализируем причины такого поведения и разберем эффективные способы решения задачи.

Выясним причину: почему событие игнорирует новую строку?

Для начала проанализируем механику работы события ПриОкончанииРедактирования. В обычных формах это событие уровня всего элемента управления (табличного поля). Оно предназначено для фиксации факта завершения циклической правки всей строки. Однако при добавлении новой строки интерактивный процесс часто прерывается или переходит в специфическое состояние, при котором фокус элемента управления еще не зафиксировал окончание ввода данных в терминах платформы.

Часто проблема заключается в том, что пользователь ожидает срабатывания логики сразу после заполнения ячейки в новой строке, но ПриОкончанииРедактирования сработает только тогда, когда фокус полностью покинет строку (например, при переходе на другую строку или нажатии клавиши Enter). Если же дерево строится динамически или используются специфические режимы выделения, событие может не инициироваться вовсе. Рассмотрим альтернативные пути решения, которые позволяют «поймать» изменения более надежно.

Решение 1: Использование событий элементов управления колонок

Наиболее стабильным способом отследить ввод данных (как в новых, так и в старых строках) является работа на уровне конкретных колонок. Разберем этот механизм по шагам. Каждая колонка в табличном поле имеет свойство ЭлементУправления. По умолчанию это может быть ПолеВвода, Флажок или ПолеВыбора.

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

Решение 2: Программное назначение обработчиков через УстановитьДействие

Если ваше ДеревоЗначений создается динамически или вы не хотите загромождать свойства колонок в конфигураторе, воспользуемся методом УстановитьДействие. Это «классический» подход для обычных форм. Проанализируем пример кода, который нужно разместить в процедуре ПриОткрытии формы или после формирования структуры дерева:


// Процедура инициализации обработчиков
Процедура НазначитьОбработчикиКолонокДерева()
    
    // Получаем доступ к нужной колонке
    КолонкаНаименование = ЭлементыФормы.ДеревоЗначений.Колонки.Наименование;
    
    // Назначаем действие "ПриИзменении" для элемента управления в ячейке
    КолонкаНаименование.ЭлементУправления.УстановитьДействие("ПриИзменении", "КолонкаНаименованиеПриИзменении");
    
КонецПроцедуры

// Сам обработчик события
Процедура КолонкаНаименованиеПриИзменении(Элемент)
    
    // Получаем текущую строку дерева
    ТекущаяСтрока = ЭлементыФормы.ДеревоЗначений.ТекущаяСтрока;
    
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Здесь выполняем необходимую логику для новой или измененной строки
    Сообщить("Значение изменено на: " + Элемент.Значение);
    
КонецПроцедуры

Важный момент: метод УстановитьДействие первым параметром принимает имя события (строка), а вторым — имя процедуры-обработчика, которая должна располагаться в модуле формы и иметь соответствующую сигнатуру (количество параметров).

Решение 3: Разница между ПередОкончаниемРедактирования и ПриОкончанииРедактирования

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

  1. НоваяСтрока (Булево) — истина, если редактируется только что созданная строка.
  2. Отказ (Булево) — если установить в значение Истина, система не даст завершить редактирование, пока ошибки не будут исправлены.

Пример использования для контроля заполнения новой строки:


Процедура ДеревоЗначенийПередОкончаниемРедактирования(Элемент, НоваяСтрока, Отказ)
    
    Если НоваяСтрока Тогда
        Если ПустаяСтрока(Элемент.ТекущиеДанные.Наименование) Тогда
            Сообщить("Наименование в новой строке не может быть пустым!");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Решение 4: Инициализация данных через ПриНачалеРедактирования

Если ваша задача — не просто «поймать» окончание ввода, а подготовить новую строку (заполнить значения по умолчанию), то проанализируем событие ПриНачалеРедактирования. Оно срабатывает ровно в тот момент, когда пользователь нажал «Добавить» или начал печатать в пустой строке. Здесь также доступен флаг НоваяСтрока, что позволяет нам гибко управлять процессом создания элементов дерева.

Посмотрим на пример заполнения реквизитов по умолчанию:


Процедура ДеревоЗначенийПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    
    Если НоваяСтрока И Не Копирование Тогда
        // Установим текущую дату и ответственного для новой строки дерева
        ТекущиеДанные = Элемент.ТекущиеДанные;
        ТекущиеДанные.ДатаСоздания = ТекущаяДата();
        ТекущиеДанные.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    
КонецПроцедуры

Подведем итоги

Мы проанализировали основные причины, по которым ПриОкончанииРедактирования может казаться нерабочим для новых строк в обычных формах. Основной вывод: события уровня табличного поля ориентированы на жизненный цикл всей строки, а события элементов управления колонок — на конкретные данные.

Для реализации надежного интерфейса рекомендуем придерживаться следующей стратегии:

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

← На главную