Как добавить реквизит для поиска по строке

Для прикладных объектов (справочники, документы, планы видов характеристик, планы счетов, планы видов расчета, регистры, бизнес-процессы и задачи, а также планы обмена) в свойстве Ввод по строке можно указать те реквизиты, по которым выполняется поиск. Если ввод по строке разрешен (заданы соответствующие реквизиты), то допустимо в поле ввода соответствующего типа не выполнять выбор из формы объекта, а ввести информацию, которая содержится в заданных реквизитах объекта.
Например,  в  справочнике Номенклатура ввод по строке разрешен у реквизита наименования. У справочника есть несколько наименований, в котором находится несколько товаров, начинающихся со слова Ве. Тогда, введя в поле ввода
номенклатуры подстроку  Ве, мы получим список товаров, которые начинаются с этого слова

Ввод по строке

В качестве реквизитов, по которым будет выполняться поиск, могут выступать:
● Для справочников, планов видов характеристик, планов счетов, планов видов расчета, планов обмена – Код и Наименование.
● Для документов – Номер.
● Для бизнес-процессов и задач – Номер и Наименование.
● Реквизиты, имеющие тип Число или Строка, для которых свойство Индексировать имеет значение Индексировать или Индексировать с доп. упорядочиванием. Примером последних может служить поле для ввода артикула, штрихкода, ИНН.

Настройка ввода по строке

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

Настройка ввода по строке

Если полей несколько, то установить порядок их следования. При поиске по строке поиск выполняется в полях в той последовательности, в которой они приведены в данном диалоге. Например, для элемента справочника Номенклатура ввод может осуществляться как по коду, так и по артикулу. Если значение кода одного элемента совпадет со значением артикула другого, то в список найденные значения попадут в том порядке, в котором указаны при настройке.
ВНИМАНИЕ! При выполнении поиска данных (во время ввода по строке) действуют ограничения доступа к данным .
Кроме указания того, по каким полям будет выполняться поиск, система позволяет дополнительно настроить некоторые параметры поиска. Свойство Способ поиска строки предназначено для указания способа поиска строки:
● Только в начале поля, выбранного для ввода по строке (значение Начало). В этом случае поисковая строка не разбивается на слова, а введенный текст ищется целиком. Например, если поиск выполняется в следующих данных: Иванов Максим и Максимов, то при вводе в поле ввода слова Максим будут найдены данные Максимов, а при вводе в поле ввода Иван Макс не будет найдено ничего.
● В любой части поля (значение Любая часть). Если строка поиска состоит из нескольких слов и поиск выполняется в любой части, то для поиска используется запрос, аналогичный следующему (для двух полей и двух слов):

