- История выбора при вводе — Как отфильтровать?
- Работа с полем выбора
- Установка значения в поле выбора
- Представление значения, хранящегося в поле выбора
- Поиск значения в поле выбора по введенному тексту
- Связь поля выбора с данными
- Особенности инициализации и использования списка выбора
- Использование поля выбора: пример 1
- Использование поля выбора: пример 2
- Использование поля выбора: пример 3
- Значение реквизита — пустая ссылка:
- Значение реквизита — одно из значений, имеющихся в списке выбора для поля выбора:
- Значение реквизита в списке выбора для поля выбора отсутствует:
- Особенности работы ввода по строке в поле ввода
- 1. Как переопределять работу поля ввода в части ввода по строке
- 1.1. Событие АвтоПодборТекста
- 1.2. Событие ОкончаниеВводаТекста
- 2. Использование результатов поиска по строке
- 2.1. Работа стандартного (системного) обработчика события АвтоПодборТекста с результатами поиска по строке
- 2.2. Устройство механизма преобразования текста в поле ввода в значение и обработчик события ОкончаниеВводаТекста
- 2.3. Работа стандартного (системного) обработчика события ОкончаниеВводаТекста с результатами поиска по строке
- 3. Настройка состава и порядка полей, используемых в стандартных (системных) обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
- 4. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
- 5. Управление механизмом автопоиска и автоподбора с помощью прав
- 6. Работа механизма автопоиска и автоподбора с правами на уровне записей
История выбора при вводе — Как отфильтровать?
Итак, есть форма создания документа, на ней поле выбора из справочника. В этом справочнике часть значений принадлежит к «основной группе» а часть — нет (определяется по реквизиту типа булево). Так вот, в зависимости от одного из реквизитов формы нужно, чтобы в форме выбора и самое главное — в истории при быстром выборе (маленькое выпадающее окошко, где написано нажать F4 для просмотра всего списка) был отбор, и отображалась либо одна группа значений справочника, любо другая.
Форму выбора справочника я смог отфильтровать так:
П = Новый Структура;
Отбор = Новый Структура;
Отбор.Вставить(«ПренадлежитКОсновнойГруппе», Ложь);
П.Вставить(«Отбор», Отбор);
ОткрытьФорму(«Справочник.ПредприятияКлиенты.ФормаВыбора», П);
Однако, в истории (окошко быстрого выбора) все равно либо лезет все подряд, либо она отключается полностью.
Существует ли какой-нибудь способ отфильтровать список истории выбранных значений и при этом не лезть на сервер большим запросом, и если да, то как?
В интернетах сто раз обсуждалось. Главный вопрос был от программистов разработчикам, ну вот как можно было сделать такую ерунду ненастраиваемой. На что был ответ, мол, так это ж такая крутая фича, ну кому в голову придет отключать её.
Начиная то ли с 8.3.6 у поля элемента добавили флажок, мол, неиспользовать историю. Но он все равно работает в 50% случаев)
Короче, отфильтровать нельзя, можно только отключить. Отключаться должно так:
ПолеИнициаторПроцесса.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
Но не всегда работает, разбираться нет времени, тем более на упр. формах платформа писана на костылях.
Поэтому можно использовать целый зоопарк настроек:
Источник
Работа с полем выбора
Элемент управления «Поле выбора» предназначен для хранения и быстрого выбора одного из значений, входящих в его список выбора. Список выбора для поля выбора есть список значений. Значением поля выбора является одно единственное значение, а не весь список выбора.
Установка значения в поле выбора
В Поле выбора можно установить любое значение. В процессе установки значения будет выполнен его поиск среди значений, входящих в список выбора. Если устанавливаемое значение найдено в списке выбора, оно будет сохранено в поле выбора, иначе в поле выбора будет установлено значение «Неопределено». Исключение составляет значение «Неопределено», которое можно установить в поле выбора в любом случае, независимо от того, какие значения при этом хранятся в списке выбора.
Например, если список выбора имеет значениями числа 1, 2 и 3, тогда в поле выбора удастся установить любое из этих значений. При установке других значений, хотя ошибки времени выполнения и не произойдет, они сохранены не будут.
Представление значения, хранящегося в поле выбора
В качестве представления значения, хранящегося в поле выбора, используется представление элемента списка выбора, значение которого эквивалентного значению поля выбора. Если у элемента списка выбора представление не указано, оно формируется в виде текстового представления самого значения. В ситуациях, когда в списке выбора есть несколько одинаковых значений с разными представлениями, будет использоваться первое найденное из этих значений. Представление значения при этом будет сформировано на его основе, как описывалось выше.
Поиск значения в поле выбора по введенному тексту
Поиск значений по тексту осуществляется на основе представлений для элементов списка выбора. Для тех из элементов, в которых представление значения не указано, используется представление самого значения, хранящегося в нем.
Связь поля выбора с данными
Поле выбора можно связывать по данным с выбираемым значением, а не со списком значений. Например, если мы хотим, чтобы в поле выбора можно было выбирать число, и оно было связано по данным со значением некоторого реквизита, типом данных для реквизита должно быть число, а не список значений.
Особенности инициализации и использования списка выбора
Для правильного отображения в поле выбора данных, с которыми он связан, список выбора должен формироваться в теле модуля формы. Формировать список выбора для поля выбора в обработчике любого из событий формы – поздно. Это приведет к тому, что в поле выбора будет установлено значение «Неопределено», хотя в реквизите при этом может быть любое значение.
Такая ситуация возникает из-за того, что данные устанавливаются в элементы управления формы, связанные с ними, в процессе создания формы. А обработчики событий ПередОткрытием(), ПриОткрытии() вызываются после создания самой формы, в процессе инициализации ее визуальной части. Получается, что при создании формы полю выбора поставили некоторое значение в момент, когда его список выбора пустой. При этом, поскольку список выбора пустой, вместо устанавливаемого значения в поле выбора будет сохранено значение «Неопределено».
При смене типа значения (свойство «ТипЗначения») для списка выбора, у которого есть элементы, будет выполнено преобразование их значений к новому типу. Может быть следующая ситуация: после смены типа значения для списка выбора некоторое значение, которое раньше удавалось успешно установить в поле выбора, после смены типа значения установить не получается. Причина такой ситуации в том, что в процессе установки типа значения для списка выбора, успешно устанавливаемое ранее значение было конвертировано в другое значение (в соответствии с новым типом значения). Соответственно, устанавливаемое значение в списке выбора больше найдено не будет.
Использование поля выбора: пример 1
Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: число, длина = 10, точность = 0). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:
Открыв такую форму в режиме 1С:Предприятие, можно видеть, как будут устанавливаться значения в поле выбора:
1. В начальном состоянии поле выбора — пустое, поле ввода содержит значение 0.
2. Выбираем в поле выбора в выпадающем списке строку с надписью «Один»: в поле ввода помещается значение 1. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку «Один», значение для которой равно 1. Оно и отобразилось в поле ввода.
3. Выбираем в поле выбора в выпадающем списке строку с надписью «Два»: в поле ввода помещается значение 2.
Перейдем в поле ввода и попробуем редактировать значения в нем:
1. Введем в поле ввода значение 3 и сойдем с поля ввода. В поле выбора запишется значение 3 и установится значение из соответствующей строки списка выбора поля выбора («Три»).
2. Вернемся в поле ввода и введем в нем значение 4. Перейдем с поля ввода к следующему элементу управления. В поле ввода будет сохранено введенное значение «4», а поле выбора станет пустым. В данном случае введенное в поле ввода значение 4 будет сохранено в связанных с полем ввода данных, после чего выставлено из них в поле выбора. Поскольку поле выбора в списке выбора значения 4 не имеет, оно установлено в поле выбора не будет.
Использование поля выбора: пример 2
Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: СправочникСсылка.Номенклатура). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:
Открыв такую форму в режиме 1С:Предприятие, можно видеть, как будут устанавливаться значения в поле выбора:
1. В начальном состоянии поле выбора и поле ввода — пустые:
2. Выбираем в поле выбора в выпадающем списке строку с надписью «Один»: в поле ввода помещается значение. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку «Один», значение для которой равно ссылке на на элемент справочника Справочники.Номенклатура.Элемент1. Оно и отобразилось в поле ввода.
3. Выбираем в поле выбора в выпадающем списке строку с надписью «Два»: в поле ввода помещается ссылка на элемент справочника Справочники.Номенклатура.Элемент2:
Перейдем в поле ввода и попробуем редактировать значения в нем:
1. Выберем в поле ввода значение Справочники.Номенклатура.Элемент1. В поле выбора запишется значение Справочники.Номенклатура.Элемент1 и установится значение из соответствующей строки списка выбора поля выбора («Один»).
2. Выберем в поле ввода значение Справочники.Номенклатура.Элемент2. В поле выбора запишется значение Справочники.Номенклатура.Элемент2 и установится значение из соответствующей строки списка выбора поля выбора («Два»).
3. Выберем в поле ввода значение Справочники.Номенклатура.Элемент3. В поле выбора значение Справочники.Номенклатура.Элемент3 записано не будет, поскольку оно не было добавлено в список выбора. Значением в поле ввода будет «Неопределено»:
Использование поля выбора: пример 3
Пусть есть внешняя обработка, в которой создан реквизит Реквизит1 типа СправочникСсылка.Номенклатура. Во внешней обработке есть две формы: в первой устанавливается значение реквизита и по нажатию на кнопку открывается вторая форма.
В левой колонке — внешний вид первой формы внешней обработки. По нажатию на кнопку «Открыть форму» из поля ввода берется значение и сохраняется в реквизите внешней обработки, после чего открывается вторая форма:
В правой колонке — внешний вид второй формы внешней обработки. В ней размещены поле выбора и поле ввода; они оба связаны с реквизитом внешней обработки Реквизит1 по данным. Приведем текст модуля формы:
Мы видим,. что в модуле формы инициализируется список выбора для поля выбора: поле выбора может принимать значения Справочники.Номенклатура.Элемент1, Справочники.Номенклатура.Элемент2, Неопределено. При этом для двух первых значений явно указаны их представления — «Один» и «Два».
Посмотрим, как будет выглядеть вторая форма в зависимости от того, какое значение сохранено предварительно в реквизите внешней обработки Реквизит1.
Значение реквизита — пустая ссылка:
В данном случае в поле ввода значением будет пустая ссылка на элемент справочника, а в поле выбора — Неопределено . Поскольку в списке выбора для поля выбора пустая ссылка на элемент справочника в значения не входит, ее установить нельзя — при установке значения в виде пустой ссылки поле выбора примет значение Неопределено .
Значение реквизита — одно из значений, имеющихся в списке выбора для поля выбора:
В данном случае и в поле ввода, и в поле выбора значением будет ссылка на Элемент1 справочника. При этом для представления значения поле выбора воспользуется представлением установленного значения из списка выбора — строкой «Один».
Значение реквизита в списке выбора для поля выбора отсутствует:
В данном случае в открываемой форме в поле выбора и поле ввода будет произведена попытка установить в качестве значения ссылку на Элемент3 справочника. В поле ввода такое значение будет нормально установлено, а вот в поле выбора после его установки сохранится значение Неопределено , поскольку ссылка на Элемент3 справочника в значения из списка выбора не входит.
Заметим, что в данном примере в случае переноса инициализации списка выбора для поля выбора в любой из обработчиков событий открываемой формы в каждом из рассмотренных случаев поле выбора будет принимать значение Неопределено , поскольку на момент установки значения в него список выбора будет еще пустой.
Источник
Особенности работы ввода по строке в поле ввода
1. Как переопределять работу поля ввода в части ввода по строке
Для переопределения работы поля ввода в части ввода по строке можно обрабатывать события поля ввода «АвтоПодборТекста» и «ОкончаниеВводаТекста».
1.1. Событие АвтоПодборТекста
Событие «АвтоПодборТекста» возникает во время начала ожидания ввода текста (когда в процессе набора текста сделана пауза). При стандартной отработке события происходит поиск по полям, указанным в свойстве «Ввод по строке» соответствующего объекта метаданных. Если найдено единственное значение, то производится автоподстановка окончания текста. Если введенному тексту соответствует несколько значений, то автоподстановки не происходит.
В этом примере при вводе в поле ввода буквы «п» и прерывании редактирования в поле ввода появился слово «пункт», при этом выделена будет его часть «ункт» (начало слова было уже введено и выделение на него не делается):
Выделение выставляется для того, чтобы подставленную часть текста можно было легко заменить следующим действием редактирования, если подставленный текст не подходит. Для отключения стандартного обработчика в значение параметра «СтандартнаяОбработка» записали «Ложь».
1.2. Событие ОкончаниеВводаТекста
Событие «ОкончаниеВводаТекста» вызывается системой в тех случаях, когда по введенному (отредактированному) в поле ввода тексту нужно сформировать значение, соответствующее этому тексту. При этом, если по имеющемуся в поле ввода тексту уже было ранее успешно сформировано значение, нового формирования значения по этому тексту выполняться не будет (т.е. не будет возникать событие «ОкончаниеВводаТекста»).
Необходимость формирования значения по тексту в поле ввода возникает в различных ситуациях, например при переходе из поля ввода к другому элементу управления, нажатии в поле ввода кнопки выбора
Стандартный (системный) обработчик события ищет некоторое значение, которое соответствует набранному тексту. Если найдено одно значение – оно сохраняется в качестве значения поля ввода. Если найдено несколько значений – в выпадающем списке предоставляется возможность выбрать из них нужное значение. Если не найдено ни одного значения – выдается сообщение о том, что в элементе управления введены некорректные данные.
В этом примере обеспечивается следующая функциональность для поля ввода: если в поле ввода набрать слово «одежда», то при формировании значения по имеющемуся в поле ввода тексту (например, при переходе из поля ввода к другому элементу управления в форме), пользователю будет предоставлена возможность выбрать одно из двух значений: «Рубашка» или «Брюки»:
— введем в поле ввода слово «одежда»:
— нажмем на клавишу 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. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Механизм автоподбора текста в поле ввода и преобразования текста в значение не предусматривает возможности использования разработчиком конфигурации интерактивных действий в обработчиках событий. Кроме того, логика работы стандартных (системных) обработчиков событий достаточно сложная и в обработчиках этих событий не всегда можно узнать, по какому поводу он (обработчик) вызван. Например, обработчик события » ОкончаниеВводаТекста» будет вызываться не только при переходе из поля ввода на другой элемент управления формы, но и при нажатии в поле ввода кнопки выбора
Рекомендуется в обработчиках событий » АвтоПодборТекста» и » ОкончаниеВводаТекста» работать исключительно с параметрами обработчиков, формируя нужный текст и значения и отдавая их через параметры обработчиков.
5. Управление механизмом автопоиска и автоподбора с помощью прав
Управлять механизмом автопоиска и автоподбора можно на уровне прав пользователей. Для этого в списке прав для различных объектов метаданных существует право «Ввод по строке».
Если у пользователя нет права на ввод по строке для соответствующего объекта метаданных , в поле ввода запрещается редактирование текста и работа механизма автопоиска и автоподбора блокируется.
6. Работа механизма автопоиска и автоподбора с правами на уровне записей
Данные, используемые системой в обработчиках событий автопоиска и автоподбора, могут иметь ограничения на доступ к ним. Достичь этого можно с помощью механизма ограничения прав доступа к данным на уровне записей. В этой ситуации сама платформа 1С:Предприятие 8 выбирает только разрешенные записи и дополнительной поддержки на уровне обработчиков событий для этого не требуется.
Если же есть необходимость поиска подходящих данных в обработчиках событий автопоиска и автоподбора, в запросе нужно использовать служебное слово «РАЗРЕШЕННЫЕ», указывающее, что при встрече данных, доступ к которым ограничен, нужно их просто пропускать: в противном случае будет выдана ошибка времени исполнения.
Источник