Как сделать отбор в объединении запросов
-
В этой статье по СКД мы с вами подробно разберем, как обойти особенности наложения отборов на несуществующие поля запросов в наборе данных объединение 1С версий 8.3.13 – 8.3.17.
Сложности в наложении запроса объединения в СКД
Проблема наложения отбора существовала во всех частях запроса объединения 8.3.13 – 8.3.17, когда СКД добавляет в секции «ГДЕ» NULL=&П. Данная проблема была исправлена в релизе платформы 8.3.18. (рис.1)
Текущий релиз конфигурации «Комплексная автоматизация 2» версии 2.5.8.287 работает в режиме совместимости с версией 8.3.17, поэтому проблема там ещё проявляется. Хотя в версии 8.3.18 данная проблема решена, но в режиме совместимости 8.3.17 поведение не изменилось.
Итак.
Особенности наложения отборов в зависимости от версии системы компоновки данных
Отбор в объединении запросов 8.3.18 с отключенным режимом совместимости
Начнем с рассмотрения особенностей отбора в объединении запросов 8.3.18 с отключенным режимом совместимости.
В базе «Демонстрационное приложение» в консоли «Конструктор схема компоновки данных» используется набор данных «Запрос» (рис.2).
Выбираются данные виртуальной таблицы «Продажи – Обороты» все поля измерений: «Покупатель», «Товар», «Сумма – Оборот». Эти данные объединяются с регистром накопления «Товарные запасы» и «Остатки». Здесь есть поля «Товар» и «Склад», а поле «Покупатель» отсутствует.
Пожалуйста, обратите внимание на то, что остатки нужно получить на определенную дату: на период остатков, а не на конец периода (рис.3).
Результат объединения помещается во временную таблицу «Все вместе» и просто выбираются данные.
Оба поля «Остаток» и «Сумма – Продажи» сделаны ресурсом, и в настройке в виде группировки по полю «Товар» выбираются оба ресурса: «Сумма – Продажи» и «Сумма – Остаток». Здесь отбор установлен по полю «Покупатель».
Поле «Покупатель» присутствует только в одном запросе «Объединение», то есть там, где есть «Продажи» (рис.4).
Если посмотреть на результат, то отбор по «Покупателю» нам показывает продажи только по одному из покупателей, а остатки показываются все (рис.5).
В макете для табличного документа, который сгенерировал компоновщик макетов, в запросе «Объединение» наложен отбор по полю «Покупатель». В выборке по товарным запасам отбора по полю «Покупатель» нет. В результирующем запросе нет никаких условий секции «ГДЕ» (рис.6).
Обратим внимание на параметры. Параметр П2 – это параметр «Период остатков». Он вычисляется как параметр «Конец периода + 1 секунда».
В настройках схемы накладки параметра это выглядит следующим образом: параметр «Период остатков» (в нём включено ограничение доступности) и используется функция выражение СКД: ДобавитьКДате(&КонецПериода, «Секунда», 1), то есть добавить к дате одну секунду (рис.7).
Итак, на платформе версии 8.3.18 с отключенным режимом совместимости все работает четко (рис.8).
Далее следует сохранить получившиеся отчёты и можно сменить режим совместимости.
Введение в отбор в объединении запросов 8.3.17
Для установки режима совместимости версии 8.3.17, следует еще раз открыть консоль «Системы компоновки данных» по той же схеме. При ее формировании получается уже другой результат (рис.9).
Проверив запрос, который сгенерировал компоновщик макета, можно увидеть, что в объединении запросов также наложен отбор по полю «Покупатель». Во втором запросе объединение в секции «ГДЕ» появилось условие: NULL=П3. Благодаря этому условию часть данных об остатках не выводится. Чтобы решить эту проблему, нужно в настройках набора данных «Запрос» отключить флаг «Автозаполнение». Для этого следует доработать текст запроса.
Потребуется указать все параметры и указать СКД, что доступен отбор по полю «Покупатель» в параметрах виртуальной таблицы (рис.10).
И в последнем запросе пакета следует указать, что все поля попадают в выбранные поля и то, что можно накладывать отбор на поля «Остаток» и «Сумму продажи» (рис.11).
После этого отключается флаг «Автозаполнение» (рис.12).
Если проверить, то ресурсы никуда не делись, все параметры остались. Результат получился такой же, как в режиме совместимости 8.3.18. (рис.13).
Проверив макет табличного документа, который сгенерировал компоновщик макета, можно увидеть, что отбор в запросе, где выбираются «Продажи», присутствует в параметрах виртуальной таблицы. Отбора в секции «ГДЕ» в запросе «Товарные запасы — Остатки» – нет (рис.14).
Значит, отключив флаг «Автозаполнение» в наборе данных «Запрос», и прописав точечно где можно устанавливать отборы, а где нет, эту проблему можно решить.
Далее, сохранив отчёты, можно установить режим совместимости в 8.3.13.
Возможности отбора в объединении запросов 8.3.13
В версии платформы 8.3.13 сформируем отчет, убедившись, что флаг «Автозаполнение» отключен. Определено, что отбор можно накладывать только в параметрах виртуальной таблицы. Во втором запросе объединение в секции «ГДЕ» никакие параметры не подразумеваются. Отчет формируется с некорректным результатом (рис.15).
Если проверить макет для табличного документа, то можно увидеть, что в параметрах виртуальной таблицы «Продажи — Обороты» отбор установлен. В запросе, где выбираются «Товарные запасы – Остатки», появляется отбор в секции «ГДЕ» (рис.16).
Рассмотрим, как обойти отбор в секции «ГДЕ», если конфигурация работает в режиме совместимости 8.3.13, а режим совместимости менять нельзя.
Требуемый отбор устанавливается в тексте запроса, когда выбираются данные из виртуальной таблицы «Продажи» (рис.17).
Поэтому в конструкторе схемы компоновки данных нужно модифицировать текст запроса. Сначала следует выбрать данные из виртуальной таблицы «Продажи – Обороты» в отдельном запросе: «Продажи – Обороты», «Покупатель», «Товар», «Сумма – Оборот» (рис.18).
Скомпоновать их во временную таблицу «Продажи» (рис.19).
Эту задачу можно решить с использованием флага «Автозаполнение».
Итак, получили продажи. В запросе «Объединение» следует заменить виртуальную таблицу «Продажи» на временную таблицу «Продажи». Также нужно взять данные «Сумма – Оборот». Объединение можно назвать «Сумма – Продажи».
В итоге формируется временная таблица «Всё вместе» (рис.20).
Далее устанавливается флаг «Автозаполнение» (рис.21).
В запросе, который сгенерировал компоновщик макета: в первой временной таблице «Продажи» выбираются данные по полю с отбором «Покупатель» (рис.22).
Далее выбираются данные из этой временной таблицы, которые объединяются с запросом «Товарные запасы – Остатки». Здесь уже не устанавливается отбор по полю «Покупатель». И в финальном запросе тоже нет отбора в секции «ГДЕ» (рис.23).
В итоге получился правильный результат (рис.24).
Краткие итоги по различиям наложения отбора на несуществующие поля в разных версиях платформы
Подводя итог, есть смысл отметить, что при использовании платформы в режиме совместимости с 8.3.13 по 8.3.17, можно обойти особенности наложения отборов на несуществующие поля запросов.
При этом, если в запросах присутствует объединение выборок из нескольких таблиц и возникает ситуация, в которой компоновщик макета накладывает отбор на поле, отсутствующее в одном из запросов на объединение, оптимально поступить следующим образом:
— предварительно выбрать данные из той таблицы, где предполагается накладывать отбор по полю, которого не будет в запросе «Объединение»;
— затем сложить данные во временную таблицу;
— а дальше производить выборку объединения запросов, объединяя данные временной таблицы, в которой будет наложен отбор, с остальными данными.
Оцените статью
Читайте также: