Как создать шахматную доску в СКД без использования оператора ОБЪЕДИНИТЬ

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

При решении нетипичных задач в 1С, таких как генерация «шахматной доски» заданного размера (в нашем случае 7х9), программисты часто сталкиваются с жесткими ограничениями. Одно из самых интересных — запрет на использование ключевого слова ОБЪЕДИНИТЬ (UNION) в тексте запроса. В этой статье мы подробно разберем, как обойти это ограничение, используя возможности системы компоновки данных (СКД), математические приемы в запросах и механизмы условного оформления.

Метод 1: Использование набора данных «Объект»

Если условие задачи позволяет выйти за рамки только текста запроса, самым элегантным и производительным решением будет использование внешнего набора данных. Рассмотрим ситуацию, когда мы формируем структуру доски в коде 1С и передаем её в СКД.

Проанализируем этот подход. Мы можем создать ТаблицаЗначений, заполнить её двумя колонками (КоординатаX и КоординатаY) и передать в компоновщик. В самом запросе СКД при этом вообще не будет текста, а значит, и запрещенного слова. Разберем пример кода для подготовки данных:


ТаблицаДоски = Новый ТаблицаЗначений;
ТаблицаДоски.Колонки.Добавить("X", Новый ОписаниеТипов("Число"));
ТаблицаДоски.Колонки.Добавить("Y", Новый ОписаниеТипов("Число"));

Для СчX = 1 По 9 Цикл
    Для СчY = 1 По 7 Цикл
        НоваяСтрока = ТаблицаДоски.Добавить();
        НоваяСтрока.X = СчX;
        НоваяСтрока.Y = СчY;
    КонецЦикла;
КонецЦикла;

ВнешниеДанные = Новый Структура("ТаблицаШахматка", ТаблицаДоски);

Этот метод полностью снимает проблему генерации строк в запросе, перекладывая её на встроенный язык, что часто оказывается эффективнее при фиксированных размерах доски.

Метод 2: Генерация строк через Декартово произведение (Cross Join)

Если же стоит задача сделать все именно в одном запросе, но без ОБЪЕДИНИТЬ, мы можем прибегнуть к хитрости с соединением таблиц. Нам нужно получить 7 и 9 записей. Для этого можно использовать любую таблицу метаданных, которая гарантированно не пуста (например, справочник пользователей или валют).

Рассмотрим, как получить последовательность чисел. Выясним причину, почему это работает: если мы соединим таблицу саму с собой по условию ГДЕ Т1.Ссылка >= Т2.Ссылка, мы получим треугольное соединение, количество строк в котором позволит нам вычислить порядковый номер.

Однако есть более простой путь — использование системных таблиц с применением ВЫБРАТЬ ПЕРВЫЕ. Посмотрим на пример формирования осей координат:


ВЫБРАТЬ ПЕРВЫЕ 9
    АВТОНОМЕРЗАПИСИ() КАК X
ПОМЕСТИТЬ ВТ_X
ИЗ
    Справочник.ИдентификаторыОбъектовМетаданных КАК Т1
;

ВЫБРАТЬ ПЕРВЫЕ 7
    АВТОНОМЕРЗАПИСИ() КАК Y
ПОМЕСТИТЬ ВТ_Y
ИЗ
    Справочник.ИдентификаторыОбъектовМетаданных КАК Т1
;

ВЫБРАТЬ
    ВТ_X.X КАК КоординатаX,
    ВТ_Y.Y КАК КоординатаY
ИЗ
    ВТ_X КАК ВТ_X,
    ВТ_Y КАК ВТ_Y

Обратите внимание: использование функции АВТОНОМЕРЗАПИСИ() доступно не во всех версиях платформы и СУБД в языке запросов напрямую, поэтому в реальной задаче индексы (1, 2, 3...) можно получить через соединение таблицы с самой собой и подсчет ссылок, которые «меньше или равны» текущей.

Метод 3: Математика раскраски и условное оформление

После того как мы получили набор данных из 63 строк (9 колонок * 7 строк), нам необходимо превратить это в визуальную шахматную доску. Настроим отчет в виде Таблицы в СКД.

  1. В Строки таблицы добавим поле КоординатаY.
  2. В Колонки таблицы добавим поле КоординатаX.
  3. В Выбранные поля добавим пустое вычисляемое поле или просто текст " ".

Теперь самое главное — раскраска ячеек. В шахматах цвет ячейки зависит от суммы её координат. Если сумма (X + Y) четная — цвет один, если нечетная — другой. Поскольку в языке запросов 1С нет оператора остатка от деления (%), мы воспользуемся формулой целочисленного деления.

Перейдем на вкладку Условное оформление и добавим новое правило:

Область: Выбранные поля (наша ячейка).

Условие: Нам нужно определить четность. В СКД это можно сделать через выражение:

(КоординатаX + КоординатаY) / 2 = Целое((КоординатаX + КоординатаY) / 2)

Разберем, как это работает: если результат деления суммы координат на 2 равен его целой части, значит, число четное. Для таких ячеек установим Цвет фона — Черный (или темно-серый для эстетики). Для всех остальных (нечетных) ячеек можно либо оставить белый фон по умолчанию, либо создать второе правило с противоположным условием.

Альтернативный подход через «Вычисляемые поля»

Выясним, как упростить логику, если мы не хотим писать сложные выражения в условном оформлении. Мы можем создать вычисляемое поле ЦветЯчейки прямо в схеме компоновки данных. В выражении этого поля напишем:


Выбор 
    Когда (КоординатаX + КоординатаY) % 2 = 0 
    Тогда "Черный" 
    Иначе "Белый" 
Конец

Важный нюанс: оператор % (остаток от деления) поддерживается в Вычисляемых полях СКД, хотя и отсутствует в стандартном языке запросов 1С. Это значительно упрощает жизнь разработчику. После создания такого поля, в условном оформлении достаточно будет указать условие: ЦветЯчейки = "Черный".

Итоги и рекомендации

Мы проанализировали ситуацию и выяснили, что отсутствие оператора ОБЪЕДИНИТЬ не является препятствием для создания сложного отчета. Основные выводы нашего исследования:

Таким образом, комбинируя математические приемы и встроенные инструменты оформления СКД, можно создавать отчеты любой визуальной сложности, соблюдая даже самые специфические требования к коду.

← На главную