Примеры объединения результатов запросов

Примеры объединения результатов запросов на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Объединение результатов двух запросов через Объединить

// Базовое объединение двух запросов с одинаковой структурой полей
Процедура ОбъединитьДваЗапроса()

    // Первый запрос - товары на складе А
    Запрос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. Типы колонок в объединяемых таблицах должны быть совместимы

Поделиться с друзьями
Smirnov code
Добавить комментарий