Почему не вызывается событие ОкончаниеВводаТекста в 1С и как это исправить?

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

Разработчики при работе с обычными формами в «1С:Предприятие 8» часто сталкиваются с неочевидным поведением элементов управления. Типичный сценарий: в документе (например, «Установка цен номенклатуры контрагентов» в УТ 10.3) создается обработчик события ОкончаниеВводаТекста для поля ввода номенклатуры. Разработчик привязывает его к событию, но при тестировании замечает, что точка останова в отладчике внутри этого обработчика не срабатывает. При этом событие ПриИзменении вызывается стабильно и без проблем.

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

Как работает событие «ОкончаниеВводаТекста»

Платформа вызывает событие ОкончаниеВводаТекста (англ. TextEditEnd) только тогда, когда на основе введенного пользователем текста требуется сформировать (распознать) конкретное значение. Это происходит при выходе из поля ввода (например, при нажатии клавиш Tab, Enter или клике мышью в другую область экрана), но при обязательном соблюдении условий:

Если эти условия не выполняются, платформа считает, что вызывать обработчик для распознавания текста нет необходимости, и просто игнорирует его, сразу переходя к событию ПриИзменении.

Рассмотрим подробнее основные причины, по которым это событие может не вызываться в вашем документе или обработке.

---

Основные причины, почему событие не вызывается

  1. Значение уже было успешно определено ранее (Автоподбор)

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

  2. Прямой интерактивный выбор (без ввода текста)

    Если пользователь выбрал номенклатуру через стандартную кнопку выбора «...» (открыв форму списка справочника) или выбрал элемент из истории выбора (выпадающего списка), событие ОкончаниеВводаТекста также не срабатывает. В этих сценариях текст не преобразуется в значение — значение присваивается напрямую в виде готовой ссылки. При этом гарантированно сработают события ОбработкаВыбора и ПриИзменении.

  3. Текст в поле ввода не изменялся

    Если пользователь просто зашел в поле ввода, ничего там не писал и вышел (даже если поле было пустым или там уже было установлено какое-то значение), событие не сработает. Платформа отслеживает именно интерактивное изменение текстовой строки.

  4. Включен режим «Быстрый выбор» или «Режим выбора из списка»

    Обратите внимание на свойства элемента управления (поля ввода) на форме. Если у поля включен флаг БыстрыйВыбор (QuickChoice) или РежимВыбораИзСписка, то стандартный ввод текста блокируется. Поле начинает работать как выпадающий список (Combo Box). При выборе элементов из такого списка событие окончания ввода текста также игнорируется платформой.

---

Разберем по шагам: как решить проблему?

В зависимости от того, какую бизнес-задачу вы пытаетесь решить, выберите один из следующих подходов.

Вариант 1. Перенос логики в событие «ПриИзменении»

Если ваша задача — выполнять какие-либо действия при любом изменении номенклатуры в поле (например, перезаполнять цены, единицы измерения, характеристики или выполнять проверку прав доступа), то использовать ОкончаниеВводаТекста архитектурно неверно.

Перенесите весь ваш код в обработчик события ПриИзменении. Оно гарантированно сработает во всех случаях: и при ручном вводе (после того, как текст распознается), и при выборе из формы списка, и при выборе из истории.

Пример стандартной обработки:


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

Вариант 2. Кастомизация поиска по строке

Если вам действительно необходимо перехватить ввод пользователя, чтобы реализовать свой собственный, нестандартный поиск (например, искать номенклатуру не по началу наименования, а по вхождению артикула, штрихкода или полнотекстовым поиском), вам нужно использовать связку событий АвтоПодборТекста и ОкончаниеВводаТекста.

Чтобы событие ОкончаниеВводаТекста вызывалось всегда, когда пользователь пишет текст, необходимо явно управлять параметром СтандартнаяОбработка.

Проанализируем пример реализации такого поиска:


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

Важный нюанс: Обратите внимание, что при установке СтандартнаяОбработка = Ложь платформа полностью передает управление вашему коду. Если вы не присвоите корректную ссылку в параметр Значение, поле останется пустым или сохранит предыдущее значение.

---

Дополнительные рекомендации по настройке полей ввода

Если обработчик все равно упорно отказывается вызываться, выполните следующие шаги для проверки конфигурации:

← На главную