Как создать таблицу умножения в языке запросов 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При изучении языка запросов 1С часто встречается классическая учебная задача: сформировать таблицу умножения для заданного числа (параметра) или целую матрицу Пифагора (от 1 до 9). На первый взгляд задача кажется простой, но она отлично демонстрирует базовые принципы работы с выборками, временными таблицами и соединениями. В этой статье мы подробно разберем несколько способов реализации этой задачи, начиная от самых элементарных и заканчивая продвинутыми методами генерации последовательностей строк.

Способ 1: Прямое объединение строк через ОБЪЕДИНИТЬ ВСЕ

Проанализируем самый очевидный и простой вариант. Если нам нужно получить таблицу умножения для конкретного числа, которое передается в запрос как параметр &Число, мы можем просто «склеить» девять строк в одну таблицу. Для этого используется оператор ОБЪЕДИНИТЬ ВСЕ.

Рассмотрим пример кода:


ВЫБРАТЬ 1 КАК Множитель, &Число КАК Число, 1 * &Число КАК Произведение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2, &Число, 2 * &Число
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3, &Число, 3 * &Число
// ... и так далее до 9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 9, &Число, 9 * &Число

Выясним преимущества и недостатки этого метода. Преимущество заключается в отсутствии необходимости использовать временные таблицы или сложные соединения. Это работает быстро и понятно для новичка. Недостаток — избыточность кода. Если нам понадобится таблица до 100, писать такой запрос вручную станет трудозатратно.

Способ 2: Использование временных таблиц и пакетных запросов

Теперь разберем более профессиональный подход, который часто требуется от разработчиков на экзаменах «1С:Профессионал» или «1С:Специалист». Мы разделим задачу на два этапа: сначала создадим «справочник» множителей во временной таблице, а затем выполним итоговый расчет.

Рассмотрим по шагам реализацию в пакетном запросе:

  1. Создаем временную таблицу ВТ_Множители, содержащую числа от 1 до 9.
  2. В основном запросе выбираем данные из этой таблицы и умножаем их на наш параметр.

Посмотрим на пример кода:


ВЫБРАТЬ 1 КАК Множитель ПОМЕСТИТЬ ВТ_Множители
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    &Число КАК Число,
    ВТ_Множители.Множитель КАК Множитель,
    ВТ_Множители.Множитель * &Число КАК Произведение
ИЗ
    ВТ_Множители КАК ВТ_Множители

В данном случае мы использовали объект МенеджерВременныхТаблиц (неявно в консоли или явно в коде), что позволяет структурировать логику. Этот метод гораздо гибче, так как таблицу множителей можно использовать повторно в других частях пакета запросов.

Способ 3: Соединение таблицы с параметром через ПО (ИСТИНА)

Проанализируем ситуацию, когда нам нужно программно «приклеить» значение параметра к каждой строке таблицы множителей. В языке запросов 1С нельзя просто выбрать параметр рядом с таблицей без связи, если мы хотим использовать его как полноценное поле для дальнейших группировок. Один из хитроумных способов — превратить параметр во вложенный запрос и соединить его с основной таблицей по условию ИСТИНА.

Рассмотрим подробнее этот прием:


ВЫБРАТЬ
    ВложенныйЗапрос.Число КАК Число,
    ВТ_Множители.Множитель КАК Множитель,
    ВложенныйЗапрос.Число * ВТ_Множители.Множитель КАК Произведение
ИЗ
    ВТ_Множители КАК ВТ_Множители
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ &Число КАК Число) КАК ВложенныйЗапрос
        ПО (ИСТИНА)

Такой метод называется Cross Join (Декартово произведение). Поскольку во вложенном запросе всего одна строка (наш параметр), условие ПО (ИСТИНА) заставляет систему сопоставить эту одну строку с каждой строкой из таблицы ВТ_Множители. Это универсальный способ «размножить» константу на все записи таблицы.

Способ 4: Генерация полной матрицы 9х9 (Таблица Пифагора)

Если задача стоит шире — получить не одну колонку для числа 5, а всю таблицу умножения от 1 до 9 (где строки — это первый множитель, а колонки — второй), мы можем применить самосоединение временной таблицы. Проанализируем, как это работает: мы берем таблицу ВТ_Множители дважды и соединяем их между собой без условий.

Пример формирования полной сетки:


ВЫБРАТЬ
    Множители1.Множитель КАК Число1,
    Множители2.Множитель КАК Число2,
    Множители1.Множитель * Множители2.Множитель КАК Результат
ИЗ
    ВТ_Множители КАК Множители1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Множители КАК Множители2
        ПО (ИСТИНА)

В результате мы получим 81 строку (9 * 9). Если вывести такой результат в Систему компоновки данных (СКД) и использовать тип отчета «Кросс-таблица», мы получим красивую визуальную матрицу, знакомую всем со школы.

Продвинутые приемы и оптимизация

Рассмотрим еще несколько важных моментов, которые помогут вам в реальной разработке:

Подводя итог, мы выяснили, что даже такая простая задача, как таблица умножения, имеет множество решений. Для учебных целей лучше всего подходит Способ 2 с временными таблицами, так как он приучает к правильной структуре пакетов запросов в 1С.

← На главную