Реализация поиска по первым символам в Управляемых формах

19.03.15

Задачи пользователя - Поиск данных

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Поиска по первым символам база + пояснения
.rar 393,48Kb
79 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

 

Краткое описание алгоритма:

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

 

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

 

1) Создаем форму списка

2) У формы списка создаем два реквизита

а) СтрокаПоиска с типом Строка

б) ВыборкаПоОбъект с типом таблица значений

3)На форме списка размещаем реквизит формы "СтрокаПоиска" в поле ввода и назначаем горячую клавишу "Ctrl+S".

 

4) Создаем две команды формы Вперед и Назад, размещаем их на форме списка. Командам назначаем обработчики.

5)В объекте, в нашем случае в номенклатуре создаем СКД с помощью которой будет формироваться список объектов по которым будет ходить курсор поиска. В СКД пишем запрос так что бы потом представлялось возможным открыть его в конструкторе запроса, а в коде заменить определенные подстроки и получить запрос к исполнению. А именно в время поиска важна Сортировка в списке объектов и то в какая ячейка сейчас выделена (по ней искать и нужно).

К примеру запрос

  ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Родитель,
Номенклатура.ОсновнойПоставщик.Наименование КАК ОсновнойПоставщик,
Номенклатура.Наименование
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаНоменклатуры.Ссылка,
ТаблицаНоменклатуры.Родитель,
ТаблицаНоменклатуры.ОсновнойПоставщик,
ТаблицаНоменклатуры.Наименование
ИЗ
ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
(
&актинаяЯчйка ПОДОБНО &СтрокаПоиска
ИЛИ ТаблицаНоменклатуры.Ссылка = &Ссылка)

УПОРЯДОЧИТЬ ПО
&ПараметрУПР

  

В этом запросе потом меняем

 


ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;

ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);

СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;

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

 

5) программно переносим отборы настроенные в динамическом списке в нашу СКД поиска (этого пока не реализовано в примере, если будет актуально хотя бы нескольким пользователям то можно и доработать).

               

6) Так же в настройках СКД предусмотрительно добавляем возможные отборы, для иерархического справочника это будет Родитель элемента.

 

В случае если поиск в иерархическом справочнике, и отображение не списком то будет заполнять отбор

 

Если ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;

КонецЕсли;

 7) У элемента формы СПИСОК создаем событие "СписокПриАктивизацииЯчейки" в нем прописываем заполнение переменой "АктинаяЯчейка" объявленной в модуле формы:


&НаКлиенте
Перем АктинаяЯчейка;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
АктинаяЯчейка=Элемент.ТекущийЭлемент.Имя;
КонецПроцедуры

8) У поля ввода "СтрокаПоиска" (пункт 3), создаем обработчик события "АвтоПодбор", в нем прописываем:

 &НаКлиенте

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

ПараметрыПоиска=ФормированиеСтруктурыПоиска();
ПоискПодобноНаСервер(ПараметрыПоиска);

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

 

9)В обработчиках команд форм "ВПЕРЕД" и "НАЗАД"  пишем

 

 &НаКлиенте

Процедура Вперед(Команда)

СтрокаДокумента=КонтрлоьПеремещения();

НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;

Если
ВыборкаПоОбъект.Количество() > НомерТекущегоДокумента Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;

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

&НаКлиенте
Процедура Назад(Команда)

СтрокаДокумента=КонтрлоьПеремещения();

НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;

Если
НомерТекущегоДокумента-2 >=0 Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента-2].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;



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

10) Пишем вспомогательные процедуры

 &НаКлиенте

Функция ФормированиеСтруктурыПоиска()

ПараметрыПоиска=Новый Структура;
ПараметрыПоиска.Вставить("Порядок",Строка(ЭтаФорма.Список.Порядок));
ПараметрыПоиска.Вставить("Ссылка",Элементы.Список.ТекущаяСтрока);
ПараметрыПоиска.Вставить("АктинаяЯчейка",АктинаяЯчейка);
ПараметрыПоиска.Вставить("СтрокаПоиска",Элементы.СтрокаПоиска.ТекстРедактирования);
ПараметрыПоиска.Вставить("Отображение",Строка(Элементы.Список.Отображение));
Возврат
ПараметрыПоиска;

КонецФункции
// ()

&НаСервереБезКонтекста
Функция ПоискПодобно(ПараметрыПоиска)

