При решении нетипичных задач в 1С, таких как генерация «шахматной доски» заданного размера (в нашем случае 7х9), программисты часто сталкиваются с жесткими ограничениями. Одно из самых интересных — запрет на использование ключевого слова ОБЪЕДИНИТЬ (UNION) в тексте запроса. В этой статье мы подробно разберем, как обойти это ограничение, используя возможности системы компоновки данных (СКД), математические приемы в запросах и механизмы условного оформления.
Если условие задачи позволяет выйти за рамки только текста запроса, самым элегантным и производительным решением будет использование внешнего набора данных. Рассмотрим ситуацию, когда мы формируем структуру доски в коде 1С и передаем её в СКД.
Проанализируем этот подход. Мы можем создать ТаблицаЗначений, заполнить её двумя колонками (КоординатаX и КоординатаY) и передать в компоновщик. В самом запросе СКД при этом вообще не будет текста, а значит, и запрещенного слова. Разберем пример кода для подготовки данных:
ТаблицаДоски = Новый ТаблицаЗначений;
ТаблицаДоски.Колонки.Добавить("X", Новый ОписаниеТипов("Число"));
ТаблицаДоски.Колонки.Добавить("Y", Новый ОписаниеТипов("Число"));
Для СчX = 1 По 9 Цикл
Для СчY = 1 По 7 Цикл
НоваяСтрока = ТаблицаДоски.Добавить();
НоваяСтрока.X = СчX;
НоваяСтрока.Y = СчY;
КонецЦикла;
КонецЦикла;
ВнешниеДанные = Новый Структура("ТаблицаШахматка", ТаблицаДоски);
Этот метод полностью снимает проблему генерации строк в запросе, перекладывая её на встроенный язык, что часто оказывается эффективнее при фиксированных размерах доски.
Если же стоит задача сделать все именно в одном запросе, но без ОБЪЕДИНИТЬ, мы можем прибегнуть к хитрости с соединением таблиц. Нам нужно получить 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...) можно получить через соединение таблицы с самой собой и подсчет ссылок, которые «меньше или равны» текущей.
После того как мы получили набор данных из 63 строк (9 колонок * 7 строк), нам необходимо превратить это в визуальную шахматную доску. Настроим отчет в виде Таблицы в СКД.
КоординатаY.КоординатаX.Теперь самое главное — раскраска ячеек. В шахматах цвет ячейки зависит от суммы её координат. Если сумма (X + Y) четная — цвет один, если нечетная — другой. Поскольку в языке запросов 1С нет оператора остатка от деления (%), мы воспользуемся формулой целочисленного деления.
Перейдем на вкладку Условное оформление и добавим новое правило:
Область: Выбранные поля (наша ячейка).
Условие: Нам нужно определить четность. В СКД это можно сделать через выражение:
(КоординатаX + КоординатаY) / 2 = Целое((КоординатаX + КоординатаY) / 2)
Разберем, как это работает: если результат деления суммы координат на 2 равен его целой части, значит, число четное. Для таких ячеек установим Цвет фона — Черный (или темно-серый для эстетики). Для всех остальных (нечетных) ячеек можно либо оставить белый фон по умолчанию, либо создать второе правило с противоположным условием.
Выясним, как упростить логику, если мы не хотим писать сложные выражения в условном оформлении. Мы можем создать вычисляемое поле ЦветЯчейки прямо в схеме компоновки данных. В выражении этого поля напишем:
Выбор
Когда (КоординатаX + КоординатаY) % 2 = 0
Тогда "Черный"
Иначе "Белый"
Конец
Важный нюанс: оператор % (остаток от деления) поддерживается в Вычисляемых полях СКД, хотя и отсутствует в стандартном языке запросов 1С. Это значительно упрощает жизнь разработчику. После создания такого поля, в условном оформлении достаточно будет указать условие: ЦветЯчейки = "Черный".
Мы проанализировали ситуацию и выяснили, что отсутствие оператора ОБЪЕДИНИТЬ не является препятствием для создания сложного отчета. Основные выводы нашего исследования:
Таким образом, комбинируя математические приемы и встроенные инструменты оформления СКД, можно создавать отчеты любой визуальной сложности, соблюдая даже самые специфические требования к коду.