(Поле1 ПОДОБНО “%Слово1%” ИЛИ Поле2 ПОДОБНО “%Слово1%”) И (Поле1 ПОДОБНО “%Слово2%” ИЛИ Поле2 ПОДОБНО “%Слово2%”)
Свойство Полнотекстовый поиск позволяет задействовать полнотекстовый поиск при организации ввода по строке. Полнотекстовый поиск нельзя использовать для таблиц внешних источников данных. Использование полнотекстового поиска обладает несколькими особенностями:
1. Полнотекстовый поиск всегда выполняется по началу слов.
2. Полнотекстовый поиск используется для первоначального отбора объектов, в которых будет выполняться дальнейший поиск (уменьшается количество объектов, в которых будет выполняться поиск).
3. К результатам полнотекстового поиска будут добавлены все непроиндексированные ссылки из таблицы, по которой выполнялся ввод по строке.
4. В списке отобранных объектов будет выполняться поиск по полям, которые отобраны для использования в механизме ввода по строке способом, который задан свойством Способ поиска строки.
5. Для каждого слова из поискового запроса в конце добавляется символ “*”.
Указанные особенности могут привести к тому, что:
● Полнотекстовый поиск может чрезмерно сузить набор данных для поиска, если используется поиск по любой части вместе с полнотекстовым поиском. В результате данные найдены не будут. При этом отключение полнотекстового поиска приведет к нахождению нужных данных. Это произойдет потому, что полнотекстовый поиск ищет только по началу слова. Если искомый текст не находится в начале слова – ввод по строке не найдет такие данные.
● Неактуальный индекс полнотекстового поиска может негативно сказаться на результатах поиска.
● Если полнотекстовый поиск завершился с ошибкой, то будет применяться обычный поиск, в соответствии со свойством Способ поиска строки. Это может привести к ситуации, когда найденный объект превратиться в ненайденный (для способа поиска по любой части слова). Например: в поле ввода введен символ «а», который есть не только в начале, а и в середине массива слов, в котором выполняется поиск. Для большого набора данных полнотекстовый поиск завершится с ошибкой (слишком большой результат поиска) и с помощью обычного поиска будут найдены данные, которые внутри себя содержат букву «а». Затем пользователь введет еще одну букву (например, «ц») и поисковая строка станет «ац». В этом случае полнотекстовый поиск отберет только те данные, которые начинаются на «ац» и проигнорирует те данные, которые содержат «ац» внутри себя.
Если выпадающий список формируется системой (а не с помощью программного кода прикладного решения), то представления найденных объектов формируются по специальному алгоритму. Представление найденного объекта состоит из двух частей: представление реквизита, содержащего строку поиска (обязательная часть) и дополнительное представление (не обязательная часть).
Собственно представление формируется следующим образом:
● Определяется поле, содержащее поисковую строку:
● В случае использования полнотекстового поиска или при обычном поиске по нескольким словам таким полем будет первое поле, из состава полей, указанных в свойстве Ввод по строке, в котором найдено первое слово из поисковой строки.
● При использовании обычного поиска по одному слову таким полем будет реквизит, в котором выполнялся поиск.
● Представление значения, расположенного в определенном поле будет являться обязательной частью представления найденного объекта для выпадающего списка.
● Определяется, необходимо или нет формировать дополнительное представление. Для этого определяется состав полей, который будет использоваться для формирования дополнительного представления:
● Если у найденного объекта есть только одно поле, используемое для формирования представления, и поисковая строка обнаружена в этом реквизите – используются поля альтернативного представления.
● В противном случае используются поля основного представления. Список полей основного и альтернативного представления приведен ниже.
● Если список полей для формирования дополнительного представления является пустым – дополнительное представление не формируется. В противном случае дополнительное представление формируется следующим образом:
● В круглые скобки заключается текстовое представление всех полей, которые выбраны для формирования дополнительного представления,через “, “;
● Сформированное дополнительное представление добавляется справа, через пробел, к обязательной части представления найденного объекта.
● Для формирования основного и альтернативного представления используются следующие поля:
● Справочник, бизнес-процесс, план видов характеристик, план счетов, план видов расчета:
● Основное представление: Наименование, Код.
● Альтернативное представление: в зависимости от того, какое выбрано основное представление, для альтернативного представления используется оставшееся поле.
● Документ:
● Основное представление: Номер, Дата.
● Альтернативное представление: отсутствует.
● Задача:
● Основное представление: Наименование, Номер, Дата.
● Альтернативное представление: отсутствует.
● Внешний источник данных:
● Основное представление: поле указанное в свойстве Поле представления таблицы внешнего источника данных .
● Альтернативное представление: отсутствует.
Свойство Режим получения данных выбора управляет тем, как платформа осуществляет поиск данных при вводе по строке. Если свойство установлено в значение Фоновый, то для получения данных используется фоновое задание, а в выпадающем списке отображается анимированная картинка, аналогичная фоновому выполнению отчета (см. здесь). Фоновое задание используется в том случае, если за 200 мс требуемые данные не получены для отображения пользователю. Для файлового варианта информационной базы возможно получение данных в фоновом режиме в том случае, если в момент получения данных не выполняется другое фоновое или регламентное задание. Во время фонового получения результатов выбора пользователь может продолжать редактировать поле ввода. Указанием значения Непосредственно в качестве значения свойства приводит к тому, что поиск выполняется без использования фоновых заданий.
При настройке ввода по строке рекомендуется следовать следующим рекомендациям:
● Значение Фоновый для свойства Режим получения данных выбора рекомендуется устанавливать для объектов, в которых планируется большое количество данных.
● Полнотекстовый поиск рекомендуется включать для объектов, в которых ожидается большое количество данных.
● Поиск строки в любом месте рекомендуется включать совместно с фоновым поиском, либо в таблицах, в которых не ожидается большого количества данных. Желательно, так же при большом количестве данных, если включается поиск в любом месте, то включать и полнотекстовый поиск (чтобы большая часть поисков выполнялась бы через полнотекстовый поиск).

