Ограничение количества выбираемых строк при соединении

01.02.12

Разработка - Механизмы платформы 1С

Иногда, при соединении, возникает необходимость ограничить количество выбираемых записей. О том, как это сделать...

Может, кому-то пригодится.

Есть две таблицы, в одной содержится список характеристик и предъявляемые по ним требования. В другой - список основных средств, их характеристик и те значения, которым они удовлетворяют.

 См. Рис1 и Рис2

Хm - характеристики

ЗХm - требуемые значения каждой характеристики

ОСp - основные средства

ЗXmОСp - значение определенной характеристики у определенного основного средства

 Необходимо присоединить к первой таблице вторую, по условию удовлетворения характеристикам. При этом, нужно выбирать не все строки из второй таблицы, а только определенное количество N основных средств для каждой характеристики. Т.е. не всего N, а N для первой характеристики, N - для второй и т.д. Т.е. стоит вопрос об ограничении выбираемых записей при соединении таблиц.

Таким образом, в итоге хотим получить подобную таблицу (если N = 2 и если предположить, что все указанные характеристики отвечают выставленным требованиям)

 См. Рис3

Стандартное и наиболее часто встречающееся решение проблемы - через создания в цикле запроса, в котором объединяется множество подзапросов, каждый из которых выбирает первые N для каждой характеристики.

Возникло желание придумать нечто более изящное. Получилось вот такое решение.

 

Запрос = Новый Запрос;
//объявляем менеджер временных таблиц
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
//сначала выберем только те ТС, чьи характеристики отвечают необходимым условиям
Запрос.Текст = "ВЫБРАТЬ
| ТЧ2.ОсновноеСредство КАК ОС,
| ТЧ1.Характеристика КАК Харка,
| ТЧ1.ЗначениеХарактеристики КАК ЗнХар
|ПОМЕСТИТЬ ТЗ
|ИЗ
| ТЧ1 КАК ТЧ1
| ЛЕВОЕ СОЕДИНЕНИЕ ТЧ2 КАК ТЧ2
| ПО ТЧ1.Характеристика = ТЧ2.Характеристика
| И ТЧ1.ЗначениеХарактеристики {условие} ТЧ2.ЗначениеХарактеристикиОС";
//вместо {условие} вставить то соответсвтие, которое ставиться задачей (больше, меньше, равно, между и т.п.)
Запрос.Выполнить();
//теперь собственно запрос, который отберет нам первые N записей при соединении
Запрос.Текст = "ВЫБРАТЬ
| ТЧ1.Характеристика КАК Характеристика,
| ТЧ2.ОС КАК ОС
|ИЗ
| ТЧ1 КАК ТЧ1
| ЛЕВОЕ СОЕДИНЕНИЕ ТЧ2 КАК ТЧ2
| ПО ТЧ1.Характеристика = ТЧ2.Характеристика
| И ТЧ1.ЗначениеХарактеристики {условие} ТЧ2.ЗначениеХарактеристикиОС
|ГДЕ
| ТЧ2.ОсновноеСредство В
| (ВЫБРАТЬ ПЕРВЫЕ N
| ТЗ.ОС
| ИЗ
| ТЗ
| ГДЕ
| ТЧ1.ЗначениеХарактеристики {условие} ТЗ.ЗнХар)";
//вместо {условие} вставить то соответсвтие, которое ставиться задачей (больше, меньше, равно, между и т.п.)
Результат = Запрос.Выполнить().Выгрузить();

ТЧ1 и ТЧ2 подставить справочники, документы и т.п.

P.S. Публикация первая, поэтому прошу прощения за недочеты в оформлении

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4574    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5301    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6425    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18487    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12100    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8841    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6284    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15995    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SiAl 76 02.02.12 19:11 Сейчас в теме
2. bulpi 215 08.02.12 13:10 Сейчас в теме
ИМХО, метод неправильный. Он сработал для этого конкретного примера, но он не универсальный. Дело в том, что используя "первые N" в конце запроса, ты отсекаешь и часть "полезных" записей второй таблицы. То есть условие "не больше N" будет выполнено. Но по некоторым записям первой таблицы будет присоединено меньше, чем N записей, хотя во второй таблице было достаточно записей, чтобы присоединить ровно N.

Минус не буду ставить, сам разберись.
Оставьте свое сообщение