Сложности в наложении запроса объединения в СКД
Проблема наложения отбора существовала во всех частях запроса объединения 8.3.13 – 8.3.17, когда СКД добавляет в секции «ГДЕ» NULL=&П. Данная проблема была исправлена в релизе платформы 8.3.18. (рис.1)

рис.1
Текущий релиз конфигурации «Комплексная автоматизация 2» версии 2.5.8.287 работает в режиме совместимости с версией 8.3.17, поэтому проблема там ещё проявляется. Хотя в версии 8.3.18 данная проблема решена, но в режиме совместимости 8.3.17 поведение не изменилось.
Итак.
Особенности наложения отборов в зависимости от версии системы компоновки данных
Отбор в объединении запросов 8.3.18 с отключенным режимом совместимости
Начнем с рассмотрения особенностей отбора в объединении запросов 8.3.18 с отключенным режимом совместимости.
В базе «Демонстрационное приложение» в консоли «Конструктор схема компоновки данных» используется набор данных «Запрос» (рис.2).

рис.2
Выбираются данные виртуальной таблицы «Продажи – Обороты» все поля измерений: «Покупатель», «Товар», «Сумма – Оборот». Эти данные объединяются с регистром накопления «Товарные запасы» и «Остатки». Здесь есть поля «Товар» и «Склад», а поле «Покупатель» отсутствует.
Пожалуйста, обратите внимание на то, что остатки нужно получить на определенную дату: на период остатков, а не на конец периода (рис.3).

рис.3
Результат объединения помещается во временную таблицу «Все вместе» и просто выбираются данные.
Оба поля «Остаток» и «Сумма – Продажи» сделаны ресурсом, и в настройке в виде группировки по полю «Товар» выбираются оба ресурса: «Сумма – Продажи» и «Сумма – Остаток». Здесь отбор установлен по полю «Покупатель».
Поле «Покупатель» присутствует только в одном запросе «Объединение», то есть там, где есть «Продажи» (рис.4).

рис.4
Если посмотреть на результат, то отбор по «Покупателю» нам показывает продажи только по одному из покупателей, а остатки показываются все (рис.5).

рис.5
В макете для табличного документа, который сгенерировал компоновщик макетов, в запросе «Объединение» наложен отбор по полю «Покупатель». В выборке по товарным запасам отбора по полю «Покупатель» нет. В результирующем запросе нет никаких условий секции «ГДЕ» (рис.6).

рис.6
Обратим внимание на параметры. Параметр П2 – это параметр «Период остатков». Он вычисляется как параметр «Конец периода + 1 секунда».
В настройках схемы накладки параметра это выглядит следующим образом: параметр «Период остатков» (в нём включено ограничение доступности) и используется функция выражение СКД: ДобавитьКДате(&КонецПериода, «Секунда», 1), то есть добавить к дате одну секунду (рис.7).

рис.7
Итак, на платформе версии 8.3.18 с отключенным режимом совместимости все работает четко (рис.8).

рис.8
Далее следует сохранить получившиеся отчёты и можно сменить режим совместимости.
Введение в отбор в объединении запросов 8.3.17
Для установки режима совместимости версии 8.3.17, следует еще раз открыть консоль «Системы компоновки данных» по той же схеме. При ее формировании получается уже другой результат (рис.9).

рис.9
Проверив запрос, который сгенерировал компоновщик макета, можно увидеть, что в объединении запросов также наложен отбор по полю «Покупатель». Во втором запросе объединение в секции «ГДЕ» появилось условие: NULL=П3. Благодаря этому условию часть данных об остатках не выводится. Чтобы решить эту проблему, нужно в настройках набора данных «Запрос» отключить флаг «Автозаполнение». Для этого следует доработать текст запроса.
Потребуется указать все параметры и указать СКД, что доступен отбор по полю «Покупатель» в параметрах виртуальной таблицы (рис.10).

рис.10
И в последнем запросе пакета следует указать, что все поля попадают в выбранные поля и то, что можно накладывать отбор на поля «Остаток» и «Сумму продажи» (рис.11).

