Пример использования объекта Схема запроса в реальном проекте
Разберём решение задачи реального проекта: контекст, логика решения, само решение. Рассмотрим возможности объекта СхемаЗапроса.
- Описание
- Подробнее
Описание
В статье рассмотрим пример использования объекта СхемаЗапроса в реальном проекте.
Контекст задачи проекта освещается с согласия Заказчика — ООО "ЭФМЕК РУС", за что ему огромное спасибо.
Проект англоязычный, поэтому интерфейс будет на английском языке.
Суть задачи:
- Работаем в агросекторе — выращиваем сельскохозяйственные культуры на полях фермерского хозяйства.
- Рассматриваемый процесс — планирование структуры посевных площадей агрономом. В ходе этого мероприятия определяется какая культура на каком поле и в какой сезон будет выращиваться.
- Выглядит это так:

- Наша задача организовать "Фильтр по предшественникам" (Filter by predecesor)

То есть надо показать только те поля, в которых соблюдалась последовательность выращивания.
Например, в 2021 растили Пшеницу (Wheat), в 2022 — кукурузу (Corn).
Результат отбора:

В результат попало только Field 3. Field 2 не попало, так как в 2021 на нём ничего не росло.
Отчет строится на базе документа "План выращивания" со следующей структурой метаданных:

Особенности
- На одну комбинацию Сезон/Поле может существовать только один План выращивания
- Выращиваемая культура (Номенклатура) хранится в табличной части
- Связано это с ситуацией Multiple-cropping. Когда на одном поле в сезоне одновременно растут несколько культур.
Посмотрим на форму фильтра:


На ней таблица (колонки Сезон, Номенклатура, КультураПоКлассификатору) и тумблер ТипОтбора (Число).
Тумблер задаёт режим ввода
- при значении 0 — вводим культуру (Номенклатура, Item)
- при значении 1 — вводим культуру по классификатору (отдельный справочник, реквизит Номенклатуры)
Нам надо получить только те поля, на которых соблюдалась последовательность выращивания.
Рассматриваем входные данные таблицы из приведённого выше примера: в 2021 — Пшеница, в 2022 — Кукуруза.
Результатом будет являться массив полей, удовлетворяющих данным таблицы.
Ясно, что результат надо получить одним пакетным запросом.
Подумаем над логикой запроса
- Для каждой строки таблицы формируем запрос, получающий поля сезона строки с учетом отбора по культуре/классификатору
- Полученные запросы объединяем
- Далее надо отобрать только те поля, которые будут присутствовать в каждом из запросов
- Имеем несколько запросов для объединения — количество равно количеству строк таблицы с заполненным отбором
- Всё, что нужно — это свернуть итоговый результат объединения и сравнить количество вхождений каждого поля с количеством строк с отбором.
- Для этих целей в запрос включим счетчик — число со значением 1.
- При свертывании будем суммировать по счетчику.
- Результат сворачивания отфильтруем по Сумма(Счетчик)=КоличествоСтрок
Переведём эти размышления в текст запроса.

Приведённый текст имеет "методологическую" ошибку. Сможете найти?
