Транслитерация в запросе
Теги: 1С,Минимализмы,Задачи

Вот текст запроса, построенный на идее статьи Агрегатное суммирование строк в запросе – сложно, но не невозможно. В запросе производятся необходимые преобразования. То есть берется таблица Дано с кириллическими наименованиями, транслитируется по таблице ISO9 в наименования латинницей и соединяется с таблицей поиска. Определяется ключ связи (номер строки в таблице поиска). Расчет на строки длиной до 256.

# Код реализации

```1c
ВЫБРАТЬ
    Дано.НомерСтроки,
    Дано.Наименование
ПОМЕСТИТЬ ДаноКириллица
ИЗ
    &ДаноКириллица КАК Дано
;
ВЫБРАТЬ
    "" "" КАК Буква,
    &СимволНПП КАК Замена
ПОМЕСТИТЬ ГОСТ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 ТОГДА """"ИНАЧЕ Шаг.а КОНЕЦ) а
ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО ж, е; УНИЧТОЖИТЬ Шаг;

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

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

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

УПОРЯДОЧИТЬ ПО
    Таб.ж
```