1С автоподбор управляемые формы

1. Как переопределять работу поля ввода в части ввода по строке

Для переопределения работы поля ввода в части ввода по строке можно обрабатывать события поля ввода "АвтоПодборТекста" и "ОкончаниеВводаТекста".

1.1. Событие АвтоПодборТекста

Событие "АвтоПодборТекста" возникает во время начала ожидания ввода текста (когда в процессе набора текста сделана пауза). При стандартной отработке события происходит поиск по полям, указанным в свойстве "Ввод по строке" соответствующего объекта метаданных. Если найдено единственное значение, то производится автоподстановка окончания текста. Если введенному тексту соответствует несколько значений, то автоподстановки не происходит.

В этом примере при вводе в поле ввода буквы "п" и прерывании редактирования в поле ввода появился слово "пункт", при этом выделена будет его часть "ункт" (начало слова было уже введено и выделение на него не делается):

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

1.2. Событие ОкончаниеВводаТекста

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

Необходимость формирования значения по тексту в поле ввода возникает в различных ситуациях, например при переходе из поля ввода к другому элементу управления, нажатии в поле ввода кнопки выбора (клавиша F4) и в ряде других ситуаций.

Стандартный (системный) обработчик события ищет некоторое значение, которое соответствует набранному тексту. Если найдено одно значение – оно сохраняется в качестве значения поля ввода. Если найдено несколько значений – в выпадающем списке предоставляется возможность выбрать из них нужное значение. Если не найдено ни одного значения – выдается сообщение о том, что в элементе управления введены некорректные данные.

В этом примере обеспечивается следующая функциональность для поля ввода: если в поле ввода набрать слово "одежда", то при формировании значения по имеющемуся в поле ввода тексту (например, при переходе из поля ввода к другому элементу управления в форме), пользователю будет предоставлена возможность выбрать одно из двух значений: "Рубашка" или "Брюки":

— введем в поле ввода слово "одежда":

— нажмем на клавишу Tab для перехода к следующему элементу управления: при этом появится выпадающий список из двух значений:

— выберем в выпадающем списке первое значение с помощью клавиши "Enter". выбранное значение будет установлено в поле ввода, а мы перейдем к следующему элементу управления:

2. Использование результатов поиска по строке

При поиске значения по тексту могут быть следующие результаты поиска:
· не найдено ни одного значения;
· найдено одно значение;
· найдено больше одного, но не более некоторого количества значений (в системе используется константа — 50 значений);
· найдено некоторое количество значений или больше (т.е. > 50).

В каждом из этих случаев стандартные (системные) обработчики событий "АвтоПодборТекста" и "ОкончаниеВводаТекста" ведут себя определенным образом.

2.1. Работа стандартного (системного) обработчика события АвтоПодборТекста с результатами поиска по строке

1. По имеющемуся в поле ввода тексту ищется одно подходящее значение

2. Значение найдено?

2.1. Получается текстовое представление найденного значения

2.2. В поле ввода дописываются недостающие завершающие символы текстового представления найденного значения.

Пример : пусть поле ввода имеет тип "СправочникСсылка.Номенклатура"; в свойстве "Ввод по строке" указаны поля "Код", "Наименование"; в справочнике есть два элемента с наименованиями "Рубашка", "Брюки":

Если мы введем воле ввода текст "Ру", он будет дополнен текстом "башка":

2.2. Устройство механизма преобразования текста в поле ввода в значение и обработчик события ОкончаниеВводаТекста

Рассмотрим процесс формирования значения по тексту, введенному в поле ввода. Ниже приводится алгоритм преобразования текста в поле ввода в значение:

  1. Начало процесса формирования значения по тексту поля ввода.
  2. Получение текста из поля ввода.
  3. Вызов обработчика события "ОкончаниеВводаТекста".
    В параметры вызываемой процедуры записывается:
    Текст — текст из поля ввода;
    Значение — Неопределено. В обработчике события в него можно записать значение или список значений;
    СтандартнаяОбработка = Истина.
  4. В обработчике события разрешили выполнение стандартной обработки?
  5. Через параметр "Значение" вернули список значений?
  6. Кнопка выбора (клавиша F4) нажата ?
  7. В переданном списке количество значений больше одного?
  8. Открытие выпадающего списка в поле ввода и выбор значения из списка. Если в выпадающем списке выбрано значение, оно выставляется в качестве значения в поле ввода, а в качестве текста в поле ввода устанавливается текстовое представление выбранного значения. Если же значение в выпадающем списке не выбрано, состояние поля ввода не меняется.
  9. В переданном списке храниться только одно значение?
  10. В качестве значения в поле ввода устанавливается единственное значение из переданного списка. В качестве текста в поле вода устанавливается текстовое представление устанавливаемого значения.
  11. В параметре "Значение" вернули не список значений, а конкретное значение?
  12. Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
  13. В качестве значения в поле ввода устанавливается значение параметра "Значение", а в качестве текста — представление устанавливаемого значения.
  14. Вызов стандартного (системного) обработчика события "ОкончаниеВводаТекста".
  15. Конец процесса формирования значения по тексту поля ввода.

Из описанного алгоритма видно, что смысл подмены стандартного (системного) обработчика может состоять в том, чтобы сформировать свой список значений из одного и более элементов или одно конкретное значение для поля ввода в зависимости от того текста, который есть в поле ввода.

2.3. Работа стандартного (системного) обработчика события ОкончаниеВводаТекста с результатами поиска по строке

Стандартный (системный) обработчик события "ОкончаниеВводаТекста" работает следующим образом:

  1. Начало работы стандартного обработчика.
  2. Получение текста из поля ввода.
  3. Текст в поле ввода не пустой?
  4. Формирование списка значений на основе текста из поля ввода. Например — поиск товаров, у которых наименование товара начинается с имеющегося в поле ввода текста.
  5. В сформированном в пункте 4 списке значений есть элементы?
  6. Кнопка выбора (клавиша F4) нажата? Это условие проверяется, потому что если она нажата, то будет открываться форма выбора и выпадающих списков появляться не должно.
  7. В сформированном в пункте 4 списке значений есть только одно значение?
  8. Устанавливаем единственное значение из списка в поле ввода. В качестве текста в поле ввода устанавливается представление этого значения.
  9. В сформированном в пункте 4 списке значений более 50 элементов?
  10. Открывается выпадающий список у поля ввода. В качестве списка значений для него используется список, сформированный в пункте 4. Пользователь может выбрать в этом списке одно из значений.
  11. Вывод пользователю сообщения о том, что найдено слишком много значений.
  12. Установка в поле ввода значения по умолчанию того типа, который сейчас выставлен в поле ввода.
  13. Конец работы стандартного обработчика.

3. Настройка состава и порядка полей, используемых в стандартных (системных) обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста

Для определения состава полей, используемых стандартными (системными) обработчиками событий " АвтоПодборТекста" и "ОкончаниеВводаТекста" , и их порядка, ряд объектов метаданных поддерживают свойство "Ввод по строке", доступное для редактирования через палитру свойств и в форме редактирования объекта метаданных. К таким объектам метаданных относятся "Справочники", "Документы", "Планы видов характеристик", "Планы счетов", "Планы видов расчета", "Планы обмена", "Бизнес-процессы", "Задачи".

Состав полей объекта метаданных, которые могут участвовать в поиске, состоит из некоторых фиксированных полей и реквизитов, для которых указано, что они строкового или числового типа и их нужно индексировать или индексировать с дополнительным упорядочиванием.

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

В качестве значения по умолчанию для свойства "Ввод по строке" в 1С:Предприятии 8 используются следующие поля:

План счетов Наименование, Код План обмена Наименование, Код План видов характеристик Наименование, Код Документ Номер документа Справочник Наименование, Код Бизнес-процесс Номер Задача Номер, Наименование План видов расчета Наименование, Код

