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

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

SALE! %

Мастера заполнения Поиск данных База данных Инструментарий разработчика Корректировка данных Универсальные функции Механизмы платформы 1С Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

5000 4000 руб.

25.02.2026    1944    9    1    

11

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

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    30168    TitanLuchs    106    

149

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    16466    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    19662    user2122906    9    

66

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    33928    user2122906    12    

61

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    30644    dsdred    100    

147

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    27174    bayselonarrend    22    

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

Минус не буду ставить, сам разберись.
Для отправки сообщения требуется регистрация/авторизация