Особенности поведения поля ввода

При вводе данных в поле ввода следует учитывать некоторые особенности работы со списком выбора. Если в результате набора обнаружено несколько объектов, начинающихся с введенного текста, то список этих объектов будет расположен в выпадающем списке. Во время ввода пользователь может с помощью кнопок Стрелка вверх и Стрелка вниз передвигаться по списку, при этом продолжая набор текста в самом поле. В этом случае для осуществления выбора требуется выбрать необходимый элемент и подтвердить выбор нажатием кнопки Enter или Tab. Для формирования списка
выбора для поля ввода используется следующий алгоритм:
1. Выполняется получение данных при выполнении поиска в первом поле (из списка выбранных полей) по началу строки и по подстроке. Количество записей, полученных в результате поиска по началу строки, будем называть РС, а количество записей, полученных в результате поиска по подстроке, будем называть РП.
2. Если РС+РП<=10, то в выпадающий список попадут все результаты каждого поиска.
3. Если РП и РС больше 5 (каждый), то в список выбора попадет по 5 записей из каждого списка.
4. Если любое из значений РП или РС меньше 5, то в выпадающий список попадут все записи из меньшего списка и столько записей из большего списка, чтобы дополнить выпадающий список до 10.
5. Если общее количество записей в выпадающем списке оказалось меньше 10, то выполняем алгоритм с шага 1 для следующего поля из списка выбранных полей, используя разницу между 10 и количеством полученных результатов как число необходимых к получению данных на следующем шаге.

Программное формирование списка выбора

Если разработчика не устраивает, каким образом формируется список выбора, он может переопределить его самостоятельно.
Сделать это можно двумя способами:
● Непосредственно в форме – в этом случае особое формирование списка выбора будет работать только для этого, единственного поля. Для этого необходимо определить обработчики событий НачалоВыбора, АвтоПодбор и ОкончаниеВводаТекста.
● В модуле менеджера соответствующего объекта – в этом случае особое формирование списка выбора будет выполняться для всех полей ввода, в которых вводятся значения используемого объекта.
Если поле связано с данными, имеющими тип ссылки на прикладной объект (например, СправочникСсылка, ПеречислениеСсылка и т. д.), то список выбора можно сформировать или в модуле менеджера соответствующего объекта, или с помощью обработчиков модуля формы. В остальных случаях список выбора можно сформировать только с помощью обработчиков модуля формы.
Подробнее остановимся на втором способе.
Для программного формирования списка выбора необходимо переопределить обработчик события ОбработкаПолученияДанныхВыбора менеджера
объекта. Обработчик получает набор параметров, определяющих условия формирования списка выбора. Набор параметров представляет собой
структуру, которая содержит:
● Строку поиска – текстовую строку, содержащую текст, который пользователь ввел в поле ввода. Данное свойство присутствует всегда (свойство
СтрокаПоиска).
● Отбор – структура, которая описывает отбор так, как его описывает параметр формы Отбор для расширения формы для динамического списка.
Данное свойство присутствует всегда.
Отбор, указанный в данном свойстве, будет конвертироваться (по возможности) в запрос полнотекстового поиска, уточняя этот запрос для
повышения скорости поиска.
● Свойство, которое указывает режим выбора групп и элементов (передается только для иерархических списков) – свойство ВыборГруппИЭлементов.
● Свойство, которое определяет способ поиска строки: по началу слова или по любой части (свойство СпособПоискаСтроки).
● Необходимость использования полнотекстового поиска (свойство ПолнотекстовыйПоиск).
● Режим получения данных выбора (свойство РежимПолученияДанныхВыбора).
● Кроме этого, в структуре передаются элементы, которые заданы в свойствах элемента формы – Связи параметров выбора (см. здесь) и Параметры
выбора (см. здесь).
Кроме того, в обработчик передается переменная, в которую следует вернуть сформированный список выбора, и параметр СтандартнаяОбработка,
который определяет поведение системы после того, как произойдет выход из обработчика.
Если разработчик устанавливает параметр СтандартнаяОбработка в значение Ложь, то ему необходимо самому полностью формировать список выбора.
Если флажок стандартной обработки установить в значение Истина, то можно предоставить системе возможность сформировать список выбора, но при
этом можно модифицировать параметры выбора (добавить дополнительные значения отбора, изменить режим выбора групп и элементов и т. д.).
Примечание 1. Если система сама формирует список выбора, при формировании списка учитываются ограничения доступа к данным .
Примечание 2. Примеры, приведенные ниже, не являются законченным. Они предназначены для демонстрации различных механизмов получения списков выбора.
Так, следующий код в случае любого текста, вводимого пользователем, будет предоставлять выбор из трех товаров, с кодами 00000002, 00000003 и 00000004.
Пример:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.Добавить(Справочники.Товары.НайтиПоКоду(“00000002”));
ДанныеВыбора.Добавить(Справочники.Товары.НайтиПоКоду(“00000003”));
ДанныеВыбора.Добавить(Справочники.Товары.НайтиПоКоду(“00000004”));