Отметим, что поле используется для поиска по строке только в том случае, если длина поля больше нуля. Так, например, если длина наименования в некотором справочнике равна нулю, то поиск по полю "Наименование" выполняться не будет.

Пример . Есть справочник товаров , описываемых кодом (число), наименованием (строка) и артикулом (строка).

Если принято использование артикулов товаров, можно указать в свойстве "Ввод по строке" поля "Артикул", "Наименование", "Код". При этом в выпадающем списке сначала будут идти товары, у которых в поле "Артикул" хранится хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле "Наименование" хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле "Код" хранится введенное значение (текст из поля ввода интерпретируется как число).

Если использование артикулов товаров не принято, можно указать в свойстве "Ввод по строке" поля " Наименование", " Код". При этом в выпадающем списке сначала будут идти товары, у которых в поле " Наименование" хранится текст, начинающийся с введенного текста, затем — товары, у которых в поле " Код" хранится введенное значение (текст из поля ввода интерпретируется как число).

4. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста

Механизм автоподбора текста в поле ввода и преобразования текста в значение не предусматривает возможности использования разработчиком конфигурации интерактивных действий в обработчиках событий. Кроме того, логика работы стандартных (системных) обработчиков событий достаточно сложная и в обработчиках этих событий не всегда можно узнать, по какому поводу он (обработчик) вызван. Например, обработчик события " ОкончаниеВводаТекста" будет вызываться не только при переходе из поля ввода на другой элемент управления формы, но и при нажатии в поле ввода кнопки выбора (клавиша F4).

Рекомендуется в обработчиках событий " АвтоПодборТекста" и " ОкончаниеВводаТекста" работать исключительно с параметрами обработчиков, формируя нужный текст и значения и отдавая их через параметры обработчиков.

5. Управление механизмом автопоиска и автоподбора с помощью прав

Управлять механизмом автопоиска и автоподбора можно на уровне прав пользователей. Для этого в списке прав для различных объектов метаданных существует право "Ввод по строке".

Если у пользователя нет права на ввод по строке для соответствующего объекта метаданных , в поле ввода запрещается редактирование текста и работа механизма автопоиска и автоподбора блокируется.

6. Работа механизма автопоиска и автоподбора с правами на уровне записей

Данные, используемые системой в обработчиках событий автопоиска и автоподбора, могут иметь ограничения на доступ к ним. Достичь этого можно с помощью механизма ограничения прав доступа к данным на уровне записей. В этой ситуации сама платформа 1С:Предприятие 8 выбирает только разрешенные записи и дополнительной поддержки на уровне обработчиков событий для этого не требуется.

Если же есть необходимость поиска подходящих данных в обработчиках событий автопоиска и автоподбора, в запросе нужно использовать служебное слово "РАЗРЕШЕННЫЕ", указывающее, что при встрече данных, доступ к которым ограничен, нужно их просто пропускать: в противном случае будет выдана ошибка времени исполнения.

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

Страницы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Предыстория

К написанию статьи меня подтолкнула задача, для решения которой я должен был разработать сложную форму с большим количеством полей, связанных с разными объектами и, что главное, «c одной кнопкой». Тут и родилась мысль воспользоваться функцией «ввода по строке» в управляемом приложении 1С. В процессе решения задачи пришлось «набить шишек», но, надеюсь, приобретенный опыт будет полезен не только мне.

Механика

Думаю, правильным будет начать с краткого описания механики клиент-серверного взаимодействия при «вводе по строке».

Все начинается с поля ввода формы, у которого есть события «Автоподбор» и «ПриОкончанииВводаТекста».

Событие «АвтоПодбор» возникает при остановке ввода текста или нажатии на кнопку «стрелка вниз».

Событие «ОкончаниеВводаТекста» вызывается, как нам сообщает справка, при формировании значения из текста ввода. Кстати, это событие интересно тем, что если значение не сформировано, система не даст нам выйти из режима редактирования элемента. Иными словами, если введенный в поле текст не соответствует какому либо значению из данных выбора, то редактирование не будет завершено.

Оба перечисленные события вызываются на стороне клиента. Это дает возможность поработать с данными выбора и с текстом, введенным в поле, но заменить данные выбора на какие-то другие, полученные с сервера, мы не сможем. Дело в том, что мы не имеем права вызывать для этих событий серверные методы с директивой компиляции &НаСервере . Об этом нас предупреждает синтаксис помощник, и ему стоит поверить. На самом деле, такой вызов и не приведет к исключению, но тонкая организация механизма будет нарушена, и мы получим нечто непригодное для использования.

Обращаясь к труду «Разработка управляемого интерфейса» госпожи Хрусталевой и прочих уважаемых авторов, находим упоминание о методе «ПолучитьДанныеВыбора». Если спросить об этом методе синтаксис помощник, он выдаст нам список методов менеджеров для всех видов объектов платформы. Но, что толку от методов менеджеров, которые выполняются на сервере, если серверные вызовы нам недоступны? На самом деле, этот вопрос здесь, только по той причине, что если бы я был более внимательным человеком, я сразу решил бы свою задачу, и никакой статьи не появилось бы. Достаточно просто пролистать до конца список ссылок, и в конце обнаружится глобальный метод «ПолучитьДанныеВыбора». С помощью этого метода мы на клиенте можем получить данные выбора для любого ссылочного объекта системы, что дает возможность переопределить стандартный алгоритм получения выбора данных. Например, для поля строчного типа, у которого вообще нет стандартных данных выбора, использовать алгоритм справочника «Контрагенты».

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

Задача

Мы разобрались с взаимодействием клиента и сервера, теперь я предлагаю подкрепить теорию практикой. Решим небольшую задачу, которая звучит следующим образом.

  1. Демонстрационная конфигурация «Управляемое приложение»
  2. Покупатели «Компании» являются частными лицами
  3. Наименования клиентов по правилам «Компании» состоят из фамилии и инициалов.
  4. ФИО клиентов могут периодически изменяться

Реализовать в форме документа «РасходТовара» подбор покупателя по ФИО.

Решать сохранение нового покупателя и его ФИО не будем, так как к «вводу по строке» это не относится.

Решение:

Добавим в конфигурацию «Управляемое приложение» новый периодический регистр сведений «ФИОКонтрагентов». Периодичность «день», единственное и ведущее измерение «Контрагент» (Тип(«СправочникСсылка.Контрагенты»)), ресурсы «Фамилия», «Имя», «Отчество» (Тип(«Строка(50)»)).

На форме документа «РасходТовара» также добавим три новых реквизита «ПокупательФамилия», «ПокупательИмя», «ПокупательОтчество». Также, для удобства, добавим кнопку и команду «ОчиститьФИО».

В модуле формы реализуем метод «ПолучитьДанныеВыбораПоФИО» с директивой компиляции &НаКлиенте

В модуле менеджера справочника «Контрагенты» реализуем обработчик «ОбработкаПолученияДанныхВыбора»

В модуле менеджера регистра сведений «ФИОКонтрагентов» реализуем экспортную функцию

«ПолучитьДанныеВыбораФИО»

Теперь определим в форме документа обработчики «ФамилияАвтоПодбор», «ИмяАвтоПодбор», «ОтчествоАвтоПодбор».

Обработчики «ФИООбработкаВыбора» , «ФИОПриИзменении», «ФИОПриИзмененииНаСервере» подойдут для всех полей ФИО.

Готово! Можем заходить и проверять, что у нас получилось.

Решенный вариант можно получить с помощью обновления (cfu) в приложении к статье. Для этого создайте из "Демонстрационной конфигурации "Управляемое приложение" (1.0.16.1)" файл поставки и обновите его приложенным файлом. Для тех, кто редко делает поставки вот нехитрая процедура:


[an error occurred while processing the directive]
Карта сайта