Порядок=ПараметрыПоиска.Порядок;
АктинаяЯчейка=ПараметрыПоиска.АктинаяЯчейка;
ССылка=ПараметрыПоиска.ССылка;
СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска+"%";

СхемаКомпановкиДанныхР=Справочники.Номенклатура.ПолучитьМакет("Поиск");
ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);
СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;
КомпновщиеНастроекР=Новый КомпоновщикНастроекКомпоновкиДанных;
КомпновщиеНастроекР.ЗагрузитьНастройки(СхемаКомпановкиДанныхР.НастройкиПоУмолчанию);

НастройкиР=КомпновщиеНастроекР.Настройки;
НастройкиР.ПараметрыДанных.Элементы[0].Значение=СтрокаПоиска;
НастройкиР.ПараметрыДанных.Элементы[1].Значение=ССылка;
если
ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;

КонецЕсли;
КомпоновщикМакетаР=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиР=КомпоновщикМакетаР.Выполнить(СхемаКомпановкиДанныхР,НастройкиР, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновкиДанныхР=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанныхР.Инициализировать(МакетКомпоновкиР);

ПроцессорВыводВКолецкцию=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ВыборкаПоОбъект = Новый ТаблицаЗначений;

ПроцессорВыводВКолецкцию.УстановитьОбъект(ВыборкаПоОбъект);
ПроцессорВыводВКолецкцию.Вывести(ПроцессорКомпоновкиДанныхР);


Возврат
ВыборкаПоОбъект;



КонецФункции
// ПоискПодобно()

&НаСервере
Процедура ПоискПодобноНаСервер(ПараметрыПоиска)
табл=ПоискПодобно(ПараметрыПоиска);
Если
ТипЗнч(табл)=ТИп("ТаблицаЗначений") тогда
ЗначениеВРеквизитФормы(табл,"ВыборкаПоОбъект");
ЭтаФорма.СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска;
КонецЕсли;
КонецПроцедуры

Infostart MagicInput

Улучшенный поиск по строке в 1С: находит объекты по любой части названия и нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает статусы прямо в списке подбора. Помогает быстрее находить нужные элементы, сокращает ошибки при вводе и подключается как готовое расширение для 1С 8.3/8.5 — без доработок.


Вступайте в нашу телеграмм-группу Инфостарт

См. также

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

6000 руб.

25.02.2026    3967    13    1    

18

Файловый обмен (TXT, XML, DBF), FTP Поиск данных Инструменты администратора БД Корректировка данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная обработка позволит Вам легко и просто, а главное - быстро, выполнить сравнение данных между ЛЮБЫМИ базами (и РИБ, по правилам конвертаций) по контрольным суммам выбранных объектов баз 1С, работающих на платформах 8.3 и выше. Удобный и понятный интерфейс в виде "мастера". Высокая скорость сравнения достигается за счет специального алгоритма расчета контрольной суммы объекта/записи и сравнения по данным суммам объектов 2х баз через файл. Имеется возможность выбора реквизитов, по которым система будет сравнивать объекты. Сравнение количества записей в движениях документов, возможность сравнивать данные по правилам конвертации и не только! Выбор объектов конфигурации для КАЖДОГО узла в отдельности с индивидуальным отбором для каждого объекта конфигурации, работа с FTP, сохранение или загрузка настроек, сохранение или загрузка результата сравнения, регистрация на обмен объекта и его движений. (Обновление от 12.11.2024, версия 2.2-2.5)

24400 руб.

27.10.2017    46163    32    13    

49

Поиск данных Системный администратор Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

13420 руб.

14.05.2012    170036    358    253    

589

Поиск данных Программист Пользователь 1С 8.3 1С:Управление торговлей 11 1С:Библиотека стандартных подсистем Абонемент ($m)

Умное сравнение табличных документов с визуальной подсветкой. В отличие от стандартного сравнения, обработка ищет отличия по ключевому значению, игнорируя сдвиги строк. Результат — цветовая маркировка добавленных, удаленных и измененных строк прямо в документе + точный лог расхождений по каждой ячейке.

1 стартмани

27.04.2026    869    10    war41k    5    

16

Поиск данных Нейросети Программист Бесплатно (free)

Практический кейс исследовательской разработки (R&D) с использованием искусственного интеллекта и нейросетей в 1С для поиска по прайсам поставщиков. Рассматривается гибридный поиск (Hybrid Search: векторный + полнотекстовый), позволяющий находить товары по смыслу, а не по буквам — даже при сленге, опечатках и разном написании. Решение работает полностью локально, без облаков, и интегрируется с 1С.

14.01.2026    2789    Prepod2003    14    

13

Информационная безопасность Поиск данных ServiceDesk, HelpDesk Журналы и реестры данных 1С 8.3 Россия Бухгалтерский учет Бюджетный учет Налоговый учет Управленческий учет Платные (руб)

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

180000 руб.

05.09.2025    4778    1    1    

3

Поиск данных 1С:Предприятие 8 1С:Библиотека стандартных подсистем Абонемент ($m)

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

2 стартмани

18.08.2025    7869    38    sapervodichka    14    

77
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sytkosa 119 21.08.12 11:10 Сейчас в теме
(0) На второй картинке ошибка в тексте
2. seermak 664 21.08.12 13:49 Сейчас в теме
&НаКлиенте
Процедура ПоискАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПоискАвтоПодбор_Сервер(ВРег(Текст));
КонецПроцедуры

&НаСервере
Процедура ПоискАвтоПодбор_Сервер(Знач СтрокаСравнения)
УдалитьОтборУСписокЗначений(СписокДанных.Отбор, Новый ПолеКомпоновкиДанных("Литера"));
ЗаполнитьСписокЗначений(СписокДанных.Отбор, Новый ПолеКомпоновкиДанных("СтрокаПодбора"), СтрокаСравнения, ВидСравненияКомпоновкиДанных.Содержит);
КонецПроцедуры


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

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

Для Каждого ЭлементОтбора Из МассивОтборов Цикл
ЭлементыОтбора.Удалить(ЭлементОтбора);
КонецЦикла;
КонецПроцедуры

на и не мучайся, вот еще в реквизитах поля поиска - обновление текста редактирования = не использовать
user881571; +1 Ответить
3. Rudakov_D 239 22.08.12 05:34 Сейчас в теме
(2) дополню в выходные :)
4. Stamper 45 22.08.12 10:50 Сейчас в теме
помню, пытались мы как-то внедрить веб-расширение для 1С 8.0
так вот там автоподбор вариантов выбора просто жутко тормозило. и это понятно, т.к. нужно было прокачивать дополнительную информацию.
как я понимаю, по причинам производительности и исключили эту "фичу" из управляемого (который потенциально будет веб-) интерфейса.
как с производительностью у этого решения?
отдельная благодарность будет автору за запись видеоролика какого-нибудь.
p.s. плюсанул
5. Rudakov_D 239 22.08.12 10:59 Сейчас в теме
(4)
1) У меня пока нет заказчиков мест тестирования этого алгоритма на реальных данных, подумаю разместить демо базу с УФ где нибудь и посмотрю как работает... однако когда время выделить и для этого пока не знаю...

