Читайте дальше...
Объединение результатов двух запросов через Объединить
// Базовое объединение двух запросов с одинаковой структурой полей
Процедура ОбъединитьДваЗапроса()
// Первый запрос - товары на складе А
Запрос1 = Новый Запрос;
Запрос1.Текст = "
|ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Наименование КАК Наименование,
| 0 КАК КоличествоСкладБ
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
Результат1 = Запрос1.Выполнить().Выгрузить();
// Второй запрос - товары на складе Б
Запрос2 = Новый Запрос;
Запрос2.Текст = "
|ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Наименование КАК Наименование,
| 0 КАК КоличествоСкладА
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
Результат2 = Запрос2.Выполнить().Выгрузить();
// Объединяем результаты
ОбъединенныйРезультат = Результат1.Объединить(Результат2);
Сообщить("Всего уникальных товаров: " + Строка(ОбъединенныйРезультат.Количество()));
КонецПроцедуры
Объединение с сохранением дублей (Объединить с параметром)
// Объединение таблиц значений с контролем дублирования
Процедура ОбъединитьСДублями()
// Таблица с продажами за январь
ТаблицаЯнварь = Новый ТаблицаЗначений;
ТаблицаЯнварь.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаЯнварь.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ТаблицаЯнварь.Добавить().Товар = "Ноутбук"; ТаблицаЯнварь[0].Сумма = 100000;
ТаблицаЯнварь.Добавить().Товар = "Монитор"; ТаблицаЯнварь[1].Сумма = 30000;
ТаблицаЯнварь.Добавить().Товар = "Клавиатура"; ТаблицаЯнварь[2].Сумма = 5000;
// Таблица с продажами за февраль
ТаблицаФевраль = Новый ТаблицаЗначений;
ТаблицаФевраль.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаФевраль.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ТаблицаФевраль.Добавить().Товар = "Ноутбук"; ТаблицаФевраль[0].Сумма = 120000;
ТаблицаФевраль.Добавить().Товар = "Монитор"; ТаблицаФевраль[1].Сумма = 35000;
ТаблицаФевраль.Добавить().Товар = "Мышь"; ТаблицаФевраль[2].Сумма = 2000;
// Объединяем с сохранением всех строк (включая дубли)
// Ложь - не удалять дубликаты
ОбъединениеСДублями = ТаблицаЯнварь.Объединить(ТаблицаФевраль, Ложь);
Сообщить("Объединено с дублями: " + Строка(ОбъединениеСДублями.Количество()));
// Результат: 6 строк (3 + 3)
// Объединяем с удалением дублей
// Истина - удалять дубликаты (по всем колонкам)
ОбъединениеБезДублей = ТаблицаЯнварь.Объединить(ТаблицаФевраль, Истина);
Сообщить("Объединено без дублей: " + Строка(ОбъединениеБезДублей.Количество()));
// Результат: 5 строк (Ноутбук, Монитор, Клавиатура, Мышь - дубли удалены)
КонецПроцедуры
Объединение запросов в языке запросов (ОБЪЕДИНИТЬ ВСЕ)
// Объединение выборок на уровне запроса
Процедура ОбъединитьЗапросыВЗапросе()
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| 'Поступление' КАК ТипДвижения,
| Поступление.Период КАК Период,
| Поступление.Номенклатура КАК Товар,
| Поступление.Количество КАК Количество
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК Поступление
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 'Реализация' КАК ТипДвижения,
| Реализация.Период КАК Период,
| Реализация.Номенклатура КАК Товар,
| Реализация.Количество * -1 КАК Количество
|ИЗ
| Документ.РеализацияТоваров.Товары КАК Реализация
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 'Списание' КАК ТипДвижения,
| Списание.Период КАК Период,
| Списание.Номенклатура КАК Товар,
| Списание.Количество * -1 КАК Количество
|ИЗ
| Документ.СписаниеТоваров.Товары КАК Списание
|
|УПОРЯДОЧИТЬ ПО
| Период";
Результат = Запрос.Выполнить().Выгрузить();
Сообщить("Всего движений: " + Строка(Результат.Количество()));
// Анализируем итоги по типам
Для Каждого Строка Из Результат Цикл
Сообщить(Строка.ТипДвижения + ": " + Строка.Товар + " - " + Строка.Количество);
КонецЦикла;
КонецПроцедуры
Объединение с агрегацией сгруппированных данных
// Объединение результатов с последующей группировкой
Процедура ОбъединитьИСгруппировать()
// Продажи по менеджерам
ТаблицаПродажи = Новый ТаблицаЗначений;
ТаблицаПродажи.Колонки.Добавить("Менеджер", Новый ОписаниеТипов("Строка"));
ТаблицаПродажи.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ТаблицаПродажи.Добавить().Менеджер = "Иванов"; ТаблицаПродажи[0].Сумма = 500000;
ТаблицаПродажи.Добавить().Менеджер = "Петров"; ТаблицаПродажи[1].Сумма = 300000;
ТаблицаПродажи.Добавить().Менеджер = "Сидоров"; ТаблицаПродажи[2].Сумма = 200000;
// Возвраты по менеджерам
ТаблицаВозвраты = Новый ТаблицаЗначений;
ТаблицаВозвраты.Колонки.Добавить("Менеджер", Новый ОписаниеТипов("Строка"));
ТаблицаВозвраты.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ТаблицаВозвраты.Добавить().Менеджер = "Иванов"; ТаблицаВозвраты[0].Сумма = 50000;
ТаблицаВозвраты.Добавить().Менеджер = "Петров"; ТаблицаВозвраты[1].Сумма = 20000;
// Объединяем таблицы
Объединенная = ТаблицаПродажи.Объединить(ТаблицаВозвраты, Ложь);
// Группируем по менеджеру с суммированием
Группировка = Новый ТаблицаЗначений;
Группировка.Колонки.Добавить("Менеджер", Новый ОписаниеТипов("Строка"));
Группировка.Колонки.Добавить("Итог", Новый ОписаниеТипов("Число"));
Для Каждого Строка Из Объединенная Цикл
Найденная = Группировка.Найти(Строка.Менеджер, "Менеджер");
Если Найденная = Неопределено Тогда
Новая = Группировка.Добавить();
Новая.Менеджер = Строка.Менеджер;
Новая.Итог = Строка.Сумма;
Иначе
Найденная.Итог = Найденная.Итог + Строка.Сумма;
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из Группировка Цикл
Сообщико(Строка.Менеджер + ": " + Строка.Итог);
КонецЦикла;
КонецПроцедуры
Объединение с разной структурой колонок
// Объединение таблиц с различными наборами колонок
Процедура ОбъединитьРазноструктурныеТаблицы()
// Таблица с поступлениями
Поступления = Новый ТаблицаЗначений;
Поступления.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"));
Поступления.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
Поступления.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Поступления.Колонки.Добавить("Склад", Новый ОписаниеТипов("Строка"));
Строка = Поступления.Добавить();
Строка.Документ = "П-001"; Строка.Товар = "Ноутбук"; Строка.Количество = 10; Строка.Склад = "Основной";
// Таблица с расходами (другая структура)
Расходы = Новый ТаблицаЗначений;
Расходы.Колонки.Добавить("НомерДокумента", Новый ОписаниеТипов("Строка"));
Расходы.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Строка"));
Расходы.Колонки.Добавить("Кол", Новый ОписаниеТипов("Число"));
Расходы.Колонки.Добавить("СкладОтгрузки", Новый ОписаниеТипов("Строка"));
Расходы.Колонки.Добавить("Клиент", Новый ОписаниеТипов("Строка"));
Строка = Расходы.Добавить();
Строка.НомерДокумента = "Р-001"; Строка.Номенклатура = "Ноутбук"; Строка.Кол = 5;
Строка.СкладОтгрузки = "Основной"; Строка.Клиент = "ООО Ромашка";
// Приводим к единой структуре перед объединением
ПриведенныеРасходы = Новый ТаблицаЗначений;
ПриведенныеРасходы.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"));
ПриведенныеРасходы.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ПриведенныеРасходы.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ПриведенныеРасходы.Колонки.Добавить("Склад", Новый ОписаниеТипов("Строка"));
Для Каждого Исходный Из Расходы Цикл
Новая = ПриведенныеРасходы.Добавить();
Новая.Документ = Исходный.НомерДокумента;
Новая.Товар = Исходный.Номенклатура;
Новая.Количество = Исходный.Кол;
Новая.Склад = Исходный.СкладОтгрузки;
КонецЦикла;
// Теперь можно объединить
ВсеДвижения = Поступления.Объединить(ПриведенныеРасходы, Истина);
Сообщико("Всего записей: " + Строка(ВсеДвижения.Количество()));
Для Каждого Стр Из ВсеДвижения Цикл
Сообщить(Стр.Документ + " | " + Стр.Товар + " | " + Стр.Количество);
КонецЦикла;
КонецПроцедуры
Объединение с расчетом разницы (полный внешний JOIN)
// Эмуляция FULL OUTER JOIN через объединение
Процедура ПолноеСоединениеЧерезОбъединение()
// Товары на складе вчера
ВчерашниеОстатки = Новый ТаблицаЗначений;
ВчерашниеОстатки.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ВчерашниеОстатки.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
ВчерашниеОстатки.Добавить().Товар = "Ноутбук"; ВчерашниеОстатки[0].Остаток = 20;
ВчерашниеОстатки.Добавить().Товар = "Монитор"; ВчерашниеОстатки[1].Остаток = 15;
ВчерашниеОстатки.Добавить().Товар = "Клавиатура"; ВчерашниеОстатки[2].Остаток = 50;
// Товары на складе сегодня
СегодняшниеОстатки = Новый ТаблицаЗначений;
СегодняшниеОстатки.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
СегодняшниеОстатки.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
СегодняшниеОстатки.Добавить().Товар = "Ноутбук"; СегодняшниеОстатки[0].Остаток = 15;
СегодняшниеОстатки.Добавить().Товар = "Монитор"; СегодняшниеОстатки[1].Остаток = 17;
СегодняшниеОстатки.Добавить().Товар = "Мышь"; СегодняшниеОстатки[2].Остаток = 100;
// Объединяем товары из обеих таблиц
ВсеТовары = ВчерашниеОстатки.Объединить(СегодняшниеОстатки, Истина);
// Создаем результирующую таблицу с разницей
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Товар");
Результат.Колонки.Добавить("ОстатокВчера", Новый ОписаниеТипов("Число"));
Результат.Колонки.Добавить("ОстатокСегодня", Новый ОписаниеТипов("Число"));
Результат.Колонки.Добавить("Изменение", Новый ОписаниеТипов("Число"));
Для Каждого ТоварнаяСтрока Из ВсеТовары Цикл
НоваяСтрока = Результат.Добавить();
НоваяСтрока.Товар = ТоварнаяСтрока.Товар;
// Ищем остатки вчера
Вчера = ВчерашниеОстатки.Найти(ТоварнаяСтрока.Товар, "Товар");
Если Вчера <> Неопределено Тогда
НоваяСтрока.ОстатокВчера = Вчера.Остаток;
Иначе
НоваяСтрока.ОстатокВчера = 0;
КонецЕсли;
// Ищем остатки сегодня
Сегодня = СегодняшниеОстатки.Найти(ТоварнаяСтрока.Товар, "Товар");
Если Сегодня <> Неопределено Тогда
НоваяСтрока.ОстатокСегодня = Сегодня.Остаток;
Иначе
НоваяСтрока.ОстатокСегодня = 0;
КонецЕсли;
НоваяСтрока.Изменение = НоваяСтрока.ОстатокСегодня - НоваяСтрока.ОстатокВчера;
КонецЦикла;
// Выводим результат
Для Каждого Стр Из Результат Цикл
Сообщить(Стр.Товар + ": вчера=" + Стр.ОстатокВчера +
", сегодня=" + Стр.ОстатокСегодня +
", изменение=" + Стр.Изменение);
КонецЦикла;
КонецПроцедуры
Объединение нескольких таблиц в цикле
// Динамическое объединение произвольного количества таблиц
Процедура ОбъединитьНесколькоТаблиц()
// Создаем несколько таблиц с данными по филиалам
Филиалы = Новый Массив;
Для Ном = 1 По 5 Цикл
ТаблицаФилиала = Новый ТаблицаЗначений;
ТаблицаФилиала.Колонки.Добавить("Товар");
ТаблицаФилиала.Колонки.Добавить("Количество");
ТаблицаФилиала.Колонки.Добавить("Сумма");
// Заполняем тестовыми данными
Для Инд = 1 По 3 Цикл
Строка = ТаблицаФилиала.Добавить();
Строка.Товар = "Товар " + Строка(Инд);
Строка.Количество = Ном * Инд * 10;
Строка.Сумма = Строка.Количество * 100;
КонецЦикла;
Филиалы.Добавить(ТаблицаФилиала);
КонецЦикла;
// Объединяем все таблицы в одну
Если Филиалы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ИтоговаяТаблица = Филиалы[0];
Для Инд = 1 По Филиалы.Количество() - 1 Цикл
ИтоговаяТаблица = ИтоговаяТаблица.Объединить(Филиалы[Инд], Ложь); // Сохраняем все строки
КонецЦикла;
Сообщить("Общий объем данных: " + Строка(ИтоговаяТаблица.Количество()) + " строк");
// Агрегируем итоги по товарам
ИтогиПоТоварам = Новый ТаблицаЗначений;
ИтогиПоТоварам.Колонки.Добавить("Товар");
ИтогиПоТоварам.Колонки.Добавить("ВсегоКоличество");
ИтогиПоТоварам.Колонки.Добавить("ОбщаяСумма");
Для Каждого Стр Из ИтоговаяТаблица Цикл
Найденная = ИтогиПоТоварам.Найти(Стр.Товар, "Товар");
Если Найденная = Неопределено Тогда
Новая = ИтогиПоТоварам.Добавить();
Новая.Товар = Стр.Товар;
Новая.ВсегоКоличество = Стр.Количество;
Новая.ОбщаяСумма = Стр.Сумма;
Иначе
Найденная.ВсегоКоличество = Найденная.ВсегоКоличество + Стр.Количество;
Найденная.ОбщаяСумма = Найденная.ОбщаяСумма + Стр.Сумма;
КонецЕсли;
КонецЦикла;
Для Каждого Стр Из ИтогиПоТоварам Цикл
Сообщико(Стр.Товар + ": " + Стр.ВсегоКоличество + " шт. на сумму " + Стр.ОбщаяСумма);
КонецЦикла;
КонецПроцедуры
Объединение с фильтрацией и сортировкой
// Объединение с последующей фильтрацией и сортировкой
Процедура ОбъединитьСОбработкой()
// Таблица активных клиентов
АктивныеКлиенты = Новый ТаблицаЗначений;
АктивныеКлиенты.Колонки.Добавить("Клиент");
АктивныеКлиенты.Колонки.Добавить("СуммаЗаказов");
АктивныеКлиенты.Колонки.Добавить("ДатаПоследнегоЗаказа");
АктивныеКлиенты.Добавить().Клиент = "ООО Альфа";
АктивныеКлиенты[0].СуммаЗаказов = 1000000;
АктивныеКлиенты[0].ДатаПоследнегоЗаказа = ТекущаяДата() - 5;
АктивныеКлиенты.Добавить().Клиент = "ООО Бета";
АктивныеКлиенты[1].СуммаЗаказов = 500000;
АктивныеКлиенты[1].ДатаПоследнегоЗаказа = ТекущаяДата() - 10;
// Таблица новых клиентов
НовыеКлиенты = Новый ТаблицаЗначений;
НовыеКлиенты.Колонки.Добавить("Клиент");
НовыеКлиенты.Колонки.Добавить("СуммаЗаказов");
НовыеКлиенты.Колонки.Добавить("ДатаРегистрации");
НовыеКлиенты.Добавить().Клиент = "ООО Гамма";
НовыеКлиенты[0].СуммаЗаказов = 100000;
НовыеКлиенты[0].ДатаРегистрации = ТекущаяДата() - 2;
НовыеКлиенты.Добавить().Клиент = "ООО Дельта";
НовыеКлиенты[1].СуммаЗаказов = 75000;
НовыеКлиенты[1].ДатаРегистрации = ТекущаяДата() - 1;
// Приводим к единой структуре
УниверсальнаяТаблица = Новый ТаблицаЗначений;
УниверсальнаяТаблица.Колонки.Добавить("Клиент");
УниверсальнаяТаблица.Колонки.Добавить("СуммаЗаказов");
УниверсальнаяТаблица.Колонки.Добавить("Категория");
УниверсальнаяТаблица.Колонки.Добавить("ДатаСобытия");
// Добавляем активных клиентов
Для Каждого Клиент Из АктивныеКлиенты Цикл
Строка = УниверсальнаяТаблица.Добавить();
Строка.Клиент = Клиент.Клиент;
Строка.СуммаЗаказов = Клиент.СуммаЗаказов;
Строка.Категория = "Активный";
Строка.ДатаСобытия = Клиент.ДатаПоследнегоЗаказа;
КонецЦикла;
// Добавляем новых клиентов
Для Каждого Клиент Из НовыеКлиенты Цикл
Строка = УниверсальнаяТаблица.Добавить();
Строка.Клиент = Клиент.Клиент;
Строка.СуммаЗаказов = Клиент.СуммаЗаказов;
Строка.Категория = "Новый";
Строка.ДатаСобытия = Клиент.ДатаРегистрации;
КонецЦикла;
// Фильтрация: оставляем только клиентов с суммой заказов > 100000
Отфильтрованная = Новый ТаблицаЗначений;
Отфильтрованная.Колонки.Добавить("Клиент");
Отфильтрованная.Колонки.Добавить("СуммаЗаказов");
Отфильтрованная.Колонки.Добавить("Категория");
Отфильтрованная.Колонки.Добавить("ДатаСобытия");
Для Каждого Стр Из УниверсальнаяТаблица Цикл
Если Стр.СуммаЗаказов > 100000 Тогда
НоваяСтрока = Отфильтрованная.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЕсли;
КонецЦикла;
// Сортировка по убыванию суммы
Отфильтрованная.Сортировать("СуммаЗаказов УБЫВ");
// Вывод результата
Сообщить("VIP-клиенты (сумма > 100 000):");
Для Каждого Стр Из Отфильтрованная Цикл
Сообщить(Стр.Категория + " клиент " + Стр.Клиент + ": " + Стр.СуммаЗаказов);
КонецЦикла;
КонецПроцедуры
Объединение с проверкой уникальности по ключевому полю
// Объединение с контролем уникальности по заданному полю
Процедура ОбъединитьСКлючевымПолем()
// Справочник цен поставщика А
ЦеныА = Новый ТаблицаЗначений;
ЦеныА.Колонки.Добавить("КодТовара", Новый ОписаниеТипов("Строка"));
ЦеныА.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ЦеныА.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка"));
ЦеныА.Добавить().КодТовара = "001"; ЦеныА[0].Цена = 100; ЦеныА[0].Поставщик = "Поставщик А";
ЦеныА.Добавить().КодТовара = "002"; ЦеныА[1].Цена = 200; ЦеныА[1].Поставщик = "Поставщик А";
ЦеныА.Добавить().КодТовара = "003"; ЦеныА[2].Цена = 150; ЦеныА[2].Поставщик = "Поставщик А";
// Справочник цен поставщика Б
ЦеныБ = Новый ТаблицаЗначений;
ЦеныБ.Колонки.Добавить("КодТовара", Новый ОписаниеТипов("Строка"));
ЦеныБ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ЦеныБ.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка"));
ЦеныБ.Добавить().КодТовара = "001"; ЦеныБ[0].Цена = 95; ЦеныБ[0].Поставщик = "Поставщик Б";
ЦеныБ.Добавить().КодТовара = "003"; ЦеныБ[1].Цена = 140; ЦеныБ[1].Поставщик = "Поставщик Б";
ЦеныБ.Добавить().КодТовара = "004"; ЦеныБ[2].Цена = 300; ЦеныБ[2].Поставщик = "Поставщик Б";
// Объединяем с контролем уникальности по КодТовара
УникальныеЦены = Новый ТаблицаЗначений;
УникальныеЦены.Колонки.Добавить("КодТовара");
УникальныеЦены.Колонки.Добавить("Цена");
УникальныеЦены.Колонки.Добавить("Поставщик");
УникальныеЦены.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число"));
// Функция добавления с проверкой уникальности
Функция ДобавитьЕслиУникально(ТаблицаПриемник, Код, Цена, Поставщик, Приоритет)
Существующий = ТаблицаПриемник.Найти(Код, "КодТовара");
Если Существующий = Неопределено Тогда
НоваяСтрока = ТаблицаПриемник.Добавить();
НоваяСтрока.КодТовара = Код;
НоваяСтрока.Цена = Цена;
НоваяСтрока.Поставщик = Поставщик;
НоваяСтрока.Приоритет = Приоритет;
Возврат Истина;
Иначе
// Если уже есть, сравниваем приоритеты
Если Приоритет < Существующий.Приоритет Тогда
Существующий.Цена = Цена;
Существующий.Поставщик = Поставщик;
Существующий.Приоритет = Приоритет;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецФункции
// Добавляем цены с приоритетами (меньше число = выше приоритет)
Для Каждого Товар Из ЦеныА Цикл
ДобавитьЕслиУникально(УникальныеЦены, Товар.КодТовара, Товар.Цена, Товар.Поставщик, 1);
КонецЦикла;
Для Каждого Товар Из ЦеныБ Цикл
ДобавитьЕслиУникально(УникальныеЦены, Товар.КодТовара, Товар.Цена, Товар.Поставщик, 2);
КонецЦикла;
// Вывод результата
Для Каждого Стр Из УникальныеЦены Цикл
Сообщить("Товар " + Стр.КодТовара + ": " + Стр.Цена +
" руб. (" + Стр.Поставщик + ")");
КонецЦикла;
КонецПроцедуры
Примечания
// Важные особенности объединения результатов запросов:
// 1. Метод Объединить() добавляет строки из второй таблицы в первую
// 2. Параметр УдалятьПовторяющиесяСтроки (Истина/Ложь) определяет, будут ли удаляться дубли
// 3. При объединении структуры колонок первой таблицы сохраняется
// 4. Для объединения таблиц с разной структурой требуется предварительное приведение
// 5. В языке запросов используется конструкция ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ
// 6. ОБЪЕДИНИТЬ автоматически удаляет дубли, ОБЪЕДИНИТЬ ВСЕ - сохраняет
// 7. При объединении больших таблиц через запрос производительность выше, чем в коде
// 8. Для FULL OUTER JOIN на таблицах значений эмулируйте через объединение ключей
// 9. После объединения часто требуется группировка или фильтрация
// 10. Типы колонок в объединяемых таблицах должны быть совместимы








