Особенности работы ввода по строке в поле ввода
1. Как переопределять работу поля ввода в части ввода по строке
Для переопределения работы поля ввода в части ввода по строке можно обрабатывать события поля ввода "АвтоПодборТекста" и "ОкончаниеВводаТекста".
1.1. Событие АвтоПодборТекстаСобытие "АвтоПодборТекста" возникает во время начала ожидания ввода текста (когда в процессе набора текста сделана пауза). При стандартной отработке события происходит поиск по полям, указанным в свойстве "Ввод по строке" соответствующего объекта метаданных. Если найдено единственное значение, то производится автоподстановка окончания текста. Если введенному тексту соответствует несколько значений, то автоподстановки не происходит.
В этом примере при вводе в поле ввода буквы "п" и прерывании редактирования в поле ввода появился слово "пункт", при этом выделена будет его часть "ункт" (начало слова было уже введено и выделение на него не делается):
Выделение выставляется для того, чтобы подставленную часть текста можно было легко заменить следующим действием редактирования, если подставленный текст не подходит. Для отключения стандартного обработчика в значение параметра "СтандартнаяОбработка" записали "Ложь".
1.2. Событие ОкончаниеВводаТекстаСобытие "ОкончаниеВводаТекста" вызывается системой в тех случаях, когда по введенному (отредактированному) в поле ввода тексту нужно сформировать значение, соответствующее этому тексту. При этом, если по имеющемуся в поле ввода тексту уже было ранее успешно сформировано значение, нового формирования значения по этому тексту выполняться не будет (т.е. не будет возникать событие "ОкончаниеВводаТекста").
Необходимость формирования значения по тексту в поле ввода возникает в различных ситуациях, например при переходе из поля ввода к другому элементу управления, нажатии в поле ввода кнопки выбора (клавиша F4) и в ряде других ситуаций.
Стандартный (системный) обработчик события ищет некоторое значение, которое соответствует набранному тексту. Если найдено одно значение – оно сохраняется в качестве значения поля ввода. Если найдено несколько значений – в выпадающем списке предоставляется возможность выбрать из них нужное значение. Если не найдено ни одного значения – выдается сообщение о том, что в элементе управления введены некорректные данные.
В этом примере обеспечивается следующая функциональность для поля ввода: если в поле ввода набрать слово "одежда", то при формировании значения по имеющемуся в поле ввода тексту (например, при переходе из поля ввода к другому элементу управления в форме), пользователю будет предоставлена возможность выбрать одно из двух значений: "Рубашка" или "Брюки":
- введем в поле ввода слово "одежда":
- нажмем на клавишу Tab для перехода к следующему элементу управления: при этом появится выпадающий список из двух значений:
- выберем в выпадающем списке первое значение с помощью клавиши "Enter". выбранное значение будет установлено в поле ввода, а мы перейдем к следующему элементу управления:
2. Использование результатов поиска по строке
При поиске значения по тексту могут быть следующие результаты поиска:· не найдено ни одного значения;· найдено одно значение;· найдено больше одного, но не более некоторого количества значений (в системе используется константа - 50 значений);· найдено некоторое количество значений или больше (т.е. > 50).
В каждом из этих случаев стандартные (системные) обработчики событий "АвтоПодборТекста" и "ОкончаниеВводаТекста" ведут себя определенным образом.
2.1. Работа стандартного (системного) обработчика события АвтоПодборТекста с результатами поиска по строке1. По имеющемуся в поле ввода тексту ищется одно подходящее значение
2. Значение найдено?
2.1. Получается текстовое представление найденного значения
2.2. В поле ввода дописываются недостающие завершающие символы текстового представления найденного значения.
Пример : пусть поле ввода имеет тип "СправочникСсылка.Номенклатура"; в свойстве "Ввод по строке" указаны поля "Код", "Наименование"; в справочнике есть два элемента с наименованиями "Рубашка", "Брюки":
Если мы введем воле ввода текст "Ру", он будет дополнен текстом "башка":
2.2. Устройство механизма преобразования текста в поле ввода в значение и обработчик события ОкончаниеВводаТекстаРассмотрим процесс формирования значения по тексту, введенному в поле ввода. Ниже приводится алгоритм преобразования текста в поле ввода в значение:
- Начало процесса формирования значения по тексту поля ввода.
- Получение текста из поля ввода.
- Вызов обработчика события "ОкончаниеВводаТекста".В параметры вызываемой процедуры записывается: Текст - текст из поля ввода; Значение - Неопределено. В обработчике события в него можно записать значение или список значений; СтандартнаяОбработка = Истина.
- В обработчике события разрешили выполнение стандартной обработки?
- Через параметр "Значение" вернули список значений?
- Кнопка выбора (клавиша F4) нажата ?
- В переданном списке количество значений больше одного?
- Открытие выпадающего списка в поле ввода и выбор значения из списка. Если в выпадающем списке выбрано значение, оно выставляется в качестве значения в поле ввода, а в качестве текста в поле ввода устанавливается текстовое представление выбранного значения. Если же значение в выпадающем списке не выбрано, состояние поля ввода не меняется.
- В переданном списке храниться только одно значение?
- В качестве значения в поле ввода устанавливается единственное значение из переданного списка. В качестве текста в поле вода устанавливается текстовое представление устанавливаемого значения.
- В параметре "Значение" вернули не список значений, а конкретное значение?
- Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
- В качестве значения в поле ввода устанавливается значение параметра "Значение", а в качестве текста - представление устанавливаемого значения.
- Вызов стандартного (системного) обработчика события "ОкончаниеВводаТекста".
- Конец процесса формирования значения по тексту поля ввода.
Из описанного алгоритма видно, что смысл подмены стандартного (системного) обработчика может состоять в том, чтобы сформировать свой список значений из одного и более элементов или одно конкретное значение для поля ввода в зависимости от того текста, который есть в поле ввода.
2.3. Работа стандартного (системного) обработчика события ОкончаниеВводаТекста с результатами поиска по строкеСтандартный (системный) обработчик события "ОкончаниеВводаТекста" работает следующим образом:
- Начало работы стандартного обработчика.
- Получение текста из поля ввода.
- Текст в поле ввода не пустой?
- Формирование списка значений на основе текста из поля ввода. Например - поиск товаров, у которых наименование товара начинается с имеющегося в поле ввода текста.
- В сформированном в пункте 4 списке значений есть элементы?
- Кнопка выбора (клавиша F4) нажата? Это условие проверяется, потому что если она нажата, то будет открываться форма выбора и выпадающих списков появляться не должно.
- В сформированном в пункте 4 списке значений есть только одно значение?
- Устанавливаем единственное значение из списка в поле ввода. В качестве текста в поле ввода устанавливается представление этого значения.
- В сформированном в пункте 4 списке значений более 50 элементов?
- Открывается выпадающий список у поля ввода. В качестве списка значений для него используется список, сформированный в пункте 4. Пользователь может выбрать в этом списке одно из значений.
- Вывод пользователю сообщения о том, что найдено слишком много значений.
- Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
- Конец работы стандартного обработчика.
3. Настройка состава и порядка полей, используемых в стандартных (системных) обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Для определения состава полей, используемых стандартными (системными) обработчиками событий " АвтоПодборТекста" и "ОкончаниеВводаТекста" , и их порядка, ряд объектов метаданных поддерживают свойство "Ввод по строке", доступное для редактирования через палитру свойств и в форме редактирования объекта метаданных. К таким объектам метаданных относятся "Справочники", "Документы", "Планы видов характеристик", "Планы счетов", "Планы видов расчета", "Планы обмена", "Бизнес-процессы", "Задачи".
Состав полей объекта метаданных, которые могут участвовать в поиске, состоит из некоторых фиксированных полей и реквизитов, для которых указано, что они строкового или числового типа и их нужно индексировать или индексировать с дополнительным упорядочиванием.
При поиске по строке для числовых полей из строки формируется число, которое затем ищется в базе данных. При поиске по строке для строковых полей ищутся все записи из базы данных, у которых в соответствующем поле хранится текст, начинающийся с искомого.
В качестве значения по умолчанию для свойства "Ввод по строке" в 1С:Предприятии 8 используются следующие поля:
План счетов Наименование, Код План обмена Наименование, Код План видов характеристик Наименование, Код Документ Номер документа Справочник Наименование, Код Бизнес-процесс Номер Задача Номер, Наименование План видов расчета Наименование, Код
Отметим, что поле используется для поиска по строке только в том случае, если длина поля больше нуля. Так, например, если длина наименования в некотором справочнике равна нулю, то поиск по полю "Наименование" выполняться не будет.
Пример . Есть справочник товаров , описываемых кодом (число), наименованием (строка) и артикулом (строка).
Если принято использование артикулов товаров, можно указать в свойстве "Ввод по строке" поля "Артикул", "Наименование", "Код". При этом в выпадающем списке сначала будут идти товары, у которых в поле "Артикул" хранится хранится текст, начинающийся с введенного текста, затем - товары, у которых в поле "Наименование" хранится текст, начинающийся с введенного текста, затем - товары, у которых в поле "Код" хранится введенное значение (текст из поля ввода интерпретируется как число).
Если использование артикулов товаров не принято, можно указать в свойстве "Ввод по строке" поля " Наименование", " Код". При этом в выпадающем списке сначала будут идти товары, у которых в поле " Наименование" хранится текст, начинающийся с введенного текста, затем - товары, у которых в поле " Код" хранится введенное значение (текст из поля ввода интерпретируется как число).
4. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Механизм автоподбора текста в поле ввода и преобразования текста в значение не предусматривает возможности использования разработчиком конфигурации интерактивных действий в обработчиках событий. Кроме того, логика работы стандартных (системных) обработчиков событий достаточно сложная и в обработчиках этих событий не всегда можно узнать, по какому поводу он (обработчик) вызван. Например, обработчик события " ОкончаниеВводаТекста" будет вызываться не только при переходе из поля ввода на другой элемент управления формы, но и при нажатии в поле ввода кнопки выбора (клавиша F4).
Рекомендуется в обработчиках событий " АвтоПодборТекста" и " ОкончаниеВводаТекста" работать исключительно с параметрами обработчиков, формируя нужный текст и значения и отдавая их через параметры обработчиков.
5. Управление механизмом автопоиска и автоподбора с помощью прав
Управлять механизмом автопоиска и автоподбора можно на уровне прав пользователей. Для этого в списке прав для различных объектов метаданных существует право "Ввод по строке".
Если у пользователя нет права на ввод по строке для соответствующего объекта метаданных , в поле ввода запрещается редактирование текста и работа механизма автопоиска и автоподбора блокируется.
6. Работа механизма автопоиска и автоподбора с правами на уровне записей
Данные, используемые системой в обработчиках событий автопоиска и автоподбора, могут иметь ограничения на доступ к ним. Достичь этого можно с помощью механизма ограничения прав доступа к данным на уровне записей. В этой ситуации сама платформа 1С:Предприятие 8 выбирает только разрешенные записи и дополнительной поддержки на уровне обработчиков событий для этого не требуется.
Если же есть необходимость поиска подходящих данных в обработчиках событий автопоиска и автоподбора, в запросе нужно использовать служебное слово "РАЗРЕШЕННЫЕ", указывающее, что при встрече данных, доступ к которым ограничен, нужно их просто пропускать: в противном случае будет выдана ошибка времени исполнения.