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

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. Публикация первая, поэтому прошу прощения за недочеты в оформлении

См. также

Динамическое обновление - это зло?

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

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    27413    Infostart    83    

243

Совместимость работы со строками. Жизнь до 8.3.6 и после

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

Немного о совместимости со старыми версиям платформы 1С в работе со строками.

21.02.2020    8401    Infostart    25    

69

Эволюция расширения конфигурации

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

С каждым днем всё больше возможностей появляется в расширении конфигурации, но не все до сих пор работают даже на платформе 8.3.6! Давайте окунемся в историю появления и эволюции расширения конфигурации, чтобы знать и понимать, когда можно применить тот или иной функционал!

06.02.2020    26774    Xershi    51    

223

Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"

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

Переход на управляемые формы перевернул процесс разработки на 1С, заставив программистов менять привычные подходы к описанию логики работы интерфейса. Руководитель компании «Цифровой Кот» Юрий Лазаренко в своем докладе на конференции Infostart Event 2019 Inception рассказал о том, как устроены управляемые формы и как правильно работать с тонким клиентом платформы 1С:Предприятие.

23.12.2019    25143    TitanLuchs    23    

100

30 задач. Странных и не очень

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

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    50764    Infostart    65    

164

Фишечки-рюшечки

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

За годы работы с 1С собрался определенный багаж хитростей, который позволяет разрабатывать быстрее/эффективнее/качественнее. Поделюсь ими в данной статье.

06.11.2019    11204    mpeg1989    95    

66

ЧтениеДанных и ЗаписьДанных. Работа со строками

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

Использование потоков и двоичных данных для работы со строками.

04.10.2019    23851    Yashazz    16    

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

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