SkillAgentSearch skills...

Fzy

Нечеткий поиск по коллекциям 1С

Install / Use

/learn @Nivanchenko/Fzy
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

fzy

Данная библиотека - реализация алгоритма (https://github.com/jhawthorn/fzy) перенесенная на OneScript.

Позволяет осуществлять нечеткий поиск по коллекциям 1С, таким как Массив, Структура, Соответствие, ТаблицаЗначений.

Установка

opm install fzy

Подключение:

#Использовать fzy

Описание и примеры

Пример:

#Использовать fzy

Массив = Новый Массив();
Массив.Добавить("app/models/user.rb");
Массив.Добавить("app/models/customer.rc");
Массив.Добавить("app/models/block.rc");

Поиск = Новый Поиск(Массив); // Создание поиска

Результат = Поиск.НайтиЗначенияИлиКлючи("amuser", 1); // Осуществление поиска, и получение результат

Функция "НайтиЗначенияИлиКлючи" имеет следующие параметры:

  • Значение, которое будем искать. Тип Строка.
  • Количество (по умолчанию 0). Отвечает за возвращаемый результат. Если задать 0, будет возвращен массив со всеми совпадениями. Если 1, то будет возвращено самое близкое значение. Если число больше 1, будет возвращен массив указанного размера, если результатов совпадений больше. Тип Число;
  • Ключи (по умолчанию Ложь). Если истина, возвращаются не значения, а ключи соответствующие первоначальной коллекции. Тип Булево.

Тип возвращаемых ключей по коллекциям

| Коллекция | Возвращаемый ключ | | - | - | | Массив | Индекс элемента | | Структура | Ключ | | Соответствие | Ключ | | Таблица значений | Строка таблицы значений |

Процедура "ЗагрузитьДанные" Имеет следующие параметры

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

Интерактивный поиск в консоли

Дополнительно есть класс для выполнения интерактивного поиска.

#Использовать fzy

Поиск = Новый Поиск();
Поиск.ЗагрузитьДанные(Массив);
ИнтерактивныйПоиск = Новый ИнтерактивныйПоиск(Поиск);
РезультатЗначение = ИнтерактивныйПоиск.НачатьВыбор();

В конструктор которого нужно передать объект "поиск" с подготовленными данными.

Главная функция "НачатьВыбор", имеет два параметра:

  • Ключи(Тип булево), который влияет на возвращаемые значения так же как в НайтиЗначенияИлиКлючи. Возвращаемое значение всегда одно.
  • ТекстПодсказки(Тип строка), выведет текст, подсказывающий пользователю, что нужно искать.

interactivni_piosk

Управление:

| Кнопка | Действие | | - | - | | ESC | Отмена выбора. Вернет неопределено | | Tab | Переключить на поиск в найденном | | Enter | Выбор текущего элемента | | Стрелка вверх | Курсор вверх | | Стрелка вниз | Курсор вниз | | Стрелка влево | Курсор в самый верх(последний элемент) | | Стрелка вправо | Курсор в самый низ(первый элемент) | | Любая другая | В режиме выбора переходит в режим ввода. |

Интерактивный поиск работает в двух режимах.

  • Первый это ввод значений для поиска.
  • Второй выбор варианта, переключения режима поиска.

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

Этот метод можно применять например для:

  • Интерактивного переключения веток репозитория из скрипта
#Использовать fzy
#Использовать gitrunner

ГитРепозиторий = Новый ГитРепозиторий();
ГитРепозиторий.УстановитьРабочийКаталог("/home/nick/tmp/TestRepoDir");
ТЗВеток = ГитРепозиторий.ПолучитьСписокВеток();

Поиск = Новый Поиск(ТЗВеток, "Имя");
ИнтерактивныйПоиск = Новый ИнтерактивныйПоиск(Поиск, "Начните ввод имени ветки");
ВыбранноеЗначение = ИнтерактивныйПоиск.НачатьВыбор(Истина);

ГитРепозиторий.ПерейтиВВетку(ВыбранноеЗначение.Имя);
Сообщить("Переключились на ветку " + ВыбранноеЗначение.Имя);

perekluchenie_vetok

  • Выбор файлов для скачивания с интернета
#Использовать fzy
#Использовать 1connector

// допустим хочу прочитать из интеренета страницу, выбрать нужный файл и скачать
// смотреть будем эту страницу http://mirror.corbina.net/debian/

Урл = "http://mirror.corbina.net/debian/";

Результат = КоннекторHTTP.Get(Урл).Текст();

СсылкиДляСкачивания = Новый Соответствие();

Для каждого ТекСтрока Из СтрРазделить(Результат, Символы.ПС) Цикл
	Если СтрНачинаетсяС(ТекСтрока, "<a href=") Тогда
		ЧастиСсылки = СтрРазделить(ТекСтрока, """");
		Если не СтрЗаканчиваетсяНа(ЧастиСсылки[1], "/") Тогда
			СсылкиДляСкачивания.Вставить(Урл+ЧастиСсылки[1], Сред(СтрРазделить(ЧастиСсылки[2],"<")[0],2));
		КонецЕсли
	КонецЕсли;
КонецЦикла;

Поиск = Новый Поиск(СсылкиДляСкачивания);
ИнтерактивныйПоиск = Новый ИнтерактивныйПоиск(Поиск, "Начните ввод имени файла");
ВыбранноеЗначение = ИнтерактивныйПоиск.НачатьВыбор(Истина);

// Представим, что мы тут качаем файл.
Сообщить(СтрШаблон("Выбран файл для скачивания %1", ВыбранноеЗначение));

interactivni_piosk_file

  • Поиск и выбор файлов на диске
  • И многие другие варианты выбора.

Подробно смотрите примеры и тесты.

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

Related Skills

View on GitHub
GitHub Stars17
CategoryDevelopment
Updated13d ago
Forks1

Languages

1C Enterprise

Security Score

75/100

Audited on Mar 19, 2026

No findings