Публикации

БСП
Разработки

Распределение товаров по ячейкам в запросе

"Распределение в запросе" или "избавляемся от перебора"

Автор: ildarovich

FastCode 29 4
ВЫБРАТЬ
    Ячейки.Ячейка,
    СУММА(Слева.Количество) - МИНИМУМ(Ячейки.Количество) КАК КоличествоОт,
    СУММА(Слева.Количество) КАК КоличествоДо
ПОМЕСТИТЬ ЛинейкаЯчеек
ИЗ
    Ячейки КАК Ячейки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Ячейки КАК Слева
        ПО (Слева.Ячейка <= Ячейки.Ячейка)

СГРУППИРОВАТЬ ПО
    Ячейки.Ячейка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Товар,
    СУММА(Слева.Количество) - МИНИМУМ(Товары.Количество) КАК КоличествоОт,
    СУММА(Слева.Количество) КАК КоличествоДо
ПОМЕСТИТЬ ЛинейкаТоваров
ИЗ
    Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Слева
        ПО (Слева.Товар <= Товары.Товар)

СГРУППИРОВАТЬ ПО
    Товары.Товар
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Ячейки.Ячейка КАК Ячейка,
    Товары.Товар КАК Товар,
    ВЫБОР
        КОГДА Товары.КоличествоДо < Ячейки.КоличествоДо
            ТОГДА Товары.КоличествоДо
        ИНАЧЕ Ячейки.КоличествоДо
    КОНЕЦ - ВЫБОР
        КОГДА Товары.КоличествоОт > Ячейки.КоличествоОт
            ТОГДА Товары.КоличествоОт
        ИНАЧЕ Ячейки.КоличествоОт
    КОНЕЦ КАК Количество
ИЗ
    ЛинейкаЯчеек КАК Ячейки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЛинейкаТоваров КАК Товары
        ПО Ячейки.КоличествоОт < Товары.КоличествоДо
            И Ячейки.КоличествоДо > Товары.КоличествоОт

Объединение пересекающихся периодов в запросе

Требуется объединить перекрывающиеся периоды. Например, шесть периодов 01.01.16 - 10.03.16; 01.02.16 - 20.03.16; 30.03.16 - 15.04.16; 10.04.16 - 12.04.16; 11.04.16 - 25.04.16; 30.04-16 - 10.05.16 должны объединиться в три 01.01.16 - 20.03.16; 30.03.16 - 25.04.16; 30.04-16 - 10.05.16

Автор: ildarovich

FastCode 29 4
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Край.От
ПОМЕСТИТЬ ЛевыеКрая
ИЗ
    Интервалы КАК Край
        ЛЕВОЕ СОЕДИНЕНИЕ Интервалы КАК Интервалы
        ПО (Интервалы.От < Край.От)
            И Край.От <= Интервалы.До
ГДЕ
    Интервалы.От ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Край.До
ПОМЕСТИТЬ ПравыеКрая
ИЗ
    Интервалы КАК Край
        ЛЕВОЕ СОЕДИНЕНИЕ Интервалы КАК Интервалы
        ПО (Интервалы.От <= Край.До)
            И Край.До < Интервалы.До
ГДЕ
    Интервалы.От ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЛевыеКрая.От,
    МИНИМУМ(ПравыеКрая.До) КАК До
ИЗ
    ЛевыеКрая КАК ЛевыеКрая
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПравыеКрая КАК ПравыеКрая
        ПО ЛевыеКрая.От <= ПравыеКрая.До

СГРУППИРОВАТЬ ПО
    ЛевыеКрая.От

OneTracker - трекер учета рабочего времени программиста 1С Промо

Программа автоматически замеряет время работы разработчика с 1С в режиме Конфигуратора или Предприятия. Учет ведется в разрезах задач, информационных баз или объектов конфигураций.

Выделение разрядов числа без использования округления и деления по модулю

Первый параметр функции - число из максимум пяти разрядов цифр "0" и "1", второй параметр - номер разряда. Функция, возвращающая значение разряда:

Автор: ildarovich

FastCode 29 4
Функция Ф(Х, У)
    Возврат ?(У < 2, 0 + (Х > 9999), Ф((Х - 10000 * (Х > 9999)) * 10, У - 1))
КонецФункции

Посчитать запросом суммарную длительность различных состояний

Автор: ildarovich

FastCode 29 4
ВЫБРАТЬ
    &Дата1 КАК Период,
    НаНачало.Скважина,
    НаНачало.Состояние
ПОМЕСТИТЬ Дано
ИЗ
    РегистрСведений.Резерв.СрезПоследних(&Дата1, ) КАК НаНачало

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Резерв.Период,
    Резерв.Скважина,
    Резерв.Состояние
ИЗ
    РегистрСведений.Резерв КАК Резерв
ГДЕ
    Резерв.Период МЕЖДУ &Дата1 И &Дата2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &Дата2,
    НаКонец.Скважина,
    НаКонец.Состояние
ИЗ
    РегистрСведений.Резерв.СрезПоследних(&Дата2, ) КАК НаКонец
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Раньше.Период,
    Раньше.Скважина,
    Раньше.Состояние,
    РАЗНОСТЬДАТ(Раньше.Период, МИНИМУМ(Позже.Период), СЕКУНДА) КАК Длительность
ПОМЕСТИТЬ Интервалы
ИЗ
    Дано КАК Раньше
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Позже
        ПО Раньше.Скважина = Позже.Скважина
            И Раньше.Период < Позже.Период

СГРУППИРОВАТЬ ПО
    Раньше.Период,
    Раньше.Скважина,
    Раньше.Состояние
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Интервалы.Скважина,
    Интервалы.Состояние,
    СУММА(Интервалы.Длительность) КАК Длительность
