1с как ограничить ввод по строке

Обновлено: 30.06.2024

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

среда, 15 января 2014 г.

Переопределение процедуры ввода по строке в управляемом приложении

Для того, чтобы определить свой набор данных, которые формируются при вводе по строке нужно использовать событие АвтоПодбор() элемента формы.
Справка из синтаксис-помощника:
АвтоПодбор(<Текст>, <ДанныеВыбора>, <Ожидание>, <СтандартнаяОбработка>)
  • Значение (Value) - собственно значение;
  • ПометкаУдаления (DeletionMark) - пометка удаления;
  • Предупреждение (Warning) - текст предупреждения, который будет выбран при выборе элемента и списка значений.
Тип: Число.
Интервал в секундах после ввода текста, через который произошло событие. Если 0, то это означает, что событие было вызвано не по поводу ввода текста, а для формирования списка быстрого выбора.
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Параметр позволяет отменить стандартное заполнение системой ДанныеВыбора. При этом все действия (отображение списка, предупреждения) выполняются системой на основе возвращенного значения параметра <ДанныеВыбора> независимо от значения параметра <СтандартнаяОбработка>.
Значение по умолчанию: Истина
Возникает во время начала ожидания ввода текста (в процессе набора текста сделана пауза). Также возникает при нажатии клавиши "Стрелка вниз" после ввода текста (или части текста).
При стандартной отработке события происходит поиск в порядке полей, определенном при конфигурировании в свойстве объекта метаданных "Ввод по строке".
Если найдено найдено одно или более значений, то будет показан список с найденными значениями. Если значений найдено больше 50, то список показан не будет.

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции НаСервере.

Переопределять мы будем список значений ДанныеВыбора, который заменим на свой - сформированный запросом:

&НаКлиенте
Процедура РайонАвтоПодбор ( Элемент , Текст , ДанныеВыбора , Ожидание , СтандартнаяОбработка )

Если ЗначениеЗаполнено ( Текст ) И НЕ ТипЗнч ( Район ) = Тип ( "Строка" ) Тогда
СтандартнаяОбработка = Ложь;

ДанныеВыбора = ПолучитьДанныеВыбораГородов ( Текст , Истина, ПредопределенноеЗначение ( "Справочник.Города.ПустаяСсылка" ));

Функция ПолучитьДанныеВыбораГородов ( Текст , ЭтоРайон , Родитель )

ДанныеВыбора = Новый СписокЗначений ;
Построитель = Новый ПостроительЗапроса ;
Построитель . Текст = "ВЫБРАТЬ
| Города.Ссылка,
| Города.Наименование
|ИЗ
| Справочник.Города КАК Города
|ГДЕ
| Города.Наименование ПОДОБНО &Наименование + ""%""
| И НЕ Города.ПометкаУдаления
| | Города.Родитель.*,
| Города.Область.*,
| Города.ВидНаселенногоПункта.*>" ;
Построитель . Параметры . Вставить ( "Наименование" , Текст );
Если ЗначениеЗаполнено ( Родитель ) И НЕ ТипЗнч ( Родитель ) = Тип ( "Строка" ) Тогда
Отбор = Построитель . Отбор . Добавить ( "Родитель" );
Отбор . Использование = Истина;
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Родитель ;
КонецЕсли;

Если ЗначениеЗаполнено ( Область ) И НЕ ТипЗнч ( Область ) = Тип ( "Строка" )Тогда
Отбор = Построитель . Отбор . Добавить ( "Область" );
Отбор . Использование = Истина;
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Область ;
КонецЕсли;

Отбор = Построитель . Отбор . Добавить ( "ВидНаселенногоПункта" );
Отбор . Использование = Истина;

Если ЭтоРайон Тогда
Отбор . ВидСравнения = ВидСравнения . Равно ;
Отбор . Значение = Справочники . ВидыНаселенныхПунктов . Район ;
Иначе
Отбор . ВидСравнения = ВидСравнения . НеРавно ;
Отбор . Значение = Справочники . ВидыНаселенныхПунктов . Район ;
КонецЕсли;

Построитель . Выполнить ();
Таблица = Построитель . Результат . Выгрузить ();

Для Каждого Строка Из Таблица Цикл
ДанныеВыбора . Добавить ( Строка . Ссылка , Строка . Наименование );
КонецЦикла;

Для 1с поле ввода с типом строка можно применить маску ввода. В 1с маска задает формат представления данных и ограничивает вводимой информации. Это очень удобно бывает во многих жизненных задачках, например ввод телефона, ввод специального кода или представления номера. В 1с маску можно задать как интерактивно «в режиме конфигуратора», так и программно.

Ввод цифр и букв:
* @ – ввод символов алфавита, и при этом они будут преобразованы в верхний регистр
* N – разрешен ввод алфавитных символов но уже можно контролировать регистр.
* U – вводи символов алфавита с преобразованием в верхней регистр. Отличие между U и @ не смог найти.
* ! – любой введенный символ автоматический преобразуется к верхнему регистру
* X – разрешен ввод только латиницы

Для запрет ввода символа «^» в 1с поле ввода, необходимо прописать этот символ в маску

В маске могут присутствовать специальные символы «.» , «(», «)», «-» и «,» и некоторые другие, они позволяют форматировать строку.

Например, нам нужно указать, что номер вводится с указанием кода города. То нужно прописать 1с маску ввода «9 (999) 999 99 99» или «9 (999) 999-99-99». Все зависит от требуемого формата представления строки. Или допустим нам нужно ввести формат дополнительного номера накладной типа «код подразделение.месяц.год», тогда маска будет «UUUU.99.9999» или «UUUU/99/9999»

Стоит помнить что, задавая маску – мы обязаны задать её полностью такой длины, какой длины вводится строка. Либо если существуют несколько форматов строки, короткий и длинный – то можно задать две и более масок, через запятую.

Разместил: E_Migachev  Версии: | 8.x | 8.2 УП |  Дата: 25.01.2011   Прочитано: 96118

Распечатать

Похожие FAQ

Еще в этой же категории

Как обновить динамический список или реквизит на форме клиента?  19
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список

Как на управляемой форме разместить список регистра сведений с отбором?  18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Как установить параметр динамического списка?  14
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма

Программное создание таблицы значений с условным оформлением  12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора

Заполнение списка значений в элементе поле выбора на форме  10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Посмотреть все в категории Работа с Формой (Диалог) и её элементами

При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования!

В 1С 8.3 по умолчанию настройки справочника номенклатуры такие:


При такой настройке, механизм поиска в справочнике номенклатуры работает так:


- в документе вводим первые символы Пета и видим такой результат подсказки:


Но, такой поиск не удобен и менеджеры захотели подбирать номенклатуру по артикулу, например 1320

Для этого изменим настройки указав поиск по Любой части и включив полнотекстовый поиск:


Сохраняем конфигурацию и в режиме предприятие обновляем Полнотекстовый поиск: Меню - Все функции - Стандартные - Управление полнотекстовый поиском


После этого пробуем в документе выполнить поиск по 1320 и видим:


Все Менеджеры пищат как дети на новогодней елке!

Пока писал эту статью нашел в интернете другое решение для платформы 8.2:

СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)

ОбработкаПолученияДанныхВыбора(<ДанныеВыбора>, <Параметры>, <СтандартнаяОбработка>)

В модуле менеджера справочника "Номенклатура" пишем:

В обработчике - ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбраблтка) для нас важны все три параметра. В первый "ДанныеВыбора" мы загружаем наш список номенклатуры, полученный по нашему алгоритму. Из параметра "Параметры" мы получим значение введенное пользователем, а третьему параметру "СтандартнаяОбработка" мы должны поставить значение "Ложь"(отключаем стандартный алгоритм системы).

В результате одной небольшой процедурой мы полностью решили поставленную задачу.

Чтобы использовать ввод по строке в документах нужно на уровне справочника указать поля по которым будет использоваться ввод по строке. По умолчанию это предопределенные реквизиты "Наименование" и "Код".

1.jpg

Для переопределения события ввода по строке в модуле менеджера документа (в котором собственно и будем творить бардак) создаем событие


ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

В этом модуле можно определить новый массив для данных выбора

"Параметры" - Содержит параметры выбора.
Их можно дополнительно настроить в обработчике события.
Структура, в которой обязательно должны содержаться следующие ключи:

  • СтрокаПоиска (SearchString) - строка, используемая при поиске данных, Неопределено - осуществляется быстрый выбор;
  • Отбор (Filter) - отбор, используемый при поиске данных;
  • ВыборГруппИЭлементов (ChoiceFoldersAndItems) - указывается использование групп и элементов (только для иерархических данных); тип ИспользованиеГруппИЭлементов;
  • СпособПоискаСтроки (StringSearchMode) - указывается способ поиска при вводе по строке; тип СпособПоискаСтрокиПриВводеПоСтроке; параметр может отсутствовать;
  • ПолнотекстовыйПоиск (FullTextSearch) - указывается необходимость использования полнотекстового поиска при вводе по строке; тип - ПолнотекстовыйПоискПриВводеПоСтроке; параметр может отсутствовать;
  • РежимПолученияДанныхВыбора (ChoiceDataGettingMode) - указывает режим запуска поиска. Тип РежимПолученияДанныхВыбораПриВводеПоСтроке; параметр может отсутствовать.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Наименование");
Запрос.УстановитьПараметр("Наименование", "%" + Параметры.СтрокаПоиска + "%");
// Конструкция "%" + Параметры.СтрокаПоиска + "%" показывает что в начале и в конце строки
//может быть неопределенное количество символов

//Выгружаем таблицу в массив чтобы потом загрузить ее в данные выбора
Массив = Таблица.ВыгрузитьКолонку("Ссылка");

ДанныеВыбора = Новый СписокЗначений; // Переопределяем данные выбора т.к. по
//умолчанию они имею тип - "неопределено"

СтандартнаяОбработка = Ложь; //ключевое вырожение отлючает стандартное выполнение
//и позволяет рабртать новому алгоритму

Читайте также: