На досуге [Как запросом по строке Танk001 найти Tanк001 в 1С]

1. ZhokhovM 724 18.03.16 12:41 Сейчас в теме
Как запросом по строке Танk001 найти Tanк001 в 1С?

Есть такой запрос, но будет работать долго:
Выбор
Когда &Текст = ПОДСТРОКА(&Текст,1,2) Тогда
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,1,1)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,1,2)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,2,1)
иначе выбор Когда &Текст = ПОДСТРОКА(&Текст,1,3) Тогда
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,1,1)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,1,2)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,1,3)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,2,1)
    или
    Наименование ПОДОБНО ПОДСТРОКА(&Текст,2,2)
иначе выбор Когда &Текст = ПОДСТРОКА(&Текст,1,4) Тогда
...
Конец
КОнец
Показать


Если есть у кого идеи, предлагайте.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. ipoloskov 162 18.03.16 12:55 Сейчас в теме
Собрать во временную таблицу, привести к одному регистру и алфавиту (наверное, лучше к русскому), искать.
Если такой поиск нужен постоянно, то добавить реквизит в справочник, заполнять его при записи, искать по нему.
3. ZhokhovM 724 18.03.16 13:01 Сейчас в теме
(2)>Если такой поиск нужен постоянно, то добавить реквизит в справочник, заполнять его при записи, искать по нему.
не подойдет, т.к. не реально для каждого реквизита, участвующему в поиске, второй реквизит добавлять.
>Собрать во временную таблицу, привести к одному регистру и алфавиту (наверное, лучше к русскому), искать.
тоже не подойдет. Это что сначала весь справочник номенклатуры во временную таблицу загонять?
4. ipoloskov 162 18.03.16 13:02 Сейчас в теме
(3) ZhokhovM, их так много? Наименование, что еще?
7. ZhokhovM 724 18.03.16 13:32 Сейчас в теме
(4) ipoloskov, да, реквизитов много: артикул, код, маркировка и т.д.
12. ipoloskov 162 18.03.16 14:18 Сейчас в теме
(7) ZhokhovM,
сделать регистр сведений
Измерения:
Поле (Строка(20))
Объект (СправочникСсылка.Номенклатура)
Ресурс: ПриведенноеЗначение (Строка(150)), индексировать=да (бесконечной длины делать нельзя, чтобы можно было сделать индексирование по полю)
Опишите набор полей для транслитерации (Наименование, НаименованиеПолное, Артикул и т.д.), и заполняйте при записи регистр по этим полям.
Поиск делайте по регистру.

Это если по-рабочекрестьянски. А по-грамотному, можно заполнять ПриведенноеЗначение хэш-функцией от транслитерированной строки, и искать также хэш-функцию.
Все будет летать.
IvanSusanin; +1 Ответить
13. ZhokhovM 724 18.03.16 14:29 Сейчас в теме
5. Perrojka 18.03.16 13:07 Сейчас в теме
(3) ZhokhovM, А сделать соответствие симполов, приводить в вт к одному варианту и искать?
6. ildarovich 7850 18.03.16 13:27 Сейчас в теме
Если таблица транслитерации содержит соответствия буква <> буква, то запрос простой: сначала нужно "развернуть" каждое слово по буквам(соединением с таблицей чисел 1-256), получив таблицу <НомерБуквыВСлове, РусскаяБуква, АнглийскаяБуква>, затем соединить с таблицей соответствия <РусскаяБуква, АнглийскаяБуква> и посчитать число совпадений в каждом слове, отобрав ИМЕЮЩИЕ число совпадений равно числу букв или что-то наподобие. Если транслитерация настоящая, то придется строить итоговую английскую строку после транслитерации, например, методом из Агрегатное суммирование строк в запросе – сложно, но не невозможно.
8. ZhokhovM 724 18.03.16 13:47 Сейчас в теме
(6) ildarovich, Ударная вешь "представляет больше спортивный, чем практический интерес".
Самое печальное в том, что запрос будет работать не используя индексы, а обычным перебором строк. Соответственно, он будет выполняться очень медленно. Поэтому нам это не подойдет.
15. ildarovich 7850 19.03.16 23:43 Сейчас в теме
(8) ZhokhovM, что-то вы не поняли. Идея в том, чтобы для каждого русского наименования очень быстро (разворот, транслитерация, конкатенация) получить наименование в транслитерации, а затем ПО ИНДЕКСУ найти соответствие.
Получается, что соответствие букв не один в один, а одной русской букве могут соответствовать две-три английских? (я-ya) Есть таблица транслитерации? Сколько букв максимум в одном наименовании?
16. ZhokhovM 724 22.03.16 09:20 Сейчас в теме
17. ildarovich 7850 22.03.16 18:08 Сейчас в теме
(16) ZhokhovM, вот текст запроса, построенный на идее статьи Агрегатное суммирование строк в запросе – сложно, но не невозможно. В запросе производятся необходимые преобразования. То есть берется таблица Дано с кириллическими наименованиями, транслитируется по таблице ISO9 в наименования латинницей и соединяется с таблицей поиска. Определяется ключ связи (номер строки в таблице поиска). Расчет на строки длиной до 256.
ВЫБРАТЬ
	Дано.НомерСтроки,
	Дано.Наименование
ПОМЕСТИТЬ ДаноКириллица
ИЗ
	&ДаноКириллица КАК Дано
;
ВЫБРАТЬ
	"" "" КАК Буква,
	&СимволНПП КАК Замена
ПОМЕСТИТЬ ГОСТ79_2000

ОБЪЕДИНИТЬ ВЫБРАТЬ ""а"", ""a"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""б"", ""b"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""в"", ""v"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""г"", ""g"" 
ОБЪЕДИНИТЬ ВЫБРАТЬ ""д"", ""d"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""е"", ""e"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""ё"", ""yo""ОБЪЕДИНИТЬ ВЫБРАТЬ ""ж"", ""zh""
ОБЪЕДИНИТЬ ВЫБРАТЬ ""з"", ""z"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""и"", ""i"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""й"", ""j"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""к"", ""k""
ОБЪЕДИНИТЬ ВЫБРАТЬ ""л"", ""l"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""м"", ""m"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""н"", ""n"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""о"", ""o""
ОБЪЕДИНИТЬ ВЫБРАТЬ ""п"", ""p"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""р"", ""r"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""с"", ""s"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""т"", ""t"" 
ОБЪЕДИНИТЬ ВЫБРАТЬ ""у"", ""u"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""ф"", ""f"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""х"", ""x"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""ц"", ""cz""
ОБЪЕДИНИТЬ ВЫБРАТЬ ""ч"", ""ch""ОБЪЕДИНИТЬ ВЫБРАТЬ	""ш"", ""sh""ОБЪЕДИНИТЬ ВЫБРАТЬ ""щ"",""shh""ОБЪЕДИНИТЬ ВЫБРАТЬ ""ъ"", """"
ОБЪЕДИНИТЬ ВЫБРАТЬ ""ы"",""y""  ОБЪЕДИНИТЬ ВЫБРАТЬ	""ь"", """"  ОБЪЕДИНИТЬ ВЫБРАТЬ ""э"", ""e"" ОБЪЕДИНИТЬ ВЫБРАТЬ ""ю"", ""yu""
ОБЪЕДИНИТЬ ВЫБРАТЬ ""я"",""ya""

ИНДЕКСИРОВАТЬ ПО
	Буква
;
ВЫБРАТЬ
	0 КАК Х
ПОМЕСТИТЬ ЦИФРЫ

ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9
;
ВЫБРАТЬ
	А.Х * 10 + Б.Х + 1 КАК Х
ПОМЕСТИТЬ Числа
ИЗ
	ЦИФРЫ КАК А,
	ЦИФРЫ КАК Б
;
ВЫБРАТЬ
	Дано.НомерСтроки КАК ж,
	Числа.Х КАК ё,
	ЕСТЬNULL(ГОСТ.Замена, ПОДСТРОКА(Дано.Наименование, Числа.Х, 1)) КАК а
ПОМЕСТИТЬ Таб
ИЗ
	ДаноКириллица КАК Дано
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Числа КАК Числа
		ПО (ПОДСТРОКА(Дано.Наименование, Числа.Х, 1) + ""!"" <> ""!"")
		ЛЕВОЕ СОЕДИНЕНИЕ ГОСТ79_2000 КАК ГОСТ
		ПО (ПОДСТРОКА(Дано.Наименование, Числа.Х, 1) = ГОСТ.Буква)
;
ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ ж, ВЫРАЗИТЬ(ё / 2 КАК ЧИСЛО(15, 0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб КАК Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ ж, е ё, МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА а ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР е * 2 - ё КОГДА 1 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

ВЫБРАТЬ
	Дано.НомерСтроки,
	Дано.Наименование КАК Наименование
ПОМЕСТИТЬ ДаноЛатинница
ИЗ
	&ДаноЛатинница КАК Дано

ИНДЕКСИРОВАТЬ ПО
	Наименование
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Таб.ж КАК НомерСтроки,
   ДаноКириллица.Наименование КАК Кириллица,
	Таб.а КАК Латинница,
   ДаноЛатинница.НомерСтроки КАК КлючСвязи
ИЗ
	Таб КАК Таб 
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДаноКириллица КАК ДаноКириллица 
		ПО Таб.ж = ДаноКириллица.НомерСтроки
		ЛЕВОЕ СОЕДИНЕНИЕ ДаноЛатинница КАК ДаноЛатинница 
		ПО Таб.а = ДаноЛатинница.Наименование

УПОРЯДОЧИТЬ ПО
	Таб.ж
Показать
На всякий случай прилагается обработка для тестирования.
Прикрепленные файлы:
Транслитератор.erf
9. IvanSusanin 18.03.16 13:52 Сейчас в теме
судя по обсуждению, Вам нужен полнотекстовый поиск.
10. ZhokhovM 724 18.03.16 13:55 Сейчас в теме
(9) IvanSusanin, не, не будет буквы подменять.
11. IvanSusanin 18.03.16 14:00 Сейчас в теме
(10) ZhokhovM,
не, не будет буквы подменять.

ну вы уж решите, надо быстро или надо универсально - чудес не бывает.
14. ZhokhovM 724 18.03.16 16:37 Сейчас в теме
Неужели больше не у кого нет идей?
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)