Как в запросе 1С присоединить дополнительный реквизит по условию, не размножая строки, если условие соединения не идентифицирует строку регистра полностью (1С: 8.1: Программисту)

Вопрос Как в запросе 1С присоединить дополнительный реквизит по условию, не размножая строки…
Ответ
Рассматриваемая задача может быть актуальна, когда требуется соединить данные двух регистров, причем набор условий соединения не полностью идентифицирует строку регистра, т.е. в результате соединения по данному условию в выборке может быть несколько «одинаковых» строк.
Допустим, есть две таблицы:

Таблица 1:

Реквизит 1
а
б
в

Таблица 2:

Реквизит 1 Реквизит 2
а 1
а 2
б 34
в 10
в 15

Требуется присоединить Реквизит 2 к Таблице 1, не размножая при этом строки, взяв случайным образом (т.е. любое) значение Реквизита 2 по условию равенства Реквизитов 1 таблицы 1 и 2.

Если написать запрос с Левым соединением:

|ВЫБРАТЬ
|             Таблица1. Реквизит1
|             Таблица2. Реквизит2
|ИЗ
|             Таблица1 КАК Таблица1
|                             ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
|                             ПО Таблица2. Реквизит1= Таблица1. Реквизит1

, то строки исходной таблицы «размножатся».

ВЫБРАТЬ РАЗЛИЧНЫЕ тут тоже не поможет, т.к. значения Реквизит 2 различные.

Свернуть результирующую таблицу по Реквизиту 1 тоже не получится, т.к. ни сумма, ни среднее арифметическое нам не подходит.

Чтобы решить эту задачу, можно использовать получение максимального значения «Реквизита 2». Метод подходит не только для числового значения этого реквизита, а и для любого другого. Но получим мы при этом, конечно не случайное значение из множества, а то, что система вычислит как макимальное. В большинстве случаев такое решение задачи полностью удовлетворит.

Вот запрос, решающий эту задачу:

|ВЫБРАТЬ
|             Таблица1. Реквизит1
|             МАКСИМУМ(Таблица2.Реквизит2) КАК Реквизит2
|ИЗ
|             Таблица1 КАК Таблица1
|                             ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК Таблица2
|                             ПО Таблица2. Реквизит1= Таблица1. Реквизит1
|СГРУППИРОВАТЬ ПО
|             Таблица1. Реквизит1

Однако, можно использовать и другой (не очень красивый) метод.

Запоминаем Таблицу 2 в ее копии, затем Таблицу 2 сворачиваем по Реквизиту 1 и затем перебором строк свернутой таблицы 2 и ее копии выбираем Реквизит2:

КопияТ2 = Таблица2.Скопировать(); // Запоминаем Таблицу 2 в ее копии
Таблица2.Свернуть("Реквизит1"); // Таблицу 2 сворачиваем по Реквизиту 1
Если Таблица2.Количество() <> КопияТ2.Количество() Тогда // проверим, может таблицы совпали, тогда присоединение будет один к одному и "изворачиваться" не надо
    Таблица2.Колонки.Добавить("Реквизит2");

    Для каждого СтрокаТаблицыТЗ Из Таблица2 Цикл
        Для каждого СтрокаТаблицыКопии Из КопияТ2 Цикл
            Если СтрокаТаблицыТЗ.Реквизит1  = СтрокаТаблицыКопии.Реквизит1 Тогда
                СтрокаТаблицыТЗ.Реквизит2   = СтрокаТаблицыКопии.Реквизит2;
                КопияТ2.Удалить(СтрокаТаблицыКопии); // строка свое отслужила, уберем ее из таблицы. чтобы снова не просматривать
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
Иначе // раз совпали, то просто восстановим таблицу
    Таблица2 = КопияТ2.Скопировать();
КонецЕсли;

Пишите, если найдете другой интересный метод решения. С удовольствием посмотрим.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *