Динамическая фильтрация в справочнике при вводе наименования
Разработка - Механизмы платформы 1С
Предлагаю способ, наверное уже избитый, но в поиске не нашел.
Смысл решения, практически тоже самое что предложено Ёпрст. На практике это использую почти год.
Фильтрация происходит по набранным символам разделенных пробелами. Сортировка происходит по первому набору символов (до пробела)
Требования: 1С++
Версия: SQL (с DBF сто лет не работал, наверное что-то нужно поменять :) )
Ограничения. Если установлен отбор из диалога 1С, фильтрация не работает (скорее всего я не разобрался как программно снимать отбор, надеюсь в комментах подскажут)
Код приведенный ниже, добавить в нужную форму.
У меня в ГМ при начале работы системы присвоена глРС = СоздатьОбъект("ODBCRecord");
и глСтрокаРазрешенныхСимволов = " .,-+*/\_0123456789абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz";
Их необходимо создать и объявить для работы данного алгоритма.
Перем СтрокаСимволов;
Перем ТекФлагИерархическогоСписка;
Перем СпЗн;
Перем ОтборУстановлен;
Процедура ПриУстановкеОтбора(ТипОтбора,ЗначениеОтбора)
ОтборУстановлен = ТипОтбора;
КонецПроцедуры
Функция ПолучитьСписокЭлементов(ВидСправочника, СтрокаСимволов)
СтрДляПозиции = СтрокаСимволов;
Пробел = Найти(СтрДляПозиции," ");
Если Пробел>0 Тогда
СтрДляПозиции = Лев(СтрДляПозиции,Пробел-1);
КонецЕсли;
ТекстЗапроса = "
|SELECT ID [Ссылка $Справочник."+ВидСправочника+"]
| , case when CHARINDEX ('"+СтрДляПозиции+"', "+ВидСправочника+".DESCR)=0 then 999 else CHARINDEX ('"+СтрДляПозиции+"', "+ВидСправочника+".DESCR) end ПозицияВСтроке
|FROM $Справочник."+ВидСправочника+" AS "+ВидСправочника+" With (NOLOCK)
|WHERE ("+ВидСправочника+".ISFOLDER >= 0)
|";
Если ПустаяСтрока(СтрокаСимволов)=0 Тогда
СтрДляЗапроса = "
|AND ("+ВидСправочника+".DESCR LIKE '%"+СтрЗаменить(СтрокаСимволов," ","%') AND ("+ВидСправочника+".DESCR LIKE '%");
СтрДляЗапроса = СтрДляЗапроса + "%')
|";
ТекстЗапроса=ТекстЗапроса+СтрДляЗапроса;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|ORDER BY ПозицияВСтроке, "+ВидСправочника+".DESCR
|";
глРС.ВыполнитьИнструкцию(ТекстЗапроса, СпЗн);
Возврат СпЗн;
КонецФункции
Процедура ПриНажатииКнопкиКлавиатуры(_код, _а, _ш, _к, _симв, ФСО)
Если Лев(Форма.ТекущаяКолонка(),12)="Наименование" Тогда
Если ПустоеЗначение(ОтборУстановлен)=0 Тогда
УстановитьОтбор("","");
Возврат;
КонецЕсли;
Если (_а=1) или (_ш=1) или (_к=1) Тогда
ФСО=1;
Возврат;
КонецЕсли;
Если _код = 27 Тогда
Если СтрокаСимволов="" Тогда
Фсо = 1;
Возврат;
КонецЕсли;
КурсорНаЭлементе = ТекущийЭлемент();
СтрокаСимволов = "";
Форма.Наименование.Заголовок("Наименование");
СпЗн.УдалитьВсе();
ИспользоватьСписокЭлементов();
ИерархическийСписок(ТекФлагИерархическогоСписка,1);
Попытка
АктивизироватьОбъект(КурсорНаЭлементе);
Исключение
КонецПопытки;
ФСО = 1;
Возврат;
ИначеЕсли _код = 8 Тогда
СтрокаСимволов = Лев(СтрокаСимволов, СтрДлина(СтрокаСимволов)-1);
ИначеЕсли _симв="" Тогда
ФСО = 1;
Возврат;
ИначеЕсли Найти(глСтрокаРазрешенныхСимволов, Нрег(_симв))>0 Тогда
СтрокаСимволов = СтрокаСимволов + _симв;
Иначе
ФСО = 1;
Возврат;
КонецЕсли;
Форма.Наименование.Заголовок("Наименование ("+СтрокаСимволов+")");
СпЗн = ПолучитьСписокЭлементов("Номенклатура", СтрокаСимволов);
ИспользоватьСписокЭлементов(СпЗн);
ИерархическийСписок(0,0);
ФСО = 0;
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
ТекФлагИерархическогоСписка = ВосстановитьЗначение("ТекФлагИерархическогоСпискаНоменклатура");
СтрокаСимволов = "";
СпЗн = СоздатьОбъект("СписокЗначений");
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
ТекФлагИерархическогоСписка = Способ;
КонецПроцедуры
Процедура ПриЗакрытии()
СохранитьЗначение("ТекФлагИерархическогоСпискаНоменклатура",ТекФлагИерархическогоСписка);
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 1C77 Бесплатно (free)
В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.
28.11.2021 4477 user707242_Gold_karas 22
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 Абонемент ($m)
Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.
1 стартмани
06.10.2018 10241 Vortigaunt 5
Механизмы платформы 1С Разработчик Оперативный учет 7.7 Абонемент ($m)
Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.
1 стартмани
16.05.2018 13284 Vortigaunt 26
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Бесплатно (free)
Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)
27.01.2016 102637 Serginio 116
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».
1 стартмани
18.11.2014 47722 100 kitminsk 18
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 1C77 Бесплатно (free)
Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?
24.07.2014 26638 tomvlad 5
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 Бесплатно (free)
Чтение строк файла CSV в список значений с помощью метода ИзСтрокиСРазделителями
04.04.2013 24125 ivisor_fil 11
Механизмы платформы 1С Разработчик 1С:Предприятие 7.7 1C77 Россия Абонемент ($m)
Описание принципов и набор инструментов для работы с двоичными данными в 1С 7.7. Примеры во вложениях.
1 стартмани
16.05.2012 34526 101 dusha0020 8
1.глСтрокаРазрешенныхСимволов - это что за зверь такой ?
2. не видно вводимых символов на форме (лучше уж тогда через ДобавитьАтрибут добавлять поле, как у A'Dirks-а)
3. запрос, на сколько я понял выполняется при каждом нажатии на кнопку клавиатуры, если это не эескейп, бекспейс ?
це-же медленно на большом спраочнике, лучше или начиная с 3-4 символа, или задержку втыкаить, как в софтпоинте сделали
1. упустил
глСтрокаРазрешенныхСимволов = " .,-+*/\_0123456789абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmn
набор символов по которым можно выполнять отбор.
2. видно, они набираются в поле "Наименование"
3. на справочнике более чем 5к элементов, примлемо. Действительно думал, чтобы начать фильтрацию с 3 символа, но пришел к выводу, что лучше с первого.
Разве что, при наборе первого символа искать не все вхождения а именно только те у которыех он первый, но тут будут не очень нормальные варианты с ё, й, ы, ь, ъ.
(8)
спасибо, так пробовал, вываливалось с ошибкой, а вот УстановитьОтбор("",""); только сейчас предположил и получилось, хотя второй параметр и написано что необязательный.
изменил в коде и описание.
>> привыкли так ужо. - привычка дело может быть навязанной, причем в данном случае 1С :)
Процедура ПриОткрытии()
ТекФлагИерархическогоСписка = ВосстановитьЗначение("ТекФлагИерархическогоСпискаНоменклатура");
вот тут болт, ибо нет еще сохраненного "ТекФлагИерархическогоСпискаНоменклатура" при открытии при первом открытии, да и при закрытии сохранять нечего, если иерархию не меняли.
Это.. при нажатии Эскейп, нужно проверить, если строка символов не пустая (или было уже нажатия и потом удалили символы, короче, что уже есть использоватьсписокэлементов), то ФСО нужно делать = 0, а не 1, иначе справочник закроется.
|select id as [Элем $Справочник.Номенклатура]
|,iif(at('туф',lower(descr))=0,999,at('туф',lower(descr))) as вася
|from $Справочник.Номенклатура спр
|where
|(lower(descr) like '%туф%')
|and
|(lower(descr) like '%жен%')
|order by вася Показать СтрСоединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Exclusive=Yes;Mode=ReadWrite;Collating Sequence=MACHINE";
ДБ = СоздатьОбъект("OLEDBData");
Рез = ДБ.Соединение(СтрСоединение);
лЗапросФокс = ДБ.СоздатьКоманду();
лЗапросФокс.Выполнить("EXECSCRIPT('SET ANSI OFF')");
лЗапросФокс.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
лЗапросФокс.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
лЗапросФокс.Отладка(1);ТекстЗапроса:
SELECT
ID [Ссылка $Справочник.Номенклатура],
iif(at('в',lower(Номенклатура.DESCR))=0,999,at('в',lower(Номенклатура.DESCR))) AS ПозицияВСтроке
FROM
Справочник.Номенклатура AS Номенклатура
WHERE
(Номенклатура.ISFOLDER >= 0)
AND (lower(Номенклатура.DESCR) LIKE '%в%')
ORDER BY ПозицияВСтроке,Номенклатура.DESCR
ПоказатьлТЗ=лЗапросФокс.ВыполнитьИнструкцию(ТекстЗапроса);
{Справочник.Номенклатура.ФормаСписка.Основная.Модуль(101)}: FAILED! ICommandText::Execute(): Too many arguments.
Где засада?
Только стоит все-таки наверно с третьего символа начинать фильтровать ?
и еще: для Esc при НЕпустой СтрокаСимволов надо ФСО=0 - а то форма выбора закрывается (30)
Тоже не совсем логично может получиться.
В качестве идеи для обсуждения. Сделать как в поисковиках.
При открытии выдавать пустой справочник, при наборе выводить то что нашлось скажем TOP 20 пока не наберет больше 3х символов. Как больше трех набрал выводит все.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 141953
Создание 02.07.12 13:20
Обновление 04.07.12 15:45
Просмотры 21504
Загрузки 0
Рейтинг
16
Комментарии 62
Код открыт Не указано
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 7.7
Конфигурация 1C77
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)