СтандартнаяОбработка = Ложь;
КонецПроцедуры

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Параметры.Отбор.Вставить(“Вид”, Перечисления.ВидыТоваров.Товар);
КонецПроцедуры

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

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

Также следует обратить внимание на еще один способ формирования списка выбора: передачу в качестве значения элемента списка значений не ссылки на искомый объект (как в примерах выше), а структуру особого содержания.
Эта структура состоит из следующих элементов:
● Значение – собственно значение выбираемого элемента. Элемент структуры с таким именем должен быть обязательно.
● ПометкаУдаления – признак, что выбираемое значение помечено на удаление в информационной базе. Элемент структуры с таким именем не является обязательным.
● Предупреждение – строка с текстом предупреждения, которое отобразит «1С:Предприятие» при выборе такого элемента из списка значений.
Элемент структуры с таким именем не является обязательным.
Если в структуре свойство ПометкаУдаления равно значению Истина и не указано свойство Предупреждение, то система автоматически сформирует текст предупреждения. Если свойство Предупреждение указано, то отображается именно оно. Следует помнить, что текст Предупреждение завершается вопросом Продолжить? и отображается в качестве вопроса с вариантами ответа Да и Нет.
Далее будет показана модификация предыдущего примера, в котором для складов с установленным в значение Истина реквизитом НеИспользовать будет сформировано предупреждение Этот склад не должен использоваться.
Также можно совмещать в одном списке выбора и значения типа Структура, и простые значения.
Пример:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
// Сформируем список с предупреждениями
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Склады.Ссылка,
| Склады.Наименование,
| Склады.НеИспользовать
|ИЗ
| Справочник.Склады КАК Склады”;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Структура = Новый Структура(“Значение”, ВыборкаДетальныеЗаписи.Ссылка);
// Заполним предупреждение
Если ВыборкаДетальныеЗаписи.НеИспользовать Тогда
Структура.Вставить(“Предупреждение“, “Этот склад не должен использоваться!”);
КонецЕсли;
Элемент = ДанныеВыбора.Добавить();
Элемент.Значение = Структура;
Элемент.Представление = ВыборкаДетальныеЗаписи.Наименование;
КонецЦикла;
КонецПроцедуры
ПРИМЕЧАНИЕ. Если представления элементов (в том числе и элементов структуры с именем Значение) не указаны в явном виде, то они будут получены автоматически.

Skip to content

1С поиск элемента по произвольному полю (при вводе по строке)

1С поиск элемента по произвольному полю (при вводе по строке)

В 1С присутствует возможность выбирать справочник из списка элементов, но есть альтернативный способ поиска — начать писать название справочника в поле ввода — этот метод называется ввод по строке (рис. 1).

По умолчанию в 1С, при вводе по строке, поиск возможен по наименованию и коду. В статье описано как расширить этот список.

Рисунок 1 — Поиск по строке

Допустим имеется конфигурация, где есть заказ покупателя, необходимо реализовать поиск номенклатуры по артикулу.

Порядок действий:

  • Для начала надо установить индексацию по артикулу:

Рисунок 2 — Индексация по реквизиту

  • Затем перейти в свойства номенклатуры;
  • В реквизит «ВводПоСтроке» добавить «Артикул»;

Рисунок 3 — Поля ввода по строке

В результате мы за несколько минут, без написания программного кода добавили поиск по артикулу при вводе строки.

Связанные статьи

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

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

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

 — в справочнике

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

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

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

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

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

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


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

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

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

Синтаксис:

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

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