2) Какой видеоролик хотите ? По написанию?

3) Думаю это все таки решение преимущественно для толстых клиентов, у меня уже есть заказчики которые хотят в одной колонке видеть разные реквизиты, а это можно реализовать только динамическим списком, и поиск хотят тоже иметь.
8. Stamper 45 22.08.12 11:46 Сейчас в теме
(5)ролик, в котором можно было бы оценить быстродействие. чтоб было ясно, похоже на работу в толстом клиенте, или нет
6. petrov_al 10 22.08.12 11:04 Сейчас в теме
Автор, все гораздо проще, не изобретай велосипед...смотри продвинутый курс гилева 1с8.2 а особенно события.
7. Rudakov_D 239 22.08.12 11:17 Сейчас в теме
(6) что конкретно, по вашему мнению, не правильно? (как-нибудь пересмотрю)
9. bulpi 218 22.08.12 13:16 Сейчас в теме
1)Поиск по первым символам в обычных формах работает все же не так.
2)Молодец, что хоть это сделал. Но нюхом чую, что должно быть проще.
3)Без обид : Не работай там , где нужно что-то объяснять - учитель, репетитор. Не твое это :)
10. SergDi 22.08.12 19:03 Сейчас в теме
давайте вставлю свои 5 копеек по поводу поиска по подстроке...

в модуле менеджера справочника номенклатуры пишешь код в процедуре ОбработкаПолученияДанныхВыбора(), например такой код:


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

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

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

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


СтандартнаяОбработка = Ложь;

КонецПроцедуры
Для отправки сообщения требуется регистрация/авторизация