ИЗ
    Интервалы КАК Интервалы

СГРУППИРОВАТЬ ПО
    Интервалы.Скважина,
    Интервалы.Состояние

Разбиение произвольного периода на интервалы в запросе

Автор: ildarovich

1 FastCode 29 4
ВЫБРАТЬ
    0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ
ВЫБРАТЬ
    1
;
ВЫБРАТЬ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) КАК Х
ПОМЕСТИТЬ Периоды
ИЗ
    Бит КАК Б0,
    Бит КАК Б1,
    Бит КАК Б2,
    Бит КАК Б3,
    Бит КАК Б4,
    Бит КАК Б5
ГДЕ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) < РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ)
;
ВЫБРАТЬ
    ЕСТЬNULL(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Начала.Х + 1), МЕСЯЦ), &Дата1) КАК ДатаНачала,
    ЕСТЬNULL(КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Окончания.Х), МЕСЯЦ), &Дата2) КАК ДатаОкончания
ИЗ
    Периоды КАК Начала
        ПОЛНОЕ СОЕДИНЕНИЕ Периоды КАК Окончания
        ПО (Начала.Х + 1 = Окончания.Х)

Поиск свободного штрихкода (EAN-13) внутри одного префикса

Решение основано на непосредственном получении следующего кода. Без необходимости перевода в числовой тип. В штрих-коде ищется последняя серия девяток. Она заменяется на серию нулей. Предшествующая цифра заменяется следующей в ряду цифр. Начало сохраняется. То есть решается задача инкрементирования числа непосредственно в символьном виде:

Автор: ildarovich

FastCode 29 4
ВЫБРАТЬ 0 КАК Х ПОМЕСТИТЬ Р1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1
;
ВЫБРАТЬ А.Х + 2 * Б.Х КАК Х ПОМЕСТИТЬ Р2 ИЗ Р1 КАК А, Р1 КАК Б
;
ВЫБРАТЬ А.Х + 4 * Б.Х КАК Х ПОМЕСТИТЬ Р4 ИЗ Р2 КАК А, Р2 КАК Б
;
ВЫБРАТЬ ВЫРАЗИТЬ(ПОДСТРОКА(ШтрихКод, 1, А.Х - 1) КАК СТРОКА(12)) 
+ ПОДСТРОКА("123456789", Б.Х + 1, 1) 
+ ПОДСТРОКА("000000000000", А.Х + 1, 12) КАК ШтрихКод
ПОМЕСТИТЬ ДаноПлюс 
ИЗ РегистрСведений_ШтрихкодыНоменклатуры, Р4 КАК А, Р4 КАК Б
ГДЕ ШтрихКод ПОДОБНО ПОДСТРОКА("%999999999999", 1, 13 - А.Х) 
И ШтрихКод НЕ ПОДОБНО ПОДСТРОКА("%999999999999", 1, 14 - А.Х)
И Б.Х < 9 И ПОДСТРОКА(ШтрихКод, А.Х, 1) = ПОДСТРОКА("012345678", Б.Х + 1, 1)
;
ВЫБРАТЬ ШтрихКод
ИЗ ДаноПлюс
ГДЕ ШтрихКод НЕ В 
(ВЫБРАТЬ Дано.ШтрихКод ИЗ РегистрСведений_ШтрихкодыНоменклатуры КАК Дано)

Выбор записи по номеру из НЕПРОНУМЕРОВАННОЙ таблицы

Расчёт медианы числовых рядов запросом

Автор: ildarovich

FastCode 29 4
ВЫБРАТЬ
    0 КАК Х
ПОМЕСТИТЬ Бит

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1
;
ВЫБРАТЬ
    NULL КАК Х
ПОМЕСТИТЬ Сдвиг
ИЗ
    Бит КАК Б0,
    Бит КАК Б1,
    Бит КАК Б2,
    Бит КАК Б3,
    Бит КАК Б4,
    Бит КАК Б5,
    Бит КАК Б6,
    Бит КАК Б7
ГДЕ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * (Б5.Х + 2 * (Б6.Х + 2 * Б7.Х)))))) < 256 - &Номер
;
ВЫБРАТЬ
    Дано.Х КАК Х
ПОМЕСТИТЬ Дано
ИЗ 
&Дано КАК Дано
;
ВЫБРАТЬ ПЕРВЫЕ 2
    ВЗ.Х
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 256
        ВЗ.Х
    ИЗ
        (ВЫБРАТЬ
            Сдвиг.Х
        ИЗ
            Сдвиг КАК Сдвиг
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            Дано.Х
        ИЗ
            Дано КАК Дано) КАК ВЗ
    
    УПОРЯДОЧИТЬ ПО
        Х) КАК ВЗ

УПОРЯДОЧИТЬ ПО
    Х УБЫВ

Как в запросе секунды преобразовать в часы и минуты

Автор: ildarovich

FastCode 29 4
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах), ЧАС) 
    + МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах)) / 100

Перебор всех строковых комбинаций "0" и "1" в порядке возрастания числа единиц

Очень полезная функция для организации перебора комбинаций. Без циклов!

Автор: ildarovich

FastCode 29 4
Функция СледующийКод(Код)
    Возврат Прав(СтрЗаменить(Код, "1", "0") + Лев("1" + Код, Найти(Код, "0")) 
    + ?(Найти(Код, "01"), "0", "") + Сред(Код, Найти(Код + "01", "01") + 2), СтрДлина(Код))
КонецФункции

Транслитерация в запросе

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

Автор: ildarovich

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

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

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

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

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