Код 1C v 8.2 УП

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

         Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Наименование ПОДОБНОНаименование";

                      Запрос.УстановитьПараметр("Наименование", "%" + Параметры.СтрокаПоиска + "%");

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

         ДанныеВыбора = Новый СписокЗначений;
    ДанныеВыбора.ЗагрузитьЗначения(Массив);
    СтандартнаяОбработка = Ложь;

     КонецПроцедуры

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

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

Потребовалось тут как то реализовать в документе ввод по строке с поиском по строковым реквизитам справочника. Реализовывать по старинке через запрос при работающем и более функциональном полнотекстовом поиске совершенно не хотелось. К сожалению, на данный момент, даже при включении в настройках справочника использования полнотекстового поиска при вводе по строке поиск происходит только по указанным полям в настройке «Поле ввода».

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 
 СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Параметры.СтрокаПоиска, 50);
 ОбластьПоиска = Новый Массив;
 ОбластьПоиска.Добавить(Метаданные.Справочники.Номенклатура);
 СписокПоиска.ОбластьПоиска = ОбластьПоиска;
 СписокПоиска.ПерваяЧасть();
 
 Если СписокПоиска.Количество() Тогда
  ДанныеВыбора = Новый СписокЗначений;
  Для Каждого ЭлементПоиска Из СписокПоиска Цикл
   ЗаполнитьЗначенияСвойств(ДанныеВыбора.Добавить(), ЭлементПоиска);
  КонецЦикла;
 КонецЕсли;
 
КонецПроцедуры

Проверяем работу кода. Добавляем описание товара, не забываем обновить индекс полнотекстового поиска.

Выполняем ввод по строке в документе:

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

Свойство Значение Тип
ЭлементПоиска ЭлементСпискаПолнотекстовогоПоиска ЭлементСпискаПолнотекстовогоПоиска
Значение Стол журнальный СправочникСсылка.Номенклатура
Метаданные Список товаров ОбъектМетаданных
Описание «Описание товара: Стекло, дуб, ковка» Строка
Представление «Стол журнальный» Строка

Перепишем заполнение элементов списка, представление элемента списка формируем из свойств «Представление» и «Описание».

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 
 СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Параметры.СтрокаПоиска, 50);
 СписокПоиска.ОбластьПоиска.Добавить(Метаданные.Справочники.Номенклатура);   
 СписокПоиска.ПерваяЧасть();
 
 Если СписокПоиска.Количество() Тогда
  
  ДанныеВыбора = Новый СписокЗначений;
  Для Каждого ЭлементПоиска Из СписокПоиска Цикл
   ДанныеВыбора.Добавить(ЭлементПоиска.Значение, ЭлементПоиска.Представление + "; " + ЭлементПоиска.Описание);
  КонецЦикла;
  
 КонецЕсли;
 
КонецПроцедуры

Результат уже несколько лучше.

Но если посмотреть на работу стандартного механизма, то увидим, что результат поиска подсвечивается. Было бы замечательно реализовать такое отображение и нашем варианте.

Синтаксис-помощник подсказывает, что представлением элемента списка может выступать как Строка, так и ФорматированнаяСтрока. Ок, это как раз наш вариант. Осталось только выделить результат поиска в описании элемента. Используя метод ПолучитьОтображение можно получить отображение результата полнотекстового поиска в HTML и XML представлениях.