рис.11
После этого отключается флаг «Автозаполнение» (рис.12).

рис.12
Если проверить, то ресурсы никуда не делись, все параметры остались. Результат получился такой же, как в режиме совместимости 8.3.18. (рис.13).

рис.13
Проверив макет табличного документа, который сгенерировал компоновщик макета, можно увидеть, что отбор в запросе, где выбираются «Продажи», присутствует в параметрах виртуальной таблицы. Отбора в секции «ГДЕ» в запросе «Товарные запасы — Остатки» – нет (рис.14).

рис.14
Значит, отключив флаг «Автозаполнение» в наборе данных «Запрос», и прописав точечно где можно устанавливать отборы, а где нет, эту проблему можно решить.
Далее, сохранив отчёты, можно установить режим совместимости в 8.3.13.
Возможности отбора в объединении запросов 8.3.13
В версии платформы 8.3.13 сформируем отчет, убедившись, что флаг «Автозаполнение» отключен. Определено, что отбор можно накладывать только в параметрах виртуальной таблицы. Во втором запросе объединение в секции «ГДЕ» никакие параметры не подразумеваются. Отчет формируется с некорректным результатом (рис.15).

рис.15
Если проверить макет для табличного документа, то можно увидеть, что в параметрах виртуальной таблицы «Продажи — Обороты» отбор установлен. В запросе, где выбираются «Товарные запасы – Остатки», появляется отбор в секции «ГДЕ» (рис.16).

рис.16
Рассмотрим, как обойти отбор в секции «ГДЕ», если конфигурация работает в режиме совместимости 8.3.13, а режим совместимости менять нельзя.
Требуемый отбор устанавливается в тексте запроса, когда выбираются данные из виртуальной таблицы «Продажи» (рис.17).

рис.17
Поэтому в конструкторе схемы компоновки данных нужно модифицировать текст запроса. Сначала следует выбрать данные из виртуальной таблицы «Продажи – Обороты» в отдельном запросе: «Продажи – Обороты», «Покупатель», «Товар», «Сумма – Оборот» (рис.18).

рис.18
Скомпоновать их во временную таблицу «Продажи» (рис.19).

рис.19
Эту задачу можно решить с использованием флага «Автозаполнение».
Итак, получили продажи. В запросе «Объединение» следует заменить виртуальную таблицу «Продажи» на временную таблицу «Продажи». Также нужно взять данные «Сумма – Оборот». Объединение можно назвать «Сумма – Продажи».
В итоге формируется временная таблица «Всё вместе» (рис.20).

рис.20
Далее устанавливается флаг «Автозаполнение» (рис.21).

рис.21
В запросе, который сгенерировал компоновщик макета: в первой временной таблице «Продажи» выбираются данные по полю с отбором «Покупатель» (рис.22).

рис.22
Далее выбираются данные из этой временной таблицы, которые объединяются с запросом «Товарные запасы – Остатки». Здесь уже не устанавливается отбор по полю «Покупатель». И в финальном запросе тоже нет отбора в секции «ГДЕ» (рис.23).

рис.23
В итоге получился правильный результат (рис.24).

рис.24
Краткие итоги по различиям наложения отбора на несуществующие поля в разных версиях платформы
Подводя итог, есть смысл отметить, что при использовании платформы в режиме совместимости с 8.3.13 по 8.3.17, можно обойти особенности наложения отборов на несуществующие поля запросов.
При этом, если в запросах присутствует объединение выборок из нескольких таблиц и возникает ситуация, в которой компоновщик макета накладывает отбор на поле, отсутствующее в одном из запросов на объединение, оптимально поступить следующим образом:
— предварительно выбрать данные из той таблицы, где предполагается накладывать отбор по полю, которого не будет в запросе «Объединение»;
— затем сложить данные во временную таблицу;
— а дальше производить выборку объединения запросов, объединяя данные временной таблицы, в которой будет наложен отбор, с остальными данными.
Оцените статью