() У меня словарь содержит ~51 000 слов. И я вот не замучился.
Там так-то все просто довольно. Собираешь из словаря все слова в таблицу значений, где колонки такие:
"Наименование", "КоличествоСимволов". Впрочем, количество символов можно и в запросе вычислить.
А сам текст запроса вот такой:
/////////////////////////////////////////////////////////////////////////////
// Помещаем данные, переданные в таблице значений, во временную таблицу запроса
ВЫБРАТЬ
ДанныеСловарей.Наименование,
ДанныеСловарей.КоличествоСимволов
// Если версия платформа 1С позволяет,
// можно использовать функцию, редализованную в версии 8.3.20.1549
// ДЛИНАСТРОКИ(ДанныеСловарей.Наименование) КАК КоличествоСимволов
ПОМЕСТИТЬ ВТ_ДанныеСловарей
ИЗ &ИсходнаяТаблица КАК ДанныеСловарей
;
/////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 1, 1) КАК Буква
ПОМЕСТИТЬ ВТ_ДанныеСловарейБуквы
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 2, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 3, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 4, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 5, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 6, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 7, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 8, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 9, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 10, 1)
ИЗ Справочник.ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 11, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 12, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 13, 1)
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ДанныеСловарей.Наименование, ПОДСТРОКА(ДанныеСловарей.Наименование, 14, 1)
// Если 14-ти символов недостаточно, потребутся дополнить запрос до необходимого количества объединений
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
;
/////////////////////////////////////////////////////////////////////////////
// Формирование временной таблицы, в котрую будут помещаться тройки: Наименование-Буква-КоличествоБукв
// Результат получается примерно такой:
// Это слово в следующем запросе будет исключено из результатов, букв "а" потому что больше одной
// абака-а-3
// абака-б-1
// абака-к-1
// А это слово - нет. Всех букв по 1-й
// абвер-а-1
// .........
// абвер-р-1
ВЫБРАТЬ
ДанныеСловарей.Наименование, ДанныеСловарейБуквы.Буква, ДанныеСловарей.КоличествоСимволов, КОЛИЧЕСТВО(ДанныеСловарейБуквы.Буква) КАК КоличествоБукв
ПОМЕСТИТЬ ВТ_БуквыИСлова
ИЗ ВТ_ДанныеСловарей КАК ДанныеСловарей
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДанныеСловарейБуквы КАК ДанныеСловарейБуквы
ПО ДанныеСловарей.Наименование = ДанныеСловарейБуквы.Наименование
И НЕ ДанныеСловарейБуквы.Буква = ""
// Наименования фильтруем по вхождению символов в диапазоне от "!" до "я",
// поиск в запросе - регистронезависимый, поэтому "я" - прописная
И НЕ ДанныеСловарей.Наименование ПОДОБНО "%[^!-я]%"
ГДЕ
// Включаем фильтр по длине слова, если задан
ВЫБОР
КОГДА НЕ &КоличествоСимволов = 0
ТОГДА ДанныеСловарей.КоличествоСимволов = &КоличествоСимволов
ИНАЧЕ ИСТИНА
КОНЕЦ
СГРУППИРОВАТЬ ПО ДанныеСловарей.Наименование, ДанныеСловарей.КоличествоСимволов, ДанныеСловарейБуквы.Буква
;
/////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
БуквыИСлова.Наименование, БуквыИСлова.КоличествоСимволов
ИЗ ВТ_БуквыИСлова КАК БуквыИСлова
СГРУППИРОВАТЬ ПО БуквыИСлова.Наименование, БуквыИСлова.КоличествоСимволов
// Фрагмент ниже исключает все слова, где буква(ы) встречается в слове больше одного раза
ИМЕЮЩИЕ МАКСИМУМ(БуквыИСлова.КоличествоБукв) = 1
АВТОУПОРЯДОЧИВАНИЕ
Показать
Что-то не получилось спойлер вставить. Думаю, и так читабельно будет.
На всякий случай прикреплю файлы словарей. Может, пригодятся.