<html>
<head>
    <style type="text/css">
        html { overflow:auto; }
        body { margin: 10px; font-family: Arial,sans-serif; font-size: 10pt; overflow:auto; }
        div.main { overflow:auto; height:100%; }
        div.presentation { font-size: 11pt; }
        div.textPortion { padding-bottom: 16px; }
        span.bold { font-weight: bold; }
        a { text-decoration:none; color:#0066CC; }
        a:hover { text-decoration:underline; }
    </style>
</head>
<body>
    <div class="main">
        <div class="presentation">
            <a id="FullTextSearchListItem" href="#" sel_num="0">Список товаров: Стол журнальный</a>
        </div>
        <div class="textPortion">
            Описание товара: <span class="bold" style="background-color:#CCFFCC">Стекло</span>, дуб, ковка
        </div>
    </div>
</body>
</html>

HTML-представление показалось мне неудобным для разбора, поэтому используем второй вариант. XML-представление дает на выходе объект ЧтениеXML, который в свою очередь передается в ПостроительDOM. Окончательный вариант процедуры:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 
 СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Параметры.СтрокаПоиска, 50);
 СписокПоиска.ОбластьПоиска.Добавить(Метаданные.Справочники.Номенклатура);   
 СписокПоиска.ПерваяЧасть();
 
 Если СписокПоиска.Количество() Тогда
  
  ОписаниеСписка = СписокПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.XML);
  ЧтениеДОМ = Новый ПостроительDOM;
  ПредставлениеСписка = ЧтениеДОМ.Прочитать(ОписаниеСписка);
  СписокПредставлений = ПредставлениеСписка.ПолучитьЭлементыПоИмени("textPortion");
  МассивПредставлений = Новый Массив;
  
  ШрифтВыделения = Новый Шрифт(,,Истина);
  ЦветВыделения = WebЦвета.Зеленый;
  
  Для Каждого ЭлементПредставления Из СписокПредставлений Цикл
   
   МассивФормата = Новый Массив;
   Для Каждого ДочернийУзел Из ЭлементПредставления.ДочерниеУзлы Цикл
    
    Если ДочернийУзел.ТипУзла = ТипУзлаDOM.Текст Тогда
     ШрифтСтроки = Неопределено;     
     ЦветСтроки = Неопределено;
    ИначеЕсли ДочернийУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
     ШрифтСтроки = ШрифтВыделения;
     ЦветСтроки = ЦветВыделения;
    КонецЕсли;
    СтрокаФормата = Новый ФорматированнаяСтрока(ДочернийУзел.ТекстовоеСодержимое, ШрифтСтроки, ЦветСтроки);
    МассивФормата.Добавить(СтрокаФормата);
    
   КонецЦикла;
   
   МассивПредставлений.Добавить(МассивФормата);
   
  КонецЦикла;
   
  ДанныеВыбора = Новый СписокЗначений;
  НомерЭлемента = 0;
  Для Каждого ЭлементПоиска Из СписокПоиска Цикл
   
   НомерЭлемента = НомерЭлемента + 1;   
   Значение = ЭлементПоиска.Значение;
   Если Значение.ЭтоГруппа Тогда
    Продолжить;
   КонецЕсли;
   
   ПредставлениеЭлемента = Новый ФорматированнаяСтрока(ЭлементПоиска.Представление + ", ", МассивПредставлений[НомерЭлемента - 1]);
   ЭлементСписка = ДанныеВыбора.Добавить(ЭлементПоиска.Значение, ПредставлениеЭлемента);
   
  КонецЦикла;
  
 КонецЕсли;
 
КонецПроцедуры

Проверяем, результат получается вполне сносный.

Ввод по строке

При выборе ссылочных данных в 1С есть возможность выбрать элемент справочника или документ набирая ключевые реквизиты объекта который мы хотим найти. Выглядит это следующим образом: пользователь, набирает «масло моторное» в поле ввода с типом «Справочник.Номенклатура»и нажимает ввод. 1С находит все записи которые начинаются с названия «масло моторное» и показывает их в виде выпадающего списка. Такой же ввод возможен и для документов. Это поведение системы можно настроить на закладке «Формы». Там есть поле «Ввод по строке», по умолчанию для справочников указана возможность поиска по коду и наименованию, но туда можно добавить и свои реквизиты, для того, что бы добавить этот реквизит, он должен быть индексирован и реквизит должен быть примитивного типа(строка, дата, число).
FIXME(надо добавить скрин)

Только авторизованные участники могут оставлять комментарии.

1.  Поле для ввода текста по строке и отработка событий в справочнике Склады в 1С 8.3

При работе с управляемой формой важен сервис. Одна из дополнительных возможностей — поле для ввода текста по строке. Если закончить ввод, то сформируется список выбора. Это очень ускоряет ввод данных. Но один нюанс есть: такая возможность поддерживается только для ссылочных полей. На самом деле сервис и возможности гораздо шире. Рассмотрим, как же этот механизм организован. Примеры будут реализованы в конфигурации Управляемое приложение.

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

Справочник Склады: поле для ввода текста по строке

При наборе текста отрабатываются разные события. Это зависит от действий пользователя. Если сделать паузу во время заполнения поля для ввода текста по строке, то будет вызвано событие «Автоподбор». Это же событие будет вызвано, если нажать стрелку вниз.

