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