ограничение типа в поле ввода 1с
Особенности работы связи по типу у поля ввода
У элемента формы «Поле ввода» есть возможность настройки связи по типу. Связь по типу позволяет автоматически ограничивать набор допустимых типов поля ввода, в зависимости от значения какого-либо реквизита. Эта возможность, в частности, используется для настройки зависимости значения субконто от вида субконто. Если связь настроена, то при изменении значения вида субконто в поле ввода значения субконто будет автоматически ограничен тип. То есть пользователю при вводе значения субконто будут доступны только значения тех типов, которые определены у вида субконто.
Важно помнить, что связь по типу изменяет только настройку поля, но не само значение реквизита, с которым связано поле. Это связано с тем, что связь настраивается со значением реквизита. При этом значение реквизита может изменяться не только в результате интерактивных действий пользователя. Например, при открытии формы реквизит изменит свое значение, так как происходит загрузка объекта, который редактирует данная форма.
Допустим, существует документ, у которого есть реквизиты Вид и Значение, соответственно хранящие вид и значение субконто. У вида субконто изменили тип. Тогда при открытии документа у поля ввода, связанного с реквизитом Значение, отработает связь по типу. Доступные типы поля ввода будут ограничены по виду субконто, но значение реквизита не должно измениться, так как иначе пользователь не увидит настоящего значения реквизита, а увидит уже приведенное значение.
Из-за того что при отработке связи по типу значение реквизита не изменяется, возникает эффект, когда пользователю доступен для ввода только один тип, но при нажатии на кнопку выбора ему предлагается выбрать этот единственный тип. Для того что бы избежать данного эффекта, нужно обрабатывать изменение значения вида субконто и приводить значение субконто к допустимому типу.
Например, есть форма, в которую вставлены поля ПолеВводаВидСубконто, ПолеВводаЗначениеСубконто, и они связаны с реквизитами формы ВидСубконто и ЗначениеСубконто соответственно. У элемента формы ПолеВводаЗначениеСубконто настроена связь по типу с реквизитом формы ВидСубконто. Для того чтобы связь работала корректно, нужно событию ПриИзменении поля ввода ПолеВводаВидСубконто назначить обработчик следующего содержания:
В данном фрагменте кода у нового значения вида субконто берется описание типа, и с помощью него значение субконто приводится к допустимому типу.
Поле ввода, редактирующее значение субконто, можно связать по типу не только непосредственно с видом субконто, но и с видом субконто счета. Для этого надо настроить связь по типу с реквизитом, содержащим счет. При этом у поля ввода появится свойство «Вид субконто». В нем указывается номер вида субконто на счете. То есть если указан вид субконто 1, то при изменении значения счета, полю вводу будет назначен тип из первого вида субконто счета. В этом случае для корректной работы связи надо обрабатывать изменение значения счета. А обработчик события «При изменении» будет выглядеть следующим образом:
В данном примере при изменении значения счета берется первый вид субконто счета и с помощью его типа приводится значение субконто. Важно отметить, что при указании вида субконто в свойстве нумерация ведется с 1, а при обращении к массиву видов субконто программно нумерация производится с 0.
Особенности работы ввода по строке в поле ввода
1. Как переопределять работу поля ввода в части ввода по строке
Для переопределения работы поля ввода в части ввода по строке можно обрабатывать события поля ввода «АвтоПодборТекста» и «ОкончаниеВводаТекста».
1.1. Событие АвтоПодборТекста
Событие «АвтоПодборТекста» возникает во время начала ожидания ввода текста (когда в процессе набора текста сделана пауза). При стандартной отработке события происходит поиск по полям, указанным в свойстве «Ввод по строке» соответствующего объекта метаданных. Если найдено единственное значение, то производится автоподстановка окончания текста. Если введенному тексту соответствует несколько значений, то автоподстановки не происходит.
В этом примере при вводе в поле ввода буквы «п» и прерывании редактирования в поле ввода появился слово «пункт», при этом выделена будет его часть «ункт» (начало слова было уже введено и выделение на него не делается):
Выделение выставляется для того, чтобы подставленную часть текста можно было легко заменить следующим действием редактирования, если подставленный текст не подходит. Для отключения стандартного обработчика в значение параметра «СтандартнаяОбработка» записали «Ложь».
1.2. Событие ОкончаниеВводаТекста
Событие «ОкончаниеВводаТекста» вызывается системой в тех случаях, когда по введенному (отредактированному) в поле ввода тексту нужно сформировать значение, соответствующее этому тексту. При этом, если по имеющемуся в поле ввода тексту уже было ранее успешно сформировано значение, нового формирования значения по этому тексту выполняться не будет (т.е. не будет возникать событие «ОкончаниеВводаТекста»).
Необходимость формирования значения по тексту в поле ввода возникает в различных ситуациях, например при переходе из поля ввода к другому элементу управления, нажатии в поле ввода кнопки выбора (клавиша F4) и в ряде других ситуаций.
Стандартный (системный) обработчик события ищет некоторое значение, которое соответствует набранному тексту. Если найдено одно значение – оно сохраняется в качестве значения поля ввода. Если найдено несколько значений – в выпадающем списке предоставляется возможность выбрать из них нужное значение. Если не найдено ни одного значения – выдается сообщение о том, что в элементе управления введены некорректные данные.
В этом примере обеспечивается следующая функциональность для поля ввода: если в поле ввода набрать слово «одежда», то при формировании значения по имеющемуся в поле ввода тексту (например, при переходе из поля ввода к другому элементу управления в форме), пользователю будет предоставлена возможность выбрать одно из двух значений: «Рубашка» или «Брюки»:
— введем в поле ввода слово «одежда»:
— нажмем на клавишу Tab для перехода к следующему элементу управления: при этом появится выпадающий список из двух значений:
— выберем в выпадающем списке первое значение с помощью клавиши «Enter». выбранное значение будет установлено в поле ввода, а мы перейдем к следующему элементу управления:
2. Использование результатов поиска по строке
В каждом из этих случаев стандартные (системные) обработчики событий «АвтоПодборТекста» и «ОкончаниеВводаТекста» ведут себя определенным образом.
2.1. Работа стандартного (системного) обработчика события АвтоПодборТекста с результатами поиска по строке
1. По имеющемуся в поле ввода тексту ищется одно подходящее значение
2. Значение найдено?
2.1. Получается текстовое представление найденного значения
2.2. В поле ввода дописываются недостающие завершающие символы текстового представления найденного значения.
Пример : пусть поле ввода имеет тип «СправочникСсылка.Номенклатура»; в свойстве «Ввод по строке» указаны поля «Код», «Наименование»; в справочнике есть два элемента с наименованиями «Рубашка», «Брюки»:
Если мы введем воле ввода текст «Ру», он будет дополнен текстом «башка»:
2.2. Устройство механизма преобразования текста в поле ввода в значение и обработчик события ОкончаниеВводаТекста
Рассмотрим процесс формирования значения по тексту, введенному в поле ввода. Ниже приводится алгоритм преобразования текста в поле ввода в значение:
Из описанного алгоритма видно, что смысл подмены стандартного (системного) обработчика может состоять в том, чтобы сформировать свой список значений из одного и более элементов или одно конкретное значение для поля ввода в зависимости от того текста, который есть в поле ввода.
2.3. Работа стандартного (системного) обработчика события ОкончаниеВводаТекста с результатами поиска по строке
Стандартный (системный) обработчик события «ОкончаниеВводаТекста» работает следующим образом:
3. Настройка состава и порядка полей, используемых в стандартных (системных) обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Состав полей объекта метаданных, которые могут участвовать в поиске, состоит из некоторых фиксированных полей и реквизитов, для которых указано, что они строкового или числового типа и их нужно индексировать или индексировать с дополнительным упорядочиванием.
При поиске по строке для числовых полей из строки формируется число, которое затем ищется в базе данных. При поиске по строке для строковых полей ищутся все записи из базы данных, у которых в соответствующем поле хранится текст, начинающийся с искомого.
В качестве значения по умолчанию для свойства «Ввод по строке» в 1С:Предприятии 8 используются следующие поля:
Отметим, что поле используется для поиска по строке только в том случае, если длина поля больше нуля. Так, например, если длина наименования в некотором справочнике равна нулю, то поиск по полю «Наименование» выполняться не будет.
4. Модальные действия в обработчиках событий АвтоПодборТекста и ОкончаниеВводаТекста
Механизм автоподбора текста в поле ввода и преобразования текста в значение не предусматривает возможности использования разработчиком конфигурации интерактивных действий в обработчиках событий. Кроме того, логика работы стандартных (системных) обработчиков событий достаточно сложная и в обработчиках этих событий не всегда можно узнать, по какому поводу он (обработчик) вызван. Например, обработчик события » ОкончаниеВводаТекста» будет вызываться не только при переходе из поля ввода на другой элемент управления формы, но и при нажатии в поле ввода кнопки выбора (клавиша F4).
Рекомендуется в обработчиках событий » АвтоПодборТекста» и » ОкончаниеВводаТекста» работать исключительно с параметрами обработчиков, формируя нужный текст и значения и отдавая их через параметры обработчиков.
5. Управление механизмом автопоиска и автоподбора с помощью прав
Управлять механизмом автопоиска и автоподбора можно на уровне прав пользователей. Для этого в списке прав для различных объектов метаданных существует право «Ввод по строке».
6. Работа механизма автопоиска и автоподбора с правами на уровне записей
Данные, используемые системой в обработчиках событий автопоиска и автоподбора, могут иметь ограничения на доступ к ним. Достичь этого можно с помощью механизма ограничения прав доступа к данным на уровне записей. В этой ситуации сама платформа 1С:Предприятие 8 выбирает только разрешенные записи и дополнительной поддержки на уровне обработчиков событий для этого не требуется.
Если же есть необходимость поиска подходящих данных в обработчиках событий автопоиска и автоподбора, в запросе нужно использовать служебное слово «РАЗРЕШЕННЫЕ», указывающее, что при встрече данных, доступ к которым ограничен, нужно их просто пропускать: в противном случае будет выдана ошибка времени исполнения.
Программное приведение типа значения поля ввода и колонки табличного поля формы 1С8
При создании формы возникает вопрос настройки типа значения поля ввода. Не всегда заранее точно известен используемый тип, поскольку это может зависеть от метаданных конфигурации и условий использования.
Если, как минимум, известно, что в поле потребуется вводить и использовать элемент Справочника или Документ, то можно настроить тип на общий вид значения, например СправочникСсылка или ДокументСсылка. Далее решить вопрос программно при открытии формы, для уточнения используемого типа.
Если требуется использовать элемент справочника Номенклатура, но в разных конфигурациях этот объект метаданных может называться по-разному, например Товары или же Номенклатура, то программное определение наименования типа при открытии формы упростит жизнь пользователю.
Следовательно, настроим автоматический выбор и первичное преобразование полей на форме к типу значения Справочник.Номенклатура, если такой есть в метаданных конфигурации. В противном случае, выбираем в качестве начального значения первый в списке имён справочников.
Для примера разработана управляемая форма и форма в обычном режиме (см. скриншоты публикации).
Обычный режим
Ниже приведен алгоритм на языке 1С8 для формы в обычном режиме. На форме есть поле список ВыбранныйТип, для которого настроено событие ПриИзменении. В поле ВыбранныйТип пользователь выбирает тип, который желает использовать для преобразования полей. При открытии формы считываем список справочников из метаданных конфигурации. Ищем справочник Номенклатура в списке, далее инициализируем на форме поле ВыбранныйТип полученным списком имён и найденным значением. Запускаем событие ВыбранныйТипПриИзменении, для преобразования типа полей ввода. В переменную модуля формы СтрокаТипЗнч сохраним полное имя выбранного типа для использования в других процедурах.
Далее необходимо выполнить преобразование типа значения колонки табличного поля. Для этого воспользуемся событием НачалоВыбора.
Код преобразования приведен ниже. В нём используется ранее инициализированная переменная СтрокаТипЗнч для получения имени выбранного типа. Алгоритм можно найти в справке по ключевому слову ПривестиЗначение.
Новый тип назначается полям динамически после каждого выбора значения в списке ВыбранныйТип.
Управляемые формы
Для управляемых форм алгоритм изменяется незначительно. Для преобразования используется свойство ОграничениеТипа. Работа с метаданными только на сервере. Для быстрого доступа к колонке табличного поля при срабатывании события НачалоВыбора сохраним в переменной на клиенте СсылкаЭлементКолонкаТП ссылку с адресом элемента.
Рассмотренный пример алгоритма можно протестировать, скачав обработку по ссылке из публикации. Работа выполнялась на 1С:Предприятие 8.3 (8.3.15.1747), с использованием конфигураций «Управление торговлей», редакция 10.3 (10.3.46.3), Управление торговлей, редакция 11 (11.4.7.150). В составе обработки одновременно присутствует управляемая форма и форма обычного режима.
Спасибо за внимание! Критика приветствуется.
Быстрый ввод строковых значений в поля составного типа
Пример: в документе «Встреча» нужно вводить как заведенные в справочнике «Площадки» значения, так и произвольные строки. Такая необходимость может возникнуть в том случае, когда замусоривание справочника случайными значениями нежелательно.
Типовое поведение полей ввода значений составного типа не позволяет простым набором текста и нажатием Enter ввести строковое значение:
— при позиционировании в таком поле нельзя сразу начать набор текста: сначала нужно нажать на «педальку» (или F4) и выбрать тип:
2) при ненайденном элементе справочника платформа показывает всплывающее окно с кнопкой создания элемента и гиперссылкой «Показать все», от которого (без применения мышки) можно «избавиться»* только через Esc, либо стерев введенный текст:
* под «избавиться» подразумевается ввод желаемого строкового значения с клавиатуры, а не выбор из предлагаемых элементов справочника или создание нового
Далее предлагается метод, который позволяет пользователю после набора текста сразу вводить значение в поле ввода по нажатию Enter (без показа диалогов и всплывающих окон). При этом:
— можно как выбирать любое значение из справочника:
— так и вводить произвольное строковое значение:
Для реализации такого поведения требуется выполнить следующие шаги:
1. В модуле формы в ПриСозданииНаСервере() выставить для поля ввода ограничение типа:
2. В событии НачалоВыбора() поля ввода реализовать возможность выбора элементов справочника:
3. Наконец, реализовать возможность подбирать в поле ввода элементы из справочника простым набором текста, добавив обработчик события АвтоПодбор():