Часто при разработке сервисов в 1С 8.3 список выбора ограничивается (событие «Начало выбора»). Не надо забывать также ограничивать ввод текста по строке.

Рассмотрим документ «Расход товара». В данном случае отгрузка должна быть только по организации ООО «Товары». Рассмотрим такую реализацию с помощью события «Автоподбор»

При заполнении поля для ввода текста по строке нужно иметь только данную организацию.

Документ Продажа товара

И механизм ее реализации.

Отказ от стандартной обработки в коде события «Автоподбор»

В данном случае в коде происходит отказ от стандартной обработки, а для выбора будет только организация ООО «Товары». Вопрос ограничения выбора решен.

Если же в процессе заполнения поля для ввода текста по строке не делать паузы и, введя часть наименования, нажать Tab или Enter, то будет вызвано событие «Окончание ввода текста». Это событие расширения поля для ввода текста.

В нашем случае для реквизита «Организации» будут выполнены те же действия, что и для предыдущего события. Разница в способе вызова этого события.

Код события «Окончание ввода текста»

С этими событиями разобрались. Они расположены в модуле формы документа 1С. В нашем случае — в модуле формы документа «Расход товара».

Данные события отработали. А следующее событие, которое отработает — это «Обработка получения данных выбора». И особенность его в том, что оно находится в разделе «Модуль менеджера объекта», которое хранится в поле. Для моего примера – это справочник «Организации».

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


Код события «Обработка получения данных выбора»

Для показа возможностей системы рассмотрим пример поступления товара от поставщика на примере документа «Приход товара». Во время заполнения табличной части документа необходимо подбирать товар по конкретному поставщику. И показывать не все товары, а только товары данного поставщика. Для этого есть необходимый реквизит справочника «Товары» — «Поставщик». А в описании реквизита табличной части документа «Товары» — свойство «Связи параметров выбора».

Заполнение табличной части документа в 1С Приход товара: свойство «Связи параметров выбора»

На рисунке настроен отбор по поставщику. При этом при наборе наименования список товара будет ограничен только товаром данного поставщика.

Документ Поступление товара: выбор товара«VekoNT02»

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

Установка свойства для товара в разделе “Параметры выбора”

Теперь проверим в 1С 8.3 список выбора.


Документ «Поступление товара» в 1С 8.3: список выбора

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

А вот теперь вернемся к событию «ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)». Рассмотрим связь описанных свойств параметров выбора и Связи параметров выбора с механизмом формирования данных по строке. Они будут описаны в переменной «Параметры» и будут использованы для формирования в 1С 8.3 списка выбора, если СтандартнаяОбработка = Истина;

Переменная «Параметры»: формирование в 1С 8.3 списка выбора

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

Рассмотрим случай, когда для данного события «ОбработкаПолученияДанныхВыбора» мы не будем пользоваться стандартной обработкой события, а станем формировать данные выбора по алгоритму. Посмотрим описание алгоритма выбора справочника Склады.

Описание алгоритма выбора справочника Склады

При выборе склада, если он не используется, выдается предупреждение, если для склада реквизит «НеИспользовать» установлен в Истину.

Предупреждение при выборе склада

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

2.   Методы для отработки событий и заполнения поля для ввода текста в справочнике Контрагенты в 1С

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

Для события «ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)» в момент вызова обработчика переменная «ДанныеВыбора» не определена. Для более гибкого анализа хотелось бы ее получить. В данном случае речь идет о ссылочных типах. Для такого случая имеется метод «ПолучитьДанныеВыбора». Особенность этого метода в том, что если вызывать его в обработчике «ОбработкаПолученияДанныхВыбора» и не принять дополнительных действий, то может возникнуть бесконечная рекурсия.

Пример использования метода для справочника Контрагенты в 1С 8.3

Метод «ПолучитьДанныеВыбора» в справочнике Контрагенты в 1С 8.3

Как видим, от рекурсии избавиться просто через свойство «Рекурсия». В данном случае только 1 раз этот метод «ПолучитьДанныеВыбора» отработает. Использование метода позволяет воспользоваться стандартным формированием списка выбора, а впоследствии его изменить согласно логике работы алгоритма для конкретного случая.

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

