При обновлении платформы «1С:Предприятие» с более старых версий (например, 8.3.10) на современные релизы (8.3.13, 8.3.16 и выше) многие компании сталкиваются с неожиданной проблемой. Операторы по вводу данных, привыкшие работать на высокой скорости «вслепую», начинают жаловаться на то, что программа «пропускает» нажатие клавиши Enter. В результате вместо быстрого заполнения нескольких полей подряд (например, ввели код «1», нажали Enter, ввели код «1» в следующем поле, нажали Enter), символы «слипаются» в одном поле, превращаясь в «11», а фокус ввода не переходит на следующий элемент формы.
В этой статье мы подробно разберем, почему возникает этот неприятный эффект, проанализируем технические изменения в архитектуре управляемых форм платформы и рассмотрим несколько практических способов решения проблемы, включая готовые примеры программного кода.
Для того чтобы решить проблему, нам необходимо понять физику процесса. Начиная с версии платформы 8.3.11, разработчики фирмы «1С» существенно переработали юзабилити управляемых форм и механизмы взаимодействия клиента с сервером. Изменения коснулись функций автоподбора и получения данных выбора:
Рассмотрим подробнее несколько эффективных способов решения этой проблемы: от простой настройки свойств конфигурации до написания кастомных обработчиков ввода.
Это наиболее красивый и технически правильный способ обойти асинхронную задержку платформы. Если операторы вводят коды, которые однозначно идентифицируют элементы справочника (например, коды номенклатуры, коды услуг или ID диагнозов), им не требуется выпадающий список автоподбора. Нам нужно полностью отключить стандартный поиск платформы и перехватить ввод текста.
Выполним следующие шаги для реализации этого метода:
Ложь. Это предотвратит отправку асинхронных фоновых запросов во время набора текста.ОкончаниеВводаТекста для этого поля ввода.Проанализируем пример кода, который необходимо разместить в модуле формы для быстрой обработки ввода:
&НаКлиенте
Процедура ТоварыКодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный асинхронный поиск платформы
СтандартнаяОбработка = Ложь;
Если ПустаяСтрока(Текст) Тогда
Возврат;
КонецЕсли;
// Выполняем точный и быстрый поиск на сервере по коду
НайденноеЗначение = НайтиЭлементПоКодуНаСервере(Текст);
Если ЗначениеЗаполнено(НайденноеЗначение) Тогда
// Записываем результат непосредственно в реквизит строки
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ТекущиеДанные.Номенклатура = НайденноеЗначение;
КонецЕсли;
Иначе
ПоказатьПредупреждение(, "Элемент с кодом """ + Текст + """ не найден!");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция НайтиЭлементПоКодуНаСервере(Знач ВведенныйКод)
// Используем максимально быстрый индексный поиск по коду
Возврат Справочники.Номенклатура.НайтиПоКоду(ВведенныйКод);
КонецФункции
При таком подходе платформа не тратит время на формирование динамического списка выбора и не блокирует фокус. Нажатие клавиши Enter мгновенно вызывает серверную функцию точного поиска, подставляет значение и корректно переводит фокус на следующее поле формы.
Этот оригинальный метод часто применяется в высоконагруженных системах для операторов ввода. Его суть заключается в том, что реквизиты на форме временно переводятся в тип Строка, благодаря чему платформа вообще не пытается осуществлять автоматический поиск в базе данных при вводе символов. Поиск запускается только в момент завершения редактирования строки.
Рассмотрим по шагам программную реализацию этого алгоритма:
Строка.ПриИзменении введенная строка перехватывается, отправляется на сервер для поиска ссылки, и строковое значение заменяется найденным элементом справочника.Посмотрим на пример практической реализации в коде формы:
&НаКлиенте
Процедура ТалоныПриемаПриАктивизацииЯчейки(Элемент)
ТекущиеДанные = Элементы.ТалоныПриема.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// В момент ввода принудительно устанавливаем тип "Строка" для быстродействия
Если Элемент.ТекущийЭлемент = Элементы.ТалоныПриемаПовод Тогда
Элементы.ТалоныПриемаПовод.ОграничениеТипа = Новый ОписаниеТипов("Строка");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТалоныПриемаПоводПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТалоныПриема.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Если оператор ввел строку, производим постобработку поиска на сервере
Если ТипЗнч(ТекущиеДанные.Повод) = Тип("Строка") Тогда
ТекущиеДанные.Повод = ПолучитьПоводПоКоду(ТекущиеДанные.Повод);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПоводПоКоду(Знач КодПовода)
// Формируем параметры для получения данных выбора
ПараметрыОтбора = Новый Структура("Отбор,СтрокаПоиска,ВыборГруппИЭлементов");
ПараметрыОтбора.Отбор = Новый Структура;
ПараметрыОтбора.СтрокаПоиска = КодПовода;
ПараметрыОтбора.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
СписокВыбора = Справочники.НСИ_ПоводыПосещения.ПолучитьДанныеВыбора(ПараметрыОтбора);
Если СписокВыбора.Количество() > 0 Тогда
// Возвращаем первую точную ссылку
Возврат СписокВыбора[0].Значение;
Иначе
// Если ничего не найдено, оставляем введенную строку для визуализации ошибки
Возврат КодПовода;
КонецЕсли;
КонецФункции
Используя этот прием, мы полностью избавляемся от привязки к таймаутам ожидания платформы. Ввод текста происходит мгновенно, а поиск выполняется уже «постфактум» при фиксации изменений в поле.
Если вы не хотите вносить изменения в программный код форм, можно попробовать ускорить стандартный механизм получения данных выбора за счет оптимизации настроек самого справочника в конфигураторе. Зачастую низкая скорость работы автоподбора вызвана избыточными полями поиска.
Выполните следующие оптимизационные действия:
Код). Если там одновременно включены Наименование, Артикул, ПолнотекстовыйПоиск и другие реквизиты, СУБД выполняет сложный и долгий SQL-запрос при вводе каждой цифры. Оставьте для скоростного ввода только индексируемые поля.В управляемых формах на новых версиях платформы появилось специализированное свойство, регулирующее реакцию интерфейса на нажатие клавиши ввода. Настроить его можно следующим образом:
Если программные методы оптимизации не принесли желаемого результата, проблема может лежать в плоскости администрирования базы данных или сетевой инфраструктуры. Выполните проверку следующих системных компонентов:
/ForceRurender, чтобы переключить режим рендеринга интерфейса, или протестируйте скорость работы операторов в веб-клиенте через современный браузер.Проблема с «пропаданием» нажатия клавиши Enter на новых платформах 1С — это прямое следствие внедрения асинхронной архитектуры клиент-серверного взаимодействия. Чтобы вернуть операторам привычную скорость работы и уберечь их от увольнения, мы рекомендуем использовать комплексный подход:
ОкончаниеВводаТекста.