Это событие «Обработка выбора». Оно используется достаточно часто, а поэтому кратко можно сказать, что в нем пользователь уже выбрал какое-то значение. Здесь можно отказаться от выбора и поместить иное значение. Данное событие можно использовать, например, для заполнения поля ввода строкового типа, когда список формируется из элементов справочника, а заполнить нужно их представлением.

Нужно отметить событие «Начало выбора». Оно возникает в поле для ввода текста при нажатии кнопки выбора или клавиши F4. Если переопределить формирование списка выбора при автоподборе или при окончании ввода текста, то необходимо сформировать подобный список и при начале выбора. По факту это будет единый подход в формировании в 1С 8.3 списка выбора.

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

Специалист компании «Кодерлайн»

Евгений Мазай

1С поиск элемента по произвольному полю (при вводе по строке)

В 1С присутствует возможность выбирать справочник из списка элементов, но есть альтернативный способ поиска — начать писать название справочника в поле ввода — этот метод называется ввод по строке (рис. 1).

По умолчанию в 1С, при вводе по строке, поиск возможен по наименованию и коду. В статье описано как расширить этот список.

Рисунок 1 — Поиск по строке

Допустим имеется конфигурация, где есть заказ покупателя, необходимо реализовать поиск номенклатуры по артикулу.

Порядок действий:

  • Для начала надо установить индексацию по артикулу:

Рисунок 2 — Индексация по реквизиту

  • Затем перейти в свойства номенклатуры;
  • В реквизит «ВводПоСтроке» добавить «Артикул»;

Рисунок 3 — Поля ввода по строке

В результате мы за несколько минут, без написания программного кода добавили поиск по артикулу при вводе строки.

Функция СтрНайти()

Число
Позиция первого символа найденной подстроки.

Описание

Функция СтрНайти() находит требуемое вхождение подстроки поиска с начала или с конца исходной строки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0. Если параметр ПодстрокаПоиска является пустой строкой, то возвращается 1. Если оба обязательных параметра являются пустыми строками, возвращается 1.

Доступность

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер), интеграция.

Как найти строки таблицы значений в 1С 8

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

Метод Найти

Метод таблицы значений Найти, предназначен для поиска строки таблицы, содержащей указанное значение. Если строк содержащих значение будет несколько, будет найдена только первая из них. Эту особенность надо учитывать. Поиск осуществляется только на «равно». Синтаксис метода:

В первый параметр передаем значение, которое необходимо найти. Во втором можно через запятую указываем список колонок, в которых необходимо проводить поиск. Также можно не заполнять второй параметр, тогда поиск будет учитывать значения во всех колонках таблицы. В случае успешного поиска, метод вернет строку таблицы значений. В противном случае будет получено Неопределено.

Рассмотрим простой пример. У нас есть таблица значений с колонками: Номенклатура, Количество, Цена, Сумма. Найдем строку, содержащую значение 2 в колонке Количество или в колонке Цена.

После поиска, обязательно делаем проверку на Неопределено. Иначе, в случае не найденной строки, можно получить ошибку.

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

Метод НайтиСтроки

Метод НайтиСтроки предназначен для поиска всех строк таблицы значений, соответствующих указанному отбору. Синтаксис метода:

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

Пример 2. Пусть у нас есть Таблица значений содержащаяся в переменной Таблица, у которой есть колонки Наименование и Код.

Как и в предыдущем методе, изменение значений в найденных строках ведет к изменению значений в таблице. Это не так очевидно, и происходит из-за того, что массив найденных строк содержит ссылки на строки исходной таблицы. Это работает и в обратную сторону. То есть, если вы измените значения в таблице, они изменятся и в найденных строках.

Другие способы найти строки таблицы значений

У рассмотренных методов есть свои недостатки. Основной, поиск только на равенство. Если вам необходимо использовать более сложные конструкции отбора строк, то можно обойти таблицу значений циклом, или передать ее в запрос.

Пример 3. Воспользуемся таблицей из самого первого примера. Обработаем строки, цена в которых находится в интервале от 100 до 1000.

Пример 4. Сделаем тоже самое при помощи запроса.

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

Понравилась статья? Поделить с друзьями:
  • Как добавить свою компанию на яндекс карты
  • Как добиться успеха в строительном бизнесе
  • Как доказать что сайт принадлежит компании
  • Как долго идет перевод денег по реквизитам
  • Как должен выглядеть